внедрить фильтр в унитазе с python

Многие юнит-области не работают в 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

К сожалению, однако, все закомментировано, и нет серьезной документации или чего-то подобного

Фильтры в области видимости позволил бы мне фильтровать музыку, например, выбирать только рок-музыку и т. д .; Я думаю, что скриншот объясняет, что я имею в виду (это немецкий).

enter image description here

Как видите, результатов нет, хотя в моей коллекции много музыки из 00-х ...

РЕДАКТИРОВАТЬ: Я нашел область с похожим загрузчиком (unity-gdrive-scope): https://gist.github.com/wa4557/e3a9cdef5806dc3c13c9 , где добавлены фильтры. Честно говоря, я не понимаю, как это работает. Но определенно что-то есть в функции do_get_filters ...

3
задан 24 January 2014 в 15:19

2 ответа

Я пытаюсь сделать что-то подобное для объема клементина, и я думаю, что сделал некоторые успехи. Я изменил 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)
Часть жанра должна быть подобной, я должен реализовать ее все же все же.

1
ответ дан 24 January 2014 в 15:19

Даже если мы отошли от темы по отношению к исходному вопросу, в области клементины есть строка запроса, сделанная как

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

С помощью этой строки поиска я получаю только интересующие меня результаты непосредственно из запроса к базе данных и область видимости определенно более быстрая, не знаю, если что-то подобное можно сделать для случая жанра, так как в этом случае число фильтров является переменным (вы можете выбрать более одного жанра за раз, а не просто диапазон, как для фильтра «декада» )

0
ответ дан 24 January 2014 в 15:19

Другие вопросы по тегам:

Похожие вопросы: