As I have been experimenting with the docky python bindings, I created a small media control helper for Vagalume, a lightweight last.fm client. I found the vagalume DBus methods and signals to be mostly undocumented, but I found them lurking around after a quick look at some of the source code.

I created a smallish class with the help of the excellent PyGtk Notebook.

import dbus, gtk, gobject
from dbus.mainloop.glib import DBusGMainLoop

class vagalume:
    def __init__(self):
        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
        self.bus = dbus.SessionBus()

        self.player = self.bus.get_object("com.igalia.vagalume", "/com/igalia/vagalume")

        self.bus.add_signal_receiver(self.song_changed,
        dbus_interface="com.igalia.vagalume",
        signal_name="notify")

    def song_changed(self, *args):
        self.state = args[0]
        if state == 'stopped':
            #do something when the player is stopped
        elif state == 'playing':
            self.artist = args [1]
            self.title = args [2]
            self.album = args [3]
            #do something with the data here...

if __name__ == "__main__":
    app = vagalume()
    gtk.main()

I used the gtk mainloop for simplicity, but you could use

mainloop = gobject.MainLoop(is_running=True)
mainloop.run()

If you want to use the signals for change of song etc, it would be best to modify vagalume() to do what you want.

To interact with vagalume do something like:

    vagalume = vagalume()

    #do anything you want with dbus.
    #take a look at http://gitorious.org/vagalume/vagalume/blobs/master/src/dbus.h
    #for all of the functions available
    vagalume.player.Play()
    vagalume.player.Skip()
    vagalume.player.LoveTrack()
    vagalume.player.BanTrack()
    vagalume.player.Stop()
Advertisements