如何列出节奏盒插件中的所有艺术家
我试图从 Rhythmbox Python 插件中列出 Rhythmbox 数据库中的所有艺术家。我找到的唯一解决方案是让 UI 选择所有艺术家和所有歌曲,循环播放每首歌曲并将该歌曲的艺术家姓名添加到集合中。
这样做的问题是(除了效率低下的事实之外)我不想仅仅因为我想要数据库中所有艺术家的列表而更改所选的艺术家。我之前尝试保存选定的艺术家,以便在完成后可以恢复它,但这会导致一些问题,因为 UI 需要一些时间才能使用新信息和更多信息(即更多歌曲)进行更新。数据库),花费的时间越多。
代码可以通过以下方式获取 git clone [email protected]: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'
我想这样做的原因是因为我正在开发一个到 Rhythmbox 的 telnet 接口,https://github.com /sameltvom/节奏诅咒。
很高兴输入!
亲切的问候, 塞缪尔
I'm trying to list all artists in the rhythmbox database from within a rhythmbox python plugin. The only solution I have found is to make the UI select all artists and all songs, loop through every song and add that song's artist name to a set.
The problem with this is (beside from the fact it's painfully inefficient) that I don't want to change the selected artist just because I want a list of all the artists in the database. I tried earlier to save the selected artist so that I could restore it when I'm done but that causes some problems due to the fact that the UI takes some time to be updated with the new information and the more information (i.e. more songs in the database), the more time it takes.
The code can be fetched with
git clone [email protected]:sameltvom/dblister.git
Here is the code:
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'
The reason I want to do this is because I'm developing a telnet interface to rhythmbox, https://github.com/sameltvom/rhythmcurse.
Happy for input!
Kind regards,
Samuel
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我找到了!如果我想列出所有条目,无论 UI 中选择了什么,我都应该使用 base_query_model 属性。
代码现在看起来像:
我还发现了另一个好东西。如果我使用 elf.shell.props.library_source.props.base_query_model 而不是 self.shell.props.selected_source.props.base_query_model 我仍然会得到输出,即使我可能已将视图更改为左侧的 Last.FM 或 Radio窗格。
但是,我仍然必须循环遍历所有歌曲才能找到所有艺术家。但主要问题已经消失了。
I found it! It was the property base_query_model I should use if I want to list all entries regardless of what is selected in the UI.
The code now looks like:
I also found another nice thing as well. If I use elf.shell.props.library_source.props.base_query_model instead of self.shell.props.selected_source.props.base_query_model I will still get output even though I might have changed view to e.g. Last.FM or Radio in the left side pane.
However, I still must loop through all songs to find all artists. But the main problem is gone.