许多 unity-scopes 在 ubuntu 中不起作用(例如unity-scope-gmusicbrowser
),因此我尝试“纠正”它们以便在 dash 中获得结果。
好的,我成功了(对于文件::/usr/share/unity-scopes/gmusicbrowser/unity_gmusicbrowser_deamon.py
“更正”的代码:https://gist.github.com/wa4557/d6cc4ec5354bbb95042b(即使主要部分不是我写的,可以在这里发布吗?))。这工作得很完美,并且 gmusicbrowser 的结果现在可以在 music-dash 中看到,就像我希望它们显示的那样。
但我仍然有一个小问题:如何在范围内实现可用的过滤器?我认为代码中的相关行是(第 372 行以下):
def do_get_filters(self):
'''
Adds filters
'''
fs = Unity.FilterSet.new()
#if FILTERS:
#
return fs
但不幸的是,所有内容都被注释掉了,而且没有严肃的文档或类似的东西
范围内的过滤器可以让我过滤音乐,例如只选择摇滚音乐等;我认为屏幕截图解释了我的意思(它是德语)。
正如你所见,虽然我的收藏中有很多 00 年代的音乐,但却没有任何结果......
编辑:我找到了具有类似加载器的范围(unity-gdrive-scope):https://gist.github.com/wa4557/e3a9cdef5806dc3c13c9,其中添加了过滤器。坦白说,我不明白这是如何工作的。但函数中肯定有一些东西do_get_filters
……
答案1
我正在尝试对 clementine 范围进行类似操作,我认为我取得了一些进展。我按以下方式修改了 do_get_filters
def do_get_filters(self):
'''
Adds filters
'''
fs = Unity.FilterSet.new()
if FILTERS:
fil = Unity.MultiRangeFilter.new(FILTERS[0]['id'], FILTERS[0]['name'],
Gio.ThemedIcon.new(FILTERS[0]['icon']),
FILTERS[0]['collapsed'])
fs.add(fil)
fil = Unity.RadioOptionFilter.new(FILTERS[1]['id'], FILTERS[1]['name'],
Gio.ThemedIcon.new(FILTERS[1]['icon']),
FILTERS[1]['collapsed'])
fs.add(fil)
return fs
将 FILTERS 定义为
f1 = {'id': 'decade',
'name': _('Decade'),
'icon': '',
'collapsed': True}
f2 = {'id': 'genre',
'name': _('Genre'),
'icon': '',
'collapsed': True}
FILTERS = [f1, f2]
此时,您可以在 MySearch 类的 do_run 方法中执行类似这样的操作
def do_run(self):
'''
Adds results to the model
'''
try:
decade, genre = self.search_context.filter_state.get_filters()
if decade.get_first_active():
start_year = int( decade.get_first_active().get_property('id') )
else:
start_year = 0
if decade.get_last_active():
if decade.get_last_active().get_property('id') == '0':
end_year = 1950 + 9
else:
end_year = int( decade.get_last_active().get_property('id') ) + 9
else:
end_year = 3000
在那之后
result_set = self.search_context.result_set
for i in search(self.search_context.search_query,
self.search_context.filter_state):
if not (start_year < i['year'].get_int32() < end_year) :
continue
if not 'uri' in i or not i['uri'] or i['uri'] == '':
continue
if not 'icon' in i or not i['icon'] or i['icon'] == '':
i['icon'] = DEFAULT_RESULT_ICON
if not 'mimetype' in i or not i['mimetype'] or i['mimetype'] == '':
i['mimetype'] = DEFAULT_RESULT_MIMETYPE
if not 'result_type' in i or not i['result_type'] or i['result_type'] == '':
i['result_type'] = DEFAULT_RESULT_TYPE
if not 'category' in i or not i['category'] or i['category'] == '':
i['category'] = 0
if not 'title' in i or not i['title']:
i['title'] = ''
if not 'comment' in i or not i['comment']:
i['comment'] = ''
if not 'dnd_uri' in i or not i['dnd_uri'] or i['dnd_uri'] == '':
i['dnd_uri'] = i['uri']
i['provider_credits'] = GLib.Variant('s', PROVIDER_CREDITS)
result_set.add_result(**i)
except Exception as error:
print(error)
类型部分应该类似,但我还必须实现它。
答案2
即使我们偏离了原始问题的主题,在 clementine 范围内也有一个查询字符串,如下所示
SEARCH_SQL = '''SELECT title, filename, artist, album, albumartist, art_automatic, year, genre, art_manual, track, length
FROM songs
WHERE album LIKE '%%%s%%' OR artist LIKE '%%%s%%' OR title LIKE '%%%s%%'
ORDER BY disc, track'''
(我根据原始字符串添加了光盘排序)并且调用如下命令
tracks = get_music_from_clementine(search, search, search))
其中 search 是搜索词。现在我定义了一个新的搜索字符串
MY_SEARCH_SQL = '''SELECT title, filename, artist, album, albumartist, art_automatic, year, genre, art_manual, track, length
FROM songs
WHERE (year >= %s AND year <= %s AND (album LIKE '%%%s%%' OR artist LIKE '%%%s%%' OR title LIKE '%%%s%%') )
ORDER BY disc, track'''
我称之为
tracks = get_music_from_clementine(MY_SEARCH_SQL % (str(start_year), str(end_year), search, search, search))
使用此搜索字符串,我只能从数据库查询中直接获得我感兴趣的结果,并且范围肯定更加灵活,不知道是否可以对类型情况做类似的事情,因为在这种情况下过滤器的数量是可变的(您可以同时选择多个类型,而不仅仅是像“十年”过滤器那样的范围)