views:

338

answers:

2

Are there any good solutions for capturing events from within iTunes?

I'd like to build a plugin that sits inside of iTunes and respondes to rating changes for particular songs. For Windows they have an SDK that I haven't delved into yet, but I'd like to find something for Mac too.

Any suggestions?

+2  A: 

As far as I know, Apple provides a free (as in zero-cost) SDK for iTunes Visual Plug-Ins for both OS X and Windows. If you can't get what you need through that, you could always use iTunes Apple Events scripting interface to monitor via polling from another OS X app using an OSA-compatible interface such as AppleScript or appscript with Python, Ruby, or Objective-C. That may not be what you'd like but it is documented and supported.

For example, with py-appscript, here's how to access the current track and the those in the recently played smartlist:

>>> from appscript import *
>>> it = app('iTunes')
>>> it.current_track.rating()  # 40 == 2 stars
40
>>> len(it.playlists['Recently Played'].tracks())
80
>>> it.playlists['Recently Played'].tracks[1].rating()
40
>>> it.playlists['Recently Played'].tracks[1].rating.set(to=100)
>>> it.playlists['Recently Played'].tracks[1].rating()  # 100 = 5 stars
100

It's also possible to filter on various metadata fields (open the iTunes.app scripting definition in the AppleScript Script Editor to browse):

>>> import datetime
>>> an_hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1)
>>> it.playlists['Library'].tracks[its.modification_date >= an_hour_ago]()
[app(u'/Applications/iTunes.app').sources.ID(45).library_playlists.ID(49347).file_tracks.ID(72017)]

But note that changes to ratings do not appear to affect the modification date.

Ned Deily
A: 

Mac iTunes emits distributed notifications on track changes and a few other events of significant interest. I doubt it sends notifications for minor changes to track info, however. As Ned says, iTunes' plugin support is limited to visualizers, so your other options would be:

  1. periodically polling from an external process, although that's going to cost both you and iTunes if the user's playlist is large

  2. maybe look into using PreFab UI Actions to glom onto iTunes' UI widgets and trigger AppleScripts

  3. see if you can attach an FSEvent notification to the iTunes Music Library.xml file that iTunes keeps in the user's music library folder. Assuming iTunes updates that file immediately on settings changes, you could probably figure out from there what has changed since last time.

None of which are ideal, but the sort of plugin-based extensibility you're talking about is really pretty rare amongst Mac apps, so you're probably going to have to kludge it one way or another, or else rethink your needs.

has