Как перечислить всех исполнителей в плагине Rhythmbox - PullRequest
3 голосов
/ 19 января 2011

Я пытаюсь перечислить всех исполнителей в базе данных rhythmbox из плагина rhythmbox python.Единственное решение, которое я нашел, - это заставить пользовательский интерфейс выбрать всех исполнителей и все песни, пройтись по каждой песне и добавить имя исполнителя этой песни в набор.

Проблема в этом (кроме того, что это мучительнонеэффективно) что я не хочу менять выбранного исполнителя только потому, что мне нужен список всех исполнителей в базе данных.Ранее я пытался сохранить выбранного исполнителя, чтобы я мог его восстановить, когда закончил, но это вызывает некоторые проблемы из-за того, что пользовательскому интерфейсу требуется некоторое время, чтобы обновить новую информацию и больше информации (т.е. больше песен вбазы данных), тем больше времени требуется.

Код можно получить с помощью git clone git@github.com: sameltvom / dblister.git

Вот код:

import rb
import rhythmdb
import gtk

class DblisterPlugin (rb.Plugin):
    def __init__(self):
        rb.Plugin.__init__(self)
    def activate(self, shell):
        self.shell = shell
        print '##### dblister #####'

        # choose all artists, this will choose all albums and songs as well

        # get the lock for rhythmbox ui
        gtk.gdk.threads_enter()
        for p in self.shell.props.library_source.get_property_views():
            if p.props.prop == rhythmdb.PROP_ARTIST:
                p.set_selection([""])
                break
        gtk.gdk.threads_leave()

        ##################### Print all artists in database ######################

        # loop through all songs currently selected (i.e. all songs since we did p.set_selection([""]) above
        # for each song, try to add the artist name to the 'artists' set
        artists = set() # unique keys, no duplicates
        for row in self.shell.props.selected_source.props.query_model:
             entry = row[0]
             artist = self.shell.props.db.entry_get(entry, rhythmdb.PROP_ARTIST)
            artists.add(artist)

        print '--- artists ---'
        for artist in artists:
            print artist


        ##################### Print all songs in database ######################

        print '--- songs ---'
        # loop through all songs currently selected (i.e. all songs since we did p.set_selection([""]) above
        # for each song, print artist name and title
        for row in self.shell.props.selected_source.props.query_model:
             entry = row[0]
             artist = self.shell.props.db.entry_get(entry, rhythmdb.PROP_ARTIST)
             song = self.shell.props.db.entry_get(entry, rhythmdb.PROP_TITLE)
            print artist + ' - ' + song

    def deactivate(self, shell):
        del self.shell
        print 'Bye world'

Причина, по которой я хочу это сделать, заключается в том, что я разрабатываю интерфейс telnet для rhythmbox, https://github.com/sameltvom/rhythmcurse.

Рад за ввод!

С уважением, Сэмюэль

1 Ответ

1 голос
/ 19 января 2011

Я нашел это!Это было свойство base_query_model, которое я должен использовать, если хочу перечислить все записи независимо от того, что выбрано в пользовательском интерфейсе.

Код теперь выглядит следующим образом:

import rb
import rhythmdb
import gtk

class DblisterPlugin (rb.Plugin):
    def __init__(self):
        rb.Plugin.__init__(self)
    def activate(self, shell):
        self.shell = shell
        print '##### dblister #####'


        #################### Print all artists in the library ####################
        artists = set() # unique keys, no duplicates
        for row in self.shell.props.library_source.props.base_query_model:
             entry = row[0]
             artist = self.shell.props.db.entry_get(entry, rhythmdb.PROP_ARTIST)
            artists.add(artist)

        print '--- artists using library_source---'
        for artist in artists:
            print artist

        del artists


        ##################### Print all artists in database ######################

        artists = set() # unique keys, no duplicates
        for row in self.shell.props.selected_source.props.base_query_model:
             entry = row[0]
             artist = self.shell.props.db.entry_get(entry, rhythmdb.PROP_ARTIST)
            artists.add(artist)

        print '--- artists ---'
        for artist in artists:
            print artist


        ##################### Print all songs in database ######################

        print '--- songs ---'
        for row in self.shell.props.selected_source.props.base_query_model:
             entry = row[0]
             artist = self.shell.props.db.entry_get(entry, rhythmdb.PROP_ARTIST)
             song = self.shell.props.db.entry_get(entry, rhythmdb.PROP_TITLE)
            print artist + ' - ' + song

    def deactivate(self, shell):
        del self.shell
        print 'Bye world'

Я также нашел еще один хорошийвещь, как хорошо.Если я использую elf.shell.props.library_source.props.base_query_model вместо self.shell.props.selected_source.props.base_query_model, я все равно получу вывод, хотя я мог бы изменить представление, например, Last.FM или Radio в левой части.pane.

Однако мне все равно нужно просмотреть все песни, чтобы найти всех исполнителей.Но главная проблема ушла.

...