openmind ☃   October 19, 2008  ☃  Ruby: Audio Filename Cleaner With Atomic Copy  (, )

Update: Mon Feb 9 05:38:35 CST 2009: Some minor changes, cleaned up the code

#!/usr/bin/env ruby

%w[rubygems ftools digest/md5].each{|lib| require lib}

#Dir.glob("*.{mp3,flac,mp4,shn,mpc,wav}").each do |name|
Dir.glob("*").each do |name|
  # downcase all letters and replace the following char 
  # classes with an underscore:
  #   whitespace
  #   parens
  #   semi-colons
  #   dashes
  #   brackets
  #   single spaces
  nom = 
    name.gsub(/([A-Z])/){ |letter| 
      letter.downcase
    }                                 \
    .gsub(/\s|\(|\)|;|-|\[|\]/,'_')   \
    .gsub(/__+/,'_')                  \
    .gsub(/_\./,'.')                  \
    .gsub(/'/,'')

  if(nom != name)
    digest = Digest::MD5.hexdigest(File.read(name))
    print "#{name} => #{nom} . . . "
    File.copy("#{name}", "#{nom}")
    digest_copy = Digest::MD5.hexdigest(File.read("#{nom}"))

    if(digest == digest_copy)
      puts "OK!"
      File.unlink("#{name}")
    else
      File.unlink("#{nom}")
      puts "ERROR:  #{digest} != #{digest_copy}! ABORTED"
      exit
    end
  end
end

blog comments powered by Disqus