5

Rhythmbox 2.96 で現在再生中の曲の評価を設定する Python プラグインを作成しようとしています。Rhythmbox 2.96 では、API (Python モジュール) を使用して曲の評価を設定することができなくなったようです。プレーヤー関連のアクションは、MPRIS を支持して削除されました。

次に、MPRIS で dbus を使用してみましたが、MPRIS には曲の評価を設定するための仕様もありません。いろいろ調べた結果、Rhythmbox コードベースでこのサンプルを見つけ、それをテスト スクリプトに適合させました。

動作しますが、SetEntryProperties メソッドによって Rhythmbox が約 30 秒間フリーズします。ここに Python スクリプトがあります。


指示:

  1. コードを rate.py というファイルにコピーします。

  2. を使用して端末からリズムボックスを起動します

    rhythmbox -D rate
    
  3. Rhythmbox で、プラグインから Python コンソールを有効にします。

  4. Python コンソールを起動して実行します

       execfile('/path/to/rate.py')
    
  5. ターミナルに印刷出力が表示され、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 を使用しています。

4

2 に答える 2

3

プラグイン内で評価を設定する

Rhythmbox 2.9x は評価を設定するための API を提供します。Rhythmbox トレイ アイコンなどの外部プログラムを使用していない限り、dbus 経由で呼び出す必要はありません。

評価は、内部データベースに double 型の値として保持されます。RhythmDBEntry を使用すると、評価を取得できます

評価 = entry.get_double(RB.RhythmDBPropType.RATING)

評価を設定するには、RhythmDB の entry_set 関数が必要です。

デシベル=self.shell.props.db
db.entry_set(エントリー, RB.RhythmDBPropType.RATING, 評価)

評価を取得および設定するためのサンプル コードは、CoverArt Browserプラグイン (coverart_album.py)にあります。

于 2012-11-19T12:44:48.570 に答える
1

githubのRhythmbox Tray Icon プラグインは、曲の評価を設定することを管理しますが、Rhythmbox 実行環境の外からそれを行います。

ここから:

def SetSongRating(self, rating):
    """
    Sets the current song rating in Rhythmbox.
    """

    try:
        currentSongURI = self.GetSongURI()

        if currentSongURI:

            busType = Gio.BusType.SESSION
            flags = 0
            ratingInterface = None

            proxy = Gio.DBusProxy.new_for_bus_sync(busType, flags, ratingInterface,
                                                   "org.gnome.Rhythmbox3",
                                                   "/org/gnome/Rhythmbox3/RhythmDB",
                                                   "org.gnome.Rhythmbox3.RhythmDB", None)

            variantRating = GLib.Variant("d", float(rating))
            proxy.SetEntryProperties("(sa{sv})", currentSongURI, {"rating": variantRating})
    except:
        print "Failed to set a rating"

そのコードを Rhythmbox プラグイン内から直接実行しようとすると、再びフリーズします。ただし、Rhythmbox 環境の外から実行すると、まったく問題なく動作しました。これで十分だと思ったので、これを答えとしてマークします。

于 2012-07-02T18:10:59.583 に答える