Ich digitalisiere gerade meine Kassettensammlung. Da hilft es, sich das aufwändige Titeleingeben zu automatisieren.
Voila: mein Lieder-Erkenn-Skript (basierend auf songrec)
Setup: Install gem „zaru“ first!
require 'zaru'
TIMEOUT = 12 #seconds
semaphore = Mutex.new
rename_jobs = []
threads = []
# setup parallel threads to recognize songs - only for not renamed files
files = Dir["**/*"].select{|e|[".flac",".opus",".wav",".ogg",".mp3",".aac"].include?(File.extname(e).downcase)} # only audio files
files.each_with_index do |f, i|
rename_jobs << []
threads << Thread.new do
new_name = File.dirname(f)+"/"
new_name = File.join(File.dirname(f), $1) if f =~ /^([abcd]?\d+)/i
new_name = File.join(File.dirname(f), $1) if f =~ /^(track\s*\d+)/i
name = `songrec recognize \"#{f}\"`.strip
new_name += " - #{Zaru.sanitize!(name)}#{File.extname(f)}"
semaphore.synchronize { rename_jobs[i] = [f , new_name] }
end
end
# wait smart and timeout when number of recognized songs doesn't go up
old_num = 0
timeout = 0
while(true) do
break unless rename_jobs.include?([])
break if timeout > TIMEOUT
sleep 1
num_recog = rename_jobs.select{|e|e!=[]}.size
if num_recog != old_num
timeout = 0
old_num = num_recog
else
timeout += 1
end
puts "#{num_recog} of #{rename_jobs.size} songs recognized yet."
end
threads.each{|t|t.exit unless t.status} # end remaining searches
puts "Preview:"
rename_jobs.sort.each {|e| p e}
puts "\nEnter y to continue"
s = gets.strip
if s == 'y'
# finally do the renaming
c = 0
rename_jobs.each do |r|
if r != []
File.rename(r[0], r[1])
c += 1
end
end
puts "#{c} files renamed."
end