#!/usr/bin/env ruby # Run to create a playlist named "today's tunes". The playlist is # populated with tracks selected because the first character of their # names begins with a randomly selected letter or digit. For example, # my list today begins like this: # Galang # Gamma Ray # Gary Stomp # Gear require 'osx/cocoa' include OSX OSX.require_framework 'ScriptingBridge' PLAYLIST_NAME = "today's tunes" def main todays_tunes = make_empty_playlist tracks = tracks_beginning_with(some_random_character, all_songs) tracks.each do | track | track.duplicateTo(todays_tunes) end end def make_empty_playlist ensure_no_playlist(PLAYLIST_NAME) p = ITunesPlaylist.alloc.initWithProperties({'name' => PLAYLIST_NAME}) # TODO: why does following fail? # LIBRARY.userPlaylists.addObject(p) LIBRARY.userPlaylists.insertObject_atIndex(p,0) p.shuffle = true p end def tracks_beginning_with(letter, tracks) tracks.find_all do | track | name = if starts_with_qualifier?(track.name) phrase_tail(track.name) else track.name end /^#{letter}/i =~ name end end def ensure_no_playlist(name) p = LIBRARY.playlists.objectWithName(name) p.delete if p.exists == 1 end def all_songs LIBRARY.playlists.objectWithName('Library').tracks end def some_random_character possibilities = ('a'..'z').to_a + ('0'..'9').to_a possibilities[rand(possibilities.length)] end # Works with either a NSCFString or a string. # TODO: Change tests to indicate that? def starts_with_qualifier?(name) name =~ /^the\s/i || name =~ /^an\s/i || name =~ /^a\s/i end def phrase_tail(name) name.gsub(/^\w+\s+/, '') end def bapp(bundle_name) SBApplication.applicationWithBundleIdentifier(bundle_name) end ITUNES = bapp('com.apple.iTunes') LIBRARY = ITUNES.sources.objectWithName('Library') if $0 == __FILE__ main end