多くのユニティスコープはubuntuでは機能しません(たとえば、unity-scope-gmusicbrowser
)。そのため、ダッシュで結果を取得するために、それらを「修正」しようとしました。
わかりました、これを行うことに成功しました(ファイルの場合:/usr/share/unity-scopes/gmusicbrowser/unity_gmusicbrowser_deamon.py
:「修正された」コード: https://Gist.github.com/wa4557/d6cc4ec5354bbb95042b (投稿しても大丈夫ですか?たとえ主要部分が私からのものでなくても、ここにありますか?))。これは問題なく機能し、gmusicbrowserの結果が、表示したいようにミュージックダッシュに表示されるようになりました。
しかし、まだ1つの小さな問題があります。スコープに使用可能なフィルターを実装するにはどうすればよいですか?コード内の関連する行は次のとおりです(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
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)
元の質問に関してトピックから外れている場合でも、クレメンタインスコープには次のようなクエリ文字列があります
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))
この検索文字列を使用すると、データベースクエリから直接関心のある結果のみが取得され、スコープは間違いなくよりスッキリします。このジャンルの場合、フィルターの数は可変であるため、同様のことができるかどうかはわかりません( 「10年」フィルターのように範囲だけでなく、一度に複数のジャンルを選択できます)