Skip to content

Commit

Permalink
add current_track, player_state
Browse files Browse the repository at this point in the history
  • Loading branch information
mislav committed Feb 15, 2011
1 parent e5a9273 commit c907f70
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 68 deletions.
18 changes: 15 additions & 3 deletions README.md
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -4,15 +4,27 @@ Prerequisites: [MacRuby](http://www.macruby.org/)


Example usage: Example usage:


favorites = ITunesManager.find_or_create_playlist 'Favorites' ITunesManager.app.run

# start playing at the beginning
ITunesManager.music.playOnce(false)


track = ITunesManager.music.fileTracks.first ITunesManager.player_state #=> :playing

ITunesManager.app.playpause
ITunesManager.player_state #=> :paused


# see iTunes.h under "@interface iTunesTrack" for more properties track = ITunesManager.current_track

# for more properties, see iTunes.h under "@interface iTunesTrack"
track.name track.name
track.artist track.artist
track.album track.album

# playlist management
favorites = ITunesManager.find_or_create_playlist 'Favorites'


track = ITunesManager.music.fileTracks.first
favorites << track favorites << track


favorites.add ITunesManager.music.search('daft punk') favorites.add ITunesManager.music.search('daft punk')
Expand Down
147 changes: 82 additions & 65 deletions itunes.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -2,11 +2,89 @@
framework 'Foundation' framework 'Foundation'
framework 'ScriptingBridge' framework 'ScriptingBridge'


SBApplication.applicationWithBundleIdentifier('com.apple.itunes') module ITunesManager
def self.app
@app ||= SBApplication.applicationWithBundleIdentifier('com.apple.itunes').tap do
# $ sdef /Applications/iTunes.app | sdp -fh --basename iTunes
# $ gen_bridge_metadata -c '-I.' iTunes.h > iTunes.bridgesupport
load_bridge_support_file 'iTunes.bridgesupport'
end
end


# $ sdef /Applications/iTunes.app | sdp -fh --basename iTunes # trigger loading bridge support file
# $ gen_bridge_metadata -c '-I.' iTunes.h > iTunes.bridgesupport self.app
load_bridge_support_file 'iTunes.bridgesupport'
def self.library
@library ||= app.sources['Library']
end

def self.music
library.userPlaylists['Music']
end

PlayerStates = {
ITunesEPlSStopped => :stopped,
ITunesEPlSPlaying => :playing,
ITunesEPlSPaused => :paused,
ITunesEPlSFastForwarding => :fast_forwarding,
ITunesEPlSRewinding => :rewinding
}

def self.player_state
PlayerStates[app.playerState]
end

def self.current_track
ensure_found app.currentTrack
end

def self.find_folder(name)
ensure_found library.playlists[name]
end

def self.find_or_create_folder(name)
folder = find_folder name

if folder
raise %(iTunes item "#{folder.name}" exists but is not a folder) unless folder.folder?
folder
else
folder = ITunesFolderPlaylist.alloc.initWithProperties(name: name)
library.playlists.addObject(folder)
library.playlists[name]
end
end

def self.find_playlist(name)
ensure_found library.userPlaylists[name]
end

def self.find_or_create_playlist(name, folder = nil)
playlist = find_playlist name

unless playlist
playlist = ITunesUserPlaylist.alloc.initWithProperties(name: name)
library.userPlaylists.addObject(playlist)
playlist = library.userPlaylists[name]
end

if folder
folder = find_or_create_folder(folder) if String === folder
playlist.moveTo(folder) unless folder == playlist.parent
end

playlist
end

class << self
private
def ensure_found(item)
# work around the fact that iTunesItem lookups will often
# return an object regardless of whether it actually exists
item.id == 0 ? nil : item
end
end
end


class SBElementArray class SBElementArray
def [](value) def [](value)
Expand Down Expand Up @@ -69,64 +147,3 @@ def inspect
end end
end end
end end

module ITunesManager
def self.app
SBApplication.applicationWithBundleIdentifier('com.apple.itunes')
end

def self.library
@library ||= app.sources['Library']
end

def self.music
library.userPlaylists['Music']
end

def self.find_folder(name)
ensure_found library.playlists[name]
end

def self.find_or_create_folder(name)
folder = find_folder name

if folder
raise %(iTunes item "#{folder.name}" exists but is not a folder) unless folder.folder?
folder
else
folder = ITunesFolderPlaylist.alloc.initWithProperties(name: name)
library.playlists.addObject(folder)
library.playlists[name]
end
end

def self.find_playlist(name)
ensure_found library.userPlaylists[name]
end

def self.find_or_create_playlist(name, folder = nil)
playlist = find_playlist name

unless playlist
playlist = ITunesUserPlaylist.alloc.initWithProperties(name: name)
library.userPlaylists.addObject(playlist)
playlist = library.userPlaylists[name]
end

if folder
folder = find_or_create_folder(folder) if String === folder
playlist.moveTo(folder) unless folder == playlist.parent
end

playlist
end

class << self
private
def ensure_found(playlist)
# work around the fact that playlist lookup will return an object
# regardless of whether it actually exists
playlist.specialKind == 0 ? nil : playlist
end
end
end

0 comments on commit c907f70

Please sign in to comment.