Как установить рейтинг песни, исполняемой в Rhythmbox 2.96?

Я пытаюсь создать плагин Python, который установит рейтинг воспроизводимой в данный момент песни в Rhythmbox 2.96. Похоже, что Rhythmbox 2.96 больше не позволяет вам использовать API (модули Python) для установки рейтинга песни; связанные с игроком действия были отброшены в пользу MPRIS.

Затем я попытался использовать dbus с MPRIS, но у 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, если это имеет значение.

2 ответа

Решение

Установка рейтинга в плагине

Rhythmbox 2.9x предоставляет API для установки рейтинга - нет необходимости звонить через dbus, если вы не используете внешнюю программу, такую ​​как Rhythmbox Tray Icon.

Рейтинги хранятся в виде значений двойного типа во внутренней базе данных. Используя RhythmDBEntry, вы можете получить рейтинг с

рейтинг = entry.get_double(RB.RhythmDBPropType.RATING)

Для установки рейтинга вам понадобится функция RhythmDB entry_set:

дБ =self.shell.props.db
db.entry_set(entry, RB.RhythmDBPropType.RATING, рейтинг)

Пример кода для получения и установки оценок можно найти в плагине CoverArt Browser (coverart_album.py)

Плагину Rhythmbox Tray Icon на github удается установить рейтинг песни, но он делает это вне среды исполнения 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 работал отлично. Я нашел это достаточно хорошим, поэтому я отмечу это как ответ.

Другие вопросы по тегам