我想使用python监视Rhythmbox中轨道的变化。我想连续检查曲目的变化并在曲目改变时执行一组功能。我编写了一段代码,可以从dbus中获取Rhythmbox接口并获取当前的跟踪详细信息。但是必须手动运行该程序以检查是否有任何变化。
我是新手,我想知道如何创建一个连续运行和检查Rhythmbox的后台进程。
我不想制作一个Rhythmbox插件(相反会让我的工作变得简单),因为我将扩展应用程序以收听多个音乐播放器。
请建议我到底要做些什么来实现这个功能。
答案 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的消息,你必须以不同的方式做到这一点。这将从探索的途径进行讨论:
答案 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
语句),这有助于简化事情:)。