Как составить список всех исполнителей в плагине Rhythmbox
Я пытаюсь перечислить всех артистов в базе данных 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 ответ
Я нашел это! Это было свойство 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 в левой части. панель.
Тем не менее, я все еще должен просмотреть все песни, чтобы найти всех исполнителей. Но главная проблема ушла.