Saturday, February 4, 2012

Renaming MP3 files with ruby


Recently, my friend accidentally deleted my files in my external hard drive. Recovering process is quite time consuming since there is a lot of files in there. To make it short, I finally got back most of my mp3 collection, but the file naming need some restoration.

$ ls
total 13026192
drwxr-xr-x  1566 root  staff     53244 Feb  4 20:23 .
drwxr-xr-x     3 root  staff       102 Feb  4 20:18 ..
-rw-r--r--     1 root  staff   5980962 May 24  2011 f100018967.mp3
-rw-r--r--     1 root  staff   2331842 May 24  2011 f100248623.mp3
-rw-r--r--     1 root  staff   1072506 May 24  2011 f100379151.mp3
-rw-r--r--     1 root  staff   1464448 May 24  2011 f100479767.mp3
-rw-r--r--     1 root  staff   1083520 May 24  2011 f100743063.mp3
-rw-r--r--     1 root  staff   3950443 May 24  2011 f100938119.mp3
-rw-r--r--     1 root  staff   4244632 May 24  2011 f101036079.mp3
-rw-r--r--     1 root  staff   3887104 May 24  2011 f101232487.mp3
-rw-r--r--     1 root  staff   4339809 May 24  2011 f101396631.mp3
-rw-r--r--     1 root  staff   4583424 May 24  2011 f101527175.mp3
-rw-r--r--     1 root  staff    147968 May 24  2011 f101727759.mp3
...
...

$ file f100743063.mp3 
f100743063.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, 
layer III, v1, 128 kbps, 44.1 kHz, JntStereo


$ hexdump -C f95958423.mp3 | head -n 8
00000000  49 44 33 03 00 00 00 00  1f 76 54 43 4f 4e 00 00  |ID3......vTCON..|
00000010  00 05 00 00 00 28 31 32  29 43 4f 4d 4d 00 00 00  |.....(12)COMM...|
00000020  0d 00 00 00 65 6e 67 00  50 41 52 4b 2d 45 4e 47  |....eng.PARK-ENG|
00000030  54 49 54 32 00 00 00 14  00 00 00 54 69 6b 75 73  |TIT2.......Tikus|
00000040  2d 74 69 6b 75 73 20 6b  61 6e 74 6f 72 00 54 50  |-tikus kantor.TP|
00000050  45 31 00 00 00 0b 00 00  00 49 77 61 6e 20 46 61  |E1.......Iwan Fa|
00000060  6c 73 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |ls..............|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

Since some of the mp3 files still preserve its mp3 tag, I decided to make some tools to grep the tag and rename the file according to that tag.

$ gem install ruby-mp3info

#!/usr/bin/env ruby
# You need to require this..
require 'rubygems'
require 'mp3info'

# This variable will hold your first argument as directory
# that contains mp3 files
dir = ARGV[0]
dir = File.expand_path(dir)

# Scan for files with .mp3 extension
mp3_list =  Dir.glob("#{dir}/*.mp3")

# Initialize variable 'artist' and 'song'
artist = ''
song = ''

# Loop all the list of files inside the array
mp3_list.each do |mp3_file|
        Mp3Info.open(mp3_file) do |mp3|
                if mp3.tag.artist.nil?
                  # If artist tag not found, set as 'Unknown'
                        artist =  "Unknown"
                else
                  # If found, assign to variable artist.
                  # replace character '/' to '\' to avoid
                  # problem in renaming the file.
                        artist = mp3.tag.artist.gsub(/\//,"\\")
                end

                if mp3.tag.title.nil?
                  # If title tag not found, set as 'Unknown'
                        song =  "Unknown"
                else
                  # If found, assign to variable song.
                  # replace character '/' to '\' to avoid
                  # problem in renaming the file.
                        song =  mp3.tag.title.gsub(/\//,"\\")
                end

    # combine as a new path
                new_name = "#{dir}/#{artist} - #{song}#{File.extname(mp3_file)}"

                unless mp3_file == new_name
                  # If looping filename != newly combined path,
                  # rename the file
                        puts new_name
                        File.rename(mp3_file, new_name)
                end
        end
end


Credit: http://ruby-mp3info.rubyforge.org/