web-dev-qa-db-ja.com

python

多くのユニティスコープは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

残念ながら、コメントアウトされたものはすべてあり、深刻なドキュメントなどはありません。

スコープ内のフィルターを使用すると、音楽をフィルター処理できるため、たとえば、ロック音楽のみを選択できます。スクリーンショットは私が何を意味するかを説明していると思います(それはドイツ語です)。

enter image description here

ご覧のとおり、コレクションには00年代の音楽がたくさんありますが、結果はありません...

編集:同様のローダー(unity-gdrive-scope)を備えたスコープを見つけました: https://Gist.github.com/wa4557/e3a9cdef5806dc3c13c9 、ここにフィルターが追加されています。率直に言って、これがどのように機能するのかわかりません。しかし、do_get_filters関数には間違いなく何かがあります...

3
wa4557

私はクレメンタインスコープについて同様のことをしようとしていますが、ある程度の進歩があったと思います。次のように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)
1
Antonio

元の質問に関してトピックから外れている場合でも、クレメンタインスコープには次のようなクエリ文字列があります

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年」フィルターのように範囲だけでなく、一度に複数のジャンルを選択できます)

1
Antonio