For a little more than a year now, I’ve been meaning to write a script to rename all of the files in my iTunes library so that they’re in proper English title case. In large part, this project was inspired by reading John Gruber’s post about a Perl script that he’d written to convert text strings into title case programmatically. After reading Gruber’s post, I grabbed a copy of Sam Souder’s translation of Gruber’s Title Case script into Ruby and set about trying to use it as part of a home-grown Ruby script to clean up my iTunes library. During my first pass, I tried to combine Sam’s convenient utility method with RubyCocoa to produce a script that could access the iTunes methods directly and rename my files automatically without editing the MP3 files directly. Unfortunately, the RubyCocoa documentation was too sparse at the time for me to figure out the relevant method calls to be making.
Thankfully, I spent some time this week reading the MacRuby documentation and realized in the process how to write my desired script. The results are now on GitHub. The only original bit of code is below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #!/usr/bin/macruby # We iterate over every track, stripping bounding whitespace and putting things into proper title case. require 'titlecase' framework 'cocoa' load_bridge_support_file 'ITunes.bridgesupport' framework("ScriptingBridge") itunes = SBApplication.applicationWithBundleIdentifier("com.apple.itunes") music_playlist_tracks = itunes.sources.objectWithName("Library").userPlaylists.objectWithName("Music").fileTracks music_playlist_tracks.each do |track| old_artist = track.artist new_artist = track.artist.strip.titlecase if old_artist != new_artist track.artist = new_artist puts "Artist: #{old_artist} => #{new_artist}" end old_album = track.album new_album = track.album.strip.titlecase if old_album != new_album track.album = new_album puts "Album: #{old_album} => #{new_album}" end old_name = track.name new_name = track.name.strip.titlecase if old_name != new_name track.name = new_name puts "Name: #{old_name} => #{new_name}" end end |
Outside of this little snippet of MacRuby code that I had to write, I made two small changes to Sam Souder’s original code:
- I defined a
titlecasemethod for theNSStringclass rather than theStringclass. - I pulled the list of English prepositions out of the main code and put it into a separate YAML file to make it easier for a non-programmer to edit the list.
I know from experience with checking the results in a half gleeful and half paranoid frenzy that this code works properly on my own two machines, both of which are running MacRuby 0.5. That said, I won’t vouch for the reliability of this program in any way. If you notice any bugs, please do let me know, so that I can fix my own iTunes library with a revised version of the script.
How did you generate the iTunes Bridge Support XML file – I found the gen_bridge_metadata program, but it takes a framework as an argument
I used the two following steps from the MacRuby tutorial, which you can find at http://www.macruby.org/documentation/tutorial.html
sdef /Applications/iTunes.app | sdp -fh --basename ITunes
gen_bridge_metadata -c '-I.' ITunes.h > ITunes.bridgesupport
Hi there,
I am trying to contact you but can’t seem to find your e-mail.
Please e-mail me at:
tal.galili@gmail.com
(and consider adding a “contact me” page to your blog)
Best wishes,
Tal
Works like a charm. Thanks for sharing!
Jed