3 votes

implémenter un filtre dans les unity-scopes avec Python

Un grand nombre des unity-scopes ne fonctionnent pas sous ubuntu (par exemple, la fonction unity-scope-gmusicbrowser ), j'ai donc essayé de les "corriger" afin d'obtenir des résultats dans le tableau de bord.

Ok, j'ai réussi à le faire (pour le fichier : /usr/share/unity-scopes/gmusicbrowser/unity_gmusicbrowser_deamon.py : le code "corrigé" : https://gist.github.com/wa4557/d6cc4ec5354bbb95042b (est-il acceptable de le poster ici, même si la partie principale n'est pas de moi ?)). Cela fonctionne parfaitement, et les résultats de gmusicbrowser sont maintenant visibles dans le music-dash, comme je veux qu'ils apparaissent.

Mais j'ai encore un petit problème : comment puis-je implémenter les filtres disponibles dans les scopes ? Je pense que les lignes pertinentes du code sont (ligne 372 et suivantes) :

def do_get_filters(self):
    '''
    Adds filters
    '''
    fs = Unity.FilterSet.new()
    #if FILTERS:
    #
    return fs

Malheureusement, tout est commenté, et il n'y a pas de documentation sérieuse ou quelque chose de similaire

Des filtres dans le champ d'application me permettraient de filtrer la musique, par exemple pour ne sélectionner que la musique rock, etc. Je pense que la capture d'écran explique ce que je veux dire (elle est en allemand).

enter image description here

Comme vous pouvez le voir, il n'y a pas de résultats, même si j'ai beaucoup de musique des années 00 dans ma collection...

EDIT : J'ai trouvé un scope avec un chargeur similaire (unity-gdrive-scope) : https://gist.github.com/wa4557/e3a9cdef5806dc3c13c9 où les filtres sont ajoutés. Franchement, je ne comprends pas comment cela fonctionne. Mais il y a certainement quelque chose dans le do_get_filters fonction...

1voto

sanon Points 2771

J'essaie de faire quelque chose de similaire pour le scope clementine et je pense avoir fait quelques progrès. J'ai modifié le do_get_filters de la manière suivante

    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

après avoir défini les FILTRES comme

f1 = {'id': 'decade',
      'name': _('Decade'),
      'icon': '',
      'collapsed': True}

f2 = {'id': 'genre',
      'name': _('Genre'),
      'icon': '',
      'collapsed': True}

FILTERS = [f1, f2]

À ce stade, vous pouvez faire quelque chose comme ceci dans la méthode do_run de la classe 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

et après cela

            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)

La partie genre devrait être similaire, mais je dois encore l'implémenter.

1voto

sanon Points 2771

Même si nous nous éloignons du sujet par rapport à la question initiale, dans la portée de clementine, il y a une chaîne de requête faite comme suit

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

(j'ai ajouté l'ordre du disque par rapport à la chaîne originale) et ceci est appelé avec quelque chose comme

tracks = get_music_from_clementine(search, search, search))

où recherche est le terme recherché. Maintenant, j'ai défini une nouvelle chaîne de recherche

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

que j'appelle avec

    tracks = get_music_from_clementine(MY_SEARCH_SQL % (str(start_year), str(end_year), search, search, search))

Avec cette chaîne de recherche, je n'obtiens que les résultats qui m'intéressent directement à partir de la requête de la base de données et la portée est nettement plus rapide, je ne sais pas si quelque chose de similaire peut être fait pour le cas du genre puisque dans ce cas le nombre de filtres est variable (vous pouvez sélectionner plus d'un genre à la fois et pas seulement une plage comme pour le filtre "décennie").

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X