implementa o filtro em escopos de unidade com python

3

Muitos dos escopos de unidade não funcionam no Ubuntu (por exemplo, unity-scope-gmusicbrowser ), portanto, tentei "corrigi-los" para obter resultados no traço.

Ok, consegui fazer isso (para o arquivo: /usr/share/unity-scopes/gmusicbrowser/unity_gmusicbrowser_deamon.py : o código "corrigido": link (está ok postar aqui, mesmo que a parte principal não seja de mim?)). Isso funciona perfeitamente, e os resultados do gmusicbrowser agora são visíveis no music-dash, como eu quero que eles apareçam.

Mas ainda tenho um pequeno problema: Como posso implementar os filtros disponíveis nos escopos? Eu acho que as linhas relevantes no código são (linha 372 ff):

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

Infelizmente, há tudo comentado e não há documentação séria ou algo semelhante

Filtros no escopo me deixariam filtrar Música, por exemplo, para selecionar apenas Rock, música, etc; Eu acho que a imagem explica o que eu quero dizer (é alemão).

Como você pode ver, não há resultados, apesar de eu ter muitas músicas dos 00s na minha coleção ...

EDIT: Eu encontrei um escopo com um carregador semelhante (unidade-gdrive-scope): link , onde o filtros são adicionados. Francamente, não entendo como isso funciona. Mas definitivamente há algo na função do_get_filters ...

    
por wa4557 22.01.2014 / 22:46

2 respostas

1

Estou tentando fazer algo semelhante para o escopo clementine e acho que fiz algum progresso. Eu modifiquei o do_get_filters da seguinte maneira


    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

depois de definir FILTERS como


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

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

FILTERS = [f1, f2]

Neste ponto, você pode fazer algo parecido com isto no método do_run da 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

e depois disso %código% A parte de gênero deveria ser semelhante, eu tenho que implementar isto entretanto.

    
por Antonio 27.01.2014 / 19:08
1

Mesmo se estivermos ignorando o assunto da questão original, no escopo clementine há uma string de consulta feita como

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

(adicionei o disco de acordo com a string original) e isso é chamado com algo como

tracks = get_music_from_clementine(search, search, search))

em que pesquisa é o termo de pesquisa. Agora eu defini uma nova string de pesquisa

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 eu chamo com

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

Com essa string de pesquisa, eu só obtenho os resultados que estou interessado diretamente na consulta do banco de dados e o escopo é definitivamente mais rápido, não sei se algo semelhante pode ser feito para o caso de gênero, pois nesse caso o número de filtros é variável (você pode selecionar mais de um gênero no momento e não apenas um intervalo como para o filtro "década")

    
por Antonio 28.01.2014 / 11:45