我正在尝试创建一个Python插件,该插件将在Rhythmbox 2.96中设置当前播放歌曲的等级。看来Rhythmbox 2.96不再允许您使用API​​(Python模块)来设置歌曲的等级;与玩家相关的 Action 已被MPRIS取代。

然后,我尝试将dbus与MPRIS结合使用,但是MPRIS也没有设置歌曲评级的规范。经过大量的挖掘,我在Rhythmbox代码库中找到了this sample并将其改编为测试脚本。

它可以工作,但是SetEntryProperties方法导致Rhythmbox卡住约30秒。这是Python脚本。

指示:

  • 将代码复制到一个名为rate.py的文件中
  • 使用以下命令从终端启动Rhythmbox
    rhythmbox -D rate
    
  • 在Rhythmbox中,从
  • 插件启用Python控制台
  • 启动Python控制台并运行
       execfile('/path/to/rate.py')
    
  • 您将在终端中看到打印输出,并且Rhythmbox卡住约20-30秒。

  • # rhythmbox -D rate
    # Rhythmbox: Edit > Plugins > Python Console enabled
    # Play a song
    # Open Rhythmbox Python Console
    # execfile('/path/to/rate.py')
    
    import sys
    import rb
    from gi.repository import Gtk, Gdk
    
    def rateThread(rating):
            try:
                currentSongURI = shell.props.shell_player.get_playing_entry().get_playback_uri()
                print "Setting rating for " + currentSongURI
    
                from gi.repository import GLib, Gio
                bus_type = Gio.BusType.SESSION
                flags = 0
                iface_info = None
    
                print "Get Proxy"
                proxy = Gio.DBusProxy.new_for_bus_sync(bus_type, flags, iface_info,
                                                       "org.gnome.Rhythmbox3",
                                                       "/org/gnome/Rhythmbox3/RhythmDB",
                                                       "org.gnome.Rhythmbox3.RhythmDB", None)
    
                print "Got proxy"
                rating = float(rating)
                vrating = GLib.Variant("d", rating)
                print "SetEntryProperties"
                proxy.SetEntryProperties("(sa{sv})", currentSongURI, {"rating": vrating})
                print "Done"
            except:
                print sys.exc_info()
    
            return False
    
    def rate():
            if shell.props.shell_player.get_playing_entry():
                Gdk.threads_add_idle(100, rateThread, 3)
    
    rate()
    

    打印的异常是:
     Desktop/test2.py:41: (<class 'gi._glib.GError'>, GError('Timeout was
     reached',),  <traceback object at 0x913e554>)
    

    我对Python/dbus的了解有限,所以我不明白为什么会发生此错误。我将不胜感激。

    另外,如果您知道通过代码在Rhythmbox中设置歌曲评级的更好方法,那么也欢迎您!

    我正在使用Ubuntu 12.04,如果有帮助的话。

    最佳答案

    在插件中设置评分
    Rhythmbox 2.9x确实提供了用于设置等级的API-除非您使用的是Rhythmbox托盘图标之类的外部程序,否则无需通过dbus进行调用。
    评级在其内部数据库中作为 double 类型值保存。使用RhythmDBEntry您可以通过
    等级= entry.get_double(RB.RhythmDBPropType.RATING)

    要设置等级,您需要RhythmDB entry_set函数:
    db = self.shell.props.db
    db.entry_set(条目,RB.RhythmDBPropType.RATING,等级)

    可以在CoverArt Browser插件(coverart_album.py)中找到获得和设置评分的示例代码。

    10-01 13:04