Как установить рейтинг песни, исполняемой в Rhythmbox 2.96?
Я пытаюсь создать плагин Python, который установит рейтинг воспроизводимой в данный момент песни в Rhythmbox 2.96. Похоже, что Rhythmbox 2.96 больше не позволяет вам использовать API (модули Python) для установки рейтинга песни; связанные с игроком действия были отброшены в пользу MPRIS.
Затем я попытался использовать dbus с MPRIS, но у MPRIS также нет спецификации для установки рейтинга песни. После долгих поисков я нашел этот пример в кодовой базе Rhythmbox и адаптировал его в тестовый скрипт.
Это работает, но метод SetEntryProperties заставляет Rhythmbox зависать примерно на 30 секунд. Вот скрипт Python.
Инструкции:
Скопируйте код в файл с именем rate.py
Запустите ритмбокс с терминала, используя
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, если это имеет значение.
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 работал отлично. Я нашел это достаточно хорошим, поэтому я отмечу это как ответ.