Alimentando Desktopcouch com Zeitgeist

Zeitgeist é um indexador de atividades, gerando informações sobre aplicações acessadas, músicas tocadas, etc.
Desktopcouch é (ou era) a parte de sincronização do Ubuntu One. Este artigo demonstra como criar uma extensão para o
Zeitgeist que alimente o Desktopcouch. Desta forma, as informações do Zeitgeist puderam ser acessadas remotamente.

[ Hits: 17.404 ]

Por: Hugo Ribeiro em 08/03/2012 | Blog: https://github.com/hugosenari/


Recuperação e Espera de Novos Eventos



Recuperando eventos do Zeitgeist

Muito provavelmente, você deseja recuperar informações que já estejam no Zeitgeist.

Para pesquisar um evento no Zeitgeist, primeiro você precisa de um TimeRange. Sendo este um objeto com 'Begin' e 'End', definindo quando começa e quando termina o período, para encontrar eventos ocorridos no intervalo deste período.

from zeitgeist.datamodel import TimeRange timerange = TimeRange.always() #inclui todos não importando a data print timerange.begin print timerange.end comeco = 0 fim = 10000000 timerange = TimeRange(comeco, fim) # print timerange.begin print timerange.end


Após decidir qual o período definido em sua busca, deve-se definir qual Template será utilizado para a busca.

* Template de Evento, nada mais é do que o objeto Event podendo ter informações omitidas, sendo que toda informação omitida é considerada como WildCard (ou Curinga).

Para encontrar o evento de 'receber uma mensagem de texto' definido anteriormente, é possível utilizar o seguinte template:

from zeitgeist.datamodel import Event, Interpretation, Subject, Manifestation my_template = Event.new_for_values( interpretation=unicode(Interpretation.EVENT_INTERPRETATION.RECEIVE_EVENT), manifestation=unicode(Manifestation.EVENT_MANIFESTATION.WORLD_ACTIVITY), actor= 'application://pidgin.desktop', subjects=[ Subject.new_for_values( interpretation=unicode(Interpretation.IMMESSAGE), manifestation=unicode(Manifestation.SOFTWARE_SERVICE), uri= 'pidgin://gtalk/fulano@gtalk.com', origin='pidgin://gtalk/fulano@gtalk.com', storage='local', ) ] )


Mais as informações podem ser omitidas ou incluídas para refinar sua busca, por exemplo, um Template para Subjects com links:

links_acessados_ou_enviados = Event.new_for_values( manifestation=Manifestation.EVENT_MANIFESTATION.USER_ACTIVITY, subjects=[Subject.new_for_values(interpretation=unicode(Interpretation.WEBSITE))] ) links_recebidors= Event.new_for_values( manifestation=Manifestation.EVENT_MANIFESTATION.WORLD_ACTIVITY, subjects=[Subject.new_for_values(interpretation=unicode(Interpretation.WEBSITE))] ) todos_links= Event.new_for_values( subjects=[Subject.new_for_values(interpretation=unicode(Interpretation.WEBSITE))] )


Pode-se utilizar mais de um Template ou omiti-los da busca para incluir todos os eventos.

Mais três informações são necessárias para realizar a busca, são elas:

I - StorageState: que informa se o subject esta disponível (StorageState.Available), indisponível (StorageState.NotAvailable) ou tanto faz (StorageState.Any). Por exemplo, se era um arquivo, este pode ter sido removido;

II - A quantidade de resultados, valor inteiro, onde 0 representa todos possíveis;

III - ResultType: que informa o tipo do resultado, basicamente é utilizado para informar ordenação, mas também pode informar que algo no Template não deve ser igual ao evento, para o evento aparecer nos resultados.

Exemplo realizando uma busca simples por todos os sites:

#! /usr/bin/env python from zeitgeist.client import ZeitgeistDBusInterface from zeitgeist.datamodel import Event, Interpretation, TimeRange, \ StorageState, ResultType, Subject, Manifestation zg = ZeitgeistDBusInterface() events = zg.FindEvents( #timerange TimeRange.always(), #Event template [ Event.new_for_values( subjects=[Subject.new_for_values(interpretation=unicode(Interpretation.WEBSITE))] ) ], #Storage State StorageState.Any, #Quantidade de resultados 0, #Ordenação da busca ResultType.MostRecentEvents) for e in events: print type(e) print Event(e)


Para a busca, também pode ser utilizado o ZeitgeistClient, porém, funciona de forma um pouco diferente, pois deve ser passado um Callback que receberá o resultado da busca.

Esperando novos eventos

Uma vez que já esteja definido como enviar eventos para o Zeitgeist, como pesquisá-los, como registrá-los no Desktopcouch, só falta mais uma informação importante: como registar para ser informado todas as vezes que um evento for criado.

Para registrar-se, defina um TimeRange, os Templates e duas funções de Callback, uma que receberá os eventos criados e outra que recebe os ID dos eventos removidos.

Como estas chamadas são assíncronas, será necessário um Mainloop, que pode ser tanto GLib, quando QT.

from dbus.mainloop.glib import DBusGMainLoop import gobject DBusGMainLoop(set_as_default=True) mloop = gobject.MainLoop() from zeitgeist.client import ZeitgeistClient def insert(timerange, events, *args, **kws): print timerange, events def delete(timerange, events_ids, *args, **kws): print timerange, events_ids zeitgeistclient = ZeitgeistClient() monitor = zeitgeistclient.install_monitor( #intervalo TimeRange.always(), #templates [], #callback para novos insert, #ballback para removidos delete) #zeitgeistclient.remove_monitor(monitor) mloop.run()


A parte de remover o monitor esta comentada, mas fica para fins instrutivos.

Perceba que passei um Template em branco: '[ ]', mas como descrito sobre busca, pode ser criado um ou vários Templates que definam quais eventos devem ser recebidos.
Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Ontologia, as informações do Zeitgeist
   3. Do evento Zeitgeist para o CouchDB
   4. Recuperação e Espera de Novos Eventos
   5. Juntando os pontos
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Port Scanner com Python

Desenvolvendo aplicações GUI simples em Python & Glade (PyGTK) com banco de dados SQLite

Python - Threads

Criando Speed Test com Python

Trabalhando com permutações em ordem lexicográfica crescente

  
Comentários
[1] Comentário enviado por hugosenari em 09/05/2012 - 05:01h

Para quem se interessar em sincronizar isto e outras coisas (principalmente agora que ubnutu one não da mais suporte para couchdb), encontrei um servidor gratúito com couchdb https://www.alwaysdata.com/plans/shared/

Bem legal, tem outras coisas também (servidor python ...).


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts