Многие юнит-области не работают в Ubuntu (например, unity-scope-gmusicbrowser
), поэтому я попытался «исправить» их, чтобы получить результаты в тире.
Хорошо, мне удалось это сделать (для файла: /usr/share/unity-scopes/gmusicbrowser/unity_gmusicbrowser_deamon.py
: «исправленный» код: https://gist.github.com/wa4557/d6cc4ec5354bbb95042b (это нормально, чтобы опубликовать это здесь, даже если основная часть не от меня?)). Это работает безупречно, и результаты gmusicbrowser теперь видны в музыкальной черте, как будто я хочу, чтобы они появились.
Но у меня есть еще одна небольшая проблема: как я могу реализовать доступные фильтры в областях? Я думаю, что соответствующие строки в коде (строка 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
...
Я пытаюсь сделать что-то подобное для объема клементина, и я думаю, что сделал некоторые успехи. Я изменил 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
после определения ФИЛЬТРОВ как
f1 = {'id': 'decade',
'name': _('Decade'),
'icon': '',
'collapsed': True}
f2 = {'id': 'genre',
'name': _('Genre'),
'icon': '',
'collapsed': True}
FILTERS = [f1, f2]
На данном этапе можно сделать что-то вроде этого в do_run методе класса MySearch
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)
Даже если мы отошли от темы по отношению к исходному вопросу, в области клементины есть строка запроса, сделанная как
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))
С помощью этой строки поиска я получаю только интересующие меня результаты непосредственно из запроса к базе данных и область видимости определенно более быстрая, не знаю, если что-то подобное можно сделать для случая жанра, так как в этом случае число фильтров является переменным (вы можете выбрать более одного жанра за раз, а не просто диапазон, как для фильтра «декада» )