如何使用python连续监视rhythmbox的轨道变化

时间:2010-10-12 23:07:10

标签: python monitor dbus rhythmbox

我想使用python监视Rhythmbox中轨道的变化。我想连续检查曲目的变化并在曲目改变时执行一组功能。我编写了一段代码,可以从dbus中获取Rhythmbox接口并获取当前的跟踪详细信息。但是必须手动运行该程序以检查是否有任何变化。

我是新手,我想知道如何创建一个连续运行和检查Rhythmbox的后台进程。

我不想制作一个Rhythmbox插件(相反会让我的工作变得简单),因为我将扩展应用程序以收听多个音乐播放器。

请建议我到底要做些什么来实现这个功能。

4 个答案:

答案 0 :(得分:12)

当每首歌曲发生变化时,Rhythmbox播放器对象(/org/gnome/Rhythmbox/Player)会发送playingUriChanged信号。将功能连接到信号,以便在接收到信号时使其运行。这是一个在新歌开始时打印歌曲标题的示例,使用GLib主循环处理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 ()

答案 1 :(得分:1)

在这里看看Conky脚本:

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

使用dbus与rhythmbox交谈,就像这样:

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')

您可以在iface_player上调用许多函数来获取所需信息。看起来你不得不从这个例子中进行民意调查。如果你想在dbus上接收来自dbus的消息,你必须以不同的方式做到这一点。这将从探索的途径进行讨论:

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

答案 2 :(得分:1)

我正在使用Ubuntu 14.04.1并且上面的脚本不推荐使用Rhythmbox 3.我正在使用这个脚本将当前歌曲写入〜/ .now_playing以供BUTT阅读,但您可以根据需要更新它。 Rhythmbox现在使用MPRIS,你可以在这里获得信息:

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 ()

答案 3 :(得分:-2)

类似的东西:

from time import sleep

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

应该工作得很好。如果它被连接到听取信号(import signal)的东西,那么当某人ctrl-c是应用程序时你可以将执行设置为False,这基本上就是你所追求的。

否则,请使用Google进行守护程序(这需要多次执行此过程);从内存来看,现在甚至还有一个不错的Python库(从内存中需要2.5 / 2.6 with语句),这有助于简化事情:)。