Как постоянно контролировать ритм-бокс для изменения трека с помощью python revisited

Запуск следующего кода Python из этого SO-ответа

#!/usr/bin/python import dbus import dbus.mainloop.glib import glib # This gets called whenever Rhythmbox sends the playingUriChanged signal def playing_song_changed (uri): global shell if uri != "": song = shell.getSongProperties (uri) print "Now playing: {0}".format (song["title"]) else: print "Not playing anything" dbus.mainloop.glib.DBusGMainLoop (set_as_default = True) bus = dbus.SessionBus () proxy = bus.get_object ("org.gnome.Rhythmbox", "/org/gnome/Rhythmbox/Player") player = dbus.Interface (proxy, "org.gnome.Rhythmbox.Player") player.connect_to_signal ("playingUriChanged", playing_song_changed) proxy = bus.get_object ("org.gnome.Rhythmbox", "/org/gnome/Rhythmbox/Shell") shell = dbus.Interface (proxy, "org.gnome.Rhythmbox.Shell") # Run the GLib event loop to process DBus signals as they arrive mainloop = glib.MainLoop () mainloop.run () 

на Ubuntu 12.04 и 14.04 появляется следующая ошибка:

 Traceback (most recent call last): File "./test.py", line 20, in <module> proxy = bus.get_object ("org.gnome.Rhythmbox", "/org/gnome/Rhythmbox/Player") File "/usr/lib/python2.7/dist-packages/dbus/bus.py", line 241, in get_object follow_name_owner_changes=follow_name_owner_changes) File "/usr/lib/python2.7/dist-packages/dbus/proxies.py", line 248, in __init__ self._named_service = conn.activate_name_owner(bus_name) File "/usr/lib/python2.7/dist-packages/dbus/bus.py", line 180, in activate_name_owner self.start_service_by_name(bus_name) File "/usr/lib/python2.7/dist-packages/dbus/bus.py", line 278, in start_service_by_name 'su', (bus_name, flags))) File "/usr/lib/python2.7/dist-packages/dbus/connection.py", line 651, in call_blocking message, timeout) dbus.exceptions.DBusException: org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.Rhythmbox was not provided by any .service files 

Что я делаю не так?

Или, альтернативно, если есть еще один способ прослушивания сигналов DBUS на Python, которые также помогут.

Это работает с Rhythmbox 3. Я изменил его, чтобы записать текущую песню в файл (~ / .now_playing), но вы можете обновить ее для своих нужд:

 #!/usr/bin/python import dbus import dbus.mainloop.glib import glib # This gets called whenever Rhythmbox sends the playingUriChanged signal def playing_song_changed (Player,two,three): global iface global track global home track2 = iface.Get(Player,"Metadata").get(dbus.String(u'xesam:artist'))[0] + " - "+ iface.Get(Player,"Metadata").get(dbus.String(u'xesam:title')) if track != track2: track = iface.Get(Player,"Metadata").get(dbus.String(u'xesam:artist'))[0] + " - "+ iface.Get(Player,"Metadata").get(dbus.String(u'xesam:title')) f = open( home + '/.now_playing', 'w' ) f.write( track + '\n' ) f.close() dbus.mainloop.glib.DBusGMainLoop (set_as_default = True) bus = dbus.SessionBus () from os.path import expanduser home = expanduser("~") player = bus.get_object ("org.mpris.MediaPlayer2.rhythmbox", "/org/mpris/MediaPlayer2") iface = dbus.Interface (player, "org.freedesktop.DBus.Properties") track = iface.Get("org.mpris.MediaPlayer2.Player","Metadata").get(dbus.String(u'xesam:artist'))[0] + " - "+ iface.Get("org.mpris.MediaPlayer2.Player","Metadata").get(dbus.Strin$ f = open( home + "/.now_playing", 'w' ) f.write( track + '\n' ) f.close() iface.connect_to_signal ("PropertiesChanged", playing_song_changed) # Run the GLib event loop to process DBus signals as they arrive mainloop = glib.MainLoop () mainloop.run () 

Оказывается, я смутился всеми аббревиатурами и лаял неправильное дерево.

Перед Rhythmbox 3, Rhythmbox управляется через свой собственный API по протоколу DBUS.

После Rhythmbox 3, Rhythmbox (через плагин MPRIS2 DBUS) управляется через универсальный MPRIS2 API по протоколу DBUS.

Итак, Googling «Rhythmbox DBUS» просто отправил меня на дикую охоту за гусями.

Для тех, кто пытается выполнить то же самое, что и я, просто Google «MPRIS2 $ DESIRED LANGUAGE $» для универсального решения по управлению почти всеми музыкальными проигрывателями Linux. В случае python есть:

https://github.com/hugosenari/mpris2

https://github.com/emesene/emesene-supported-plugins/blob/master/music/handler_mpris2.py