Cómo monitorear continuamente el rhythmbox para el cambio de pista usando python

Quiero monitorear el cambio de pista en Rhythmbox usando python. Quiero verificar continuamente el cambio de pista y ejecutar un conjunto de funciones si se cambia la pista. He escrito un fragmento de código que se apodera de las interfaces Rhythmbox del dbus y obtiene los detalles de la pista actual. Pero este progtwig debe ejecutarse manualmente para verificar cualquier cambio.

Soy nuevo en esto y me gustaría saber cómo podemos crear un proceso en segundo plano que se ejecute y verifique continuamente Rhythmbox.

No quiero hacer un complemento de Rhythmbox (lo que haría más sencillo mi trabajo) ya que extenderé la aplicación para escuchar múltiples reproductores de música.

Por favor, sugiérame qué debo hacer exactamente para lograr la funcionalidad.

    El objeto del reproductor Rhythmbox ( /org/gnome/Rhythmbox/Player ) envía una señal playingUriChanged cada vez que cambia la canción actual. Conecte una función a la señal para que se ejecute siempre que se reciba la señal. Este es un ejemplo que imprime el título de la canción cada vez que se inicia una nueva canción, utilizando el bucle principal de GLib para procesar mensajes DBus:

     #! /usr/bin/env 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 () 

    Echa un vistazo a la secuencia de comandos Conky aquí:

    https://launchpad.net/~conkyhardcore/+archive/ppa/+files/conkyrhythmbox_2.12.tar.gz

    Eso usa dbus para hablar con rhythmbox, así:

     bus = dbus.SessionBus() remote_object_shell = bus.get_object('org.gnome.Rhythmbox', '/org/gnome/Rhythmbox/Shell') iface_shell = dbus.Interface(remote_object_shell, 'org.gnome.Rhythmbox.Shell') remote_object_player = bus.get_object('org.gnome.Rhythmbox', '/org/gnome/Rhythmbox/Player') iface_player = dbus.Interface(remote_object_player, 'org.gnome.Rhythmbox.Player') 

    Puede llamar a una serie de funciones en iface_player para obtener la información requerida. Parece que tendrás que hacer una encuesta de este ejemplo. Si desea recibir un mensaje de dbus en cambio de pista, tendrá que hacerlo de una manera diferente. Esto discute desde avenidas para explorar:

    http://ubuntuforums.org/showthread.php?t=156706

    Estoy usando Ubuntu 14.04.1 y el script anterior está en desuso para Rhythmbox 3. Estoy usando este script para escribir la canción actual en ~ / .now_playing para que BUTT pueda leer, pero puede actualizarla según sus necesidades. Rhythmbox usa MPRIS ahora y puede obtener información aquí:

    http://specifications.freedesktop.org/mpris-spec/latest/index.html

     #!/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 () 

    Algo como:

     from time import sleep execute = True while execute: your_function_call() sleep(30) # in seconds; prevent busy polling 

    Debería funcionar bien. Si se conectara a algo que escuchara señales ( import signal ) para que pudieras establecer ejecutar en Falso cuando alguien ctrl-c es la aplicación, eso sería básicamente lo que estás buscando.

    De lo contrario, tenga un Google para la demanización (que implica realizar el proceso un par de veces); de la memoria, incluso hay una biblioteca de Python decente ahora (que, desde la memoria, requiere 2.5 / 2.6 with declaraciones) que ayudaría a hacer ese lado de las cosas más fácil :).