使用 python 在 unity-scopes 中实现过滤器

使用 python 在 unity-scopes 中实现过滤器

许多 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))

使用此搜索字符串,我只能从数据库查询中直接获得我感兴趣的结果,并且范围肯定更加灵活,不知道是否可以对类型情况做类似的事情,因为在这种情况下过滤器的数量是可变的(您可以同时选择多个类型,而不仅仅是像“十年”过滤器那样的范围)

相关内容