#!/usr/bin/python import dbus import sys from dbus.mainloop.glib import DBusGMainLoop import gobject DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() purple = bus.get_object('im.pidgin.purple.PurpleService', '/im/pidgin/purple/PurpleObject') purple = dbus.Interface(purple, 'im.pidgin.purple.PurpleInterface') album = None artist = None title = None def playing_now(new_album, new_artist, new_title): global album, artist, title album = new_album artist = new_artist title = new_title print("Now playing [%s] [%s] [%s]" % (album, artist, title)) def playing_resume(*args): purple.PurpleUtilSetCurrentSong(title, artist, album) def playing_pause(*args): purple.PurpleUtilSetCurrentSong('', '', '') player = None ###################################################################### # Rhythmbox support ###################################################################### def _rhythmbox_play(uri): if uri is None or uri == '': return shell = bus.get_object(using['service'], '/org/gnome/Rhythmbox/Shell') song = shell.getSongProperties(uri) playing_now(song['album'], song['artist'], song['title']) def _rhythmbox_playing_changed(playing): if playing: playing_resume() else: playing_pause() def _rhythmbox_init(): uri = player.getPlayingUri() if uri is not None: _rhythmbox_play(uri) if player.getPlaying(): playing_resume() rhythmbox = { 'service' : 'org.gnome.Rhythmbox', 'object' : '/org/gnome/Rhythmbox/Player', 'signals' : { 'playingUriChanged' : _rhythmbox_play, 'playingChanged' : _rhythmbox_playing_changed, }, 'init' : _rhythmbox_init } ###################################################################### # Quodlibet support ###################################################################### def _quodlibet_play(song): playing_now(song['album'], song['artist'], song['title']) if player.IsPlaying(): playing_resume() def _quodlibet_init(): song = player.CurrentSong() if song is not None: _quodlibet_play(song) quodlibet = { 'service' : 'net.sacredchao.QuodLibet', 'object' : '/net/sacredchao/QuodLibet', 'signals' : { 'SongStarted' : _quodlibet_play, 'SongEnded' : playing_pause, 'Paused' : playing_pause, 'Unpaused' : playing_resume, }, 'init' : _quodlibet_init } players = ( rhythmbox, quodlibet ) bus = dbus.SessionBus() bus_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus'); using = None for p in players: if bus_obj.NameHasOwner(p['service']): using = p break if using is None: sys.stderr.write("No running player detected\n") sys.exit(1) def connect_to_player(): global player player = bus.get_object(using['service'], using['object']) for (s, v) in using['signals'].iteritems(): player.connect_to_signal(s, v, utf8_strings=True) print("Connected to %s" % (using['service'])) init = using['init'] if callable(init): init() # found a player, register to be notified for when it goes down def _dbus_name_owner_changed(name, old, new): if name == using['service']: if new != '' and new != old: connect_to_player() else: playing_pause() bus_obj.connect_to_signal('NameOwnerChanged', _dbus_name_owner_changed) connect_to_player() try: gobject.MainLoop().run() except: pass playing_pause()