import pythoncom, win32com.client, time

def main():
    print 'attaching to iTunes...'
    iTunes = win32com.client.gencache.EnsureDispatch("iTunes.Application")
    print 'registering for events...'
    iTunesEvents = win32com.client.WithEvents(iTunes, ITunesEvents)
    
    print "events:"
    while 1:
        time.sleep(1)
        pythoncom.PumpWaitingMessages()
        
        if iTunesEvents.quitting:
            print 'quitting...'
            del iTunesEvents
            del iTunes
            break
    
class ITunesEvents:
    
    def __init__(self):
        self.quitting = False
        self.disabled = False
        self.current_track = None
        
    def OnPlayerPlayEvent(self, track):
        self.current_track = win32com.client.CastTo(track, 'IITTrack')
        
        print "now playing:", self.current_track.Name, "-", \
                              self.current_track.Artist, "-", \
                              self.current_track.Album
       
    def OnPlayerStopEvent(self, track):
        self.current_track = None
        
        track = win32com.client.CastTo(track, 'IITTrack')
        print "stopping:", track.Name, "-", \
                           track.Artist, "-", \
                           track.Album
        
    def OnQuittingEvent(self):
        self.quitting = True
       
    def OnCOMCallsDisabledEvent(self, reason):
        self.disabled = True
       
    def OnCOMCallsEnabledEvent(self):
        self.disabled = False
    
    def OnDatabaseChangedEvent(self, deletedObjectIDs, changedObjectIDs):
        pass
       
    def OnPlayerPlayingTrackChangedEvent(self, track):
        pass
        
if __name__ == '__main__':
    main()