внедрить фильтр в унитазе с 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
задан 06.05.2020, 20:05

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

после определения FILTERS как


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
ответ дан 06.05.2020, 20:06
  • 1
    Хорошо, таким образом, это кажется, это here' s различие между нашими объемами. Gmusicbrowser сохраняет базу данных как простой текст, таким образом there' s совершенно определенно ускорение в моем случае... – Daniel Lizik 06.05.2020, 20:06
  • 2
    I' m довольный я помог Вам (и я:-)). Я также понял, что фильтрация на результатах, которые я предложил реализовать в " do_run" может быть реализован в " search" метод начиная с его " filters" аргументом является только " сам search_context.filter_state" найденный в " do_run". на различном предмете, в клементине определяют объем, я зафиксировал извлечение искусства альбома, он назвал модуль мутагена, который не существует для python3. У Вас была та же проблема? – Louise Eggleton 06.05.2020, 20:07
  • 3
    Да, точно. Это должно, должен значительно ускорить вещи, так как это означает, это не, целый набор сканируется. Мутаген звучит интересным. Gmusicbrowser обрабатывает albumart по-другому хотя... – lborgav 06.05.2020, 20:07
  • 4
    да, наконец! прохладное спасибо. Я попытаюсь реализовать это и прогресс отчета. К сожалению, объемы довольно ошибочны: ( – Chris Schmitz 06.05.2020, 20:08
  • 5
    Я don' t знают, будите ли Вы на самом деле скорость, я думаю it' s просто вопрос выполнения фильтрации однажды или другого. Возможно, действительная скорость может быть получена " embedding" фильтры в строке SQL-запроса, не знайте если it' s выполнимый – Yannick Mauray 06.05.2020, 20:08

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

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

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

1
ответ дан 06.05.2020, 20:05
  • 1
    Я нашел способ сделать это, я создаю часть относительно фильтра жанра и затем передаю его как единственную строку, которая будет заменена в MY_SEARCH_SQL. – Nycen 06.05.2020, 20:06
  • 2
    хорошо Вы могли сделать что-то как: """WHERE (year >= %s AND year <= %s AND """ +s*number_of_genres + """ AND (album LIKE '%%%s%%' OR artist LIKE '%%%s%%' OR title LIKE '%%%s%%') )""" с s=if number_of_genre == 1: 'genre=%s' else: 'genre=%s OR '*number_of_genres[:-3]. Synthax определенно не корректен, но идея позади него должна работать. Некоторые % отсутствуют также. Когда you' ре закончилось, необходимо предложить объединиться на панели запуска – sean6bucks 06.05.2020, 20:06
  • 3
    Можете Вы показывать сделать Ваш загрузчик доступным где-нибудь? I' m просто любопытный, что Вы сделали... – Nycen 06.05.2020, 20:06
  • 4
    Можно найти его здесь code.launchpad.net/~antoniomariano/unity-scope-clementine/… , но I' ve продвинул только часть его. Посмотрите строки 170-177 в src/unity_clementine_daemon.py для строкового создания жанра, эта строка тогда передается как 3-й аргумент запросу базы данных, такому как MY_SEARCH_SQL = ' ' ' ВЫБЕРИТЕ заголовок, имя файла, художника, альбом, albumartist, art_automatic, год, жанр, art_manual, дорожка, длина ОТ песен ГДЕ (год > = %s И год < = %s И %s (альбом КАК ' %%% s %%' ИЛИ художник КАК ' %%% s %%' ИЛИ заголовок КАК ' %%% s %%')) диск ORDER BY, track' ' ' – Bhargav 06.05.2020, 20:07

Теги

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