Как я могу установить рейтинг песни, воспроизводимой в 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, если это имеет значение.


person Mendhak    schedule 13.05.2012    source источник
comment
Только что увидел комментарий, который вы оставили на мой вопрос. Меня это интересует... если ты не узнаешь до вечера, я обещаю поискать (конечно, по своим эгоистичным причинам :) ). Если вы уже знаете, пожалуйста, ответьте на свой вопрос, чтобы другие могли увидеть решение. :D   -  person Mamsaac    schedule 30.05.2012
comment
@Mamsaac - спасибо, что напомнили мне, я обновил ответ, хотя и не идеальный.   -  person Mendhak    schedule 02.07.2012


Ответы (2)


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

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

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

rating = entry.get_double(RB.RhythmDBPropType.RATING)

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

db=self.shell.props.db
db.entry_set(entry, RB.RhythmDBPropType.RATING, rating)

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

person fossfreedom    schedule 19.11.2012

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

person Mendhak    schedule 02.07.2012