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.657 ]

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


Juntando os pontos



Agora, tudo o que se precisa é juntar os pontos, isto é:
  • Aguardar ou recuperar eventos do Zeitgeist;
  • Convertê-los em Record do desktopcouch;
  • E salvá-las no desktopcouch.

Segue o script com tudo junto “ seumodulo/__init__.py”:

#!/usr/bin/env python # -*- coding: utf-8 -*- import time, logging #couchdb lib from desktopcouch.records.server import DesktopDatabase from desktopcouch.records.record import Record as CouchRecord #zeitgeist lib from zeitgeist.client import ZeitgeistClient, ZeitgeistDBusInterface from zeitgeist.datamodel import Event, Interpretation, Manifestation, Subject, \ TimeRange, ResultType, StorageState def log(self, *args, **kws): logger = logging.getLogger('SuaClasse') logger.log(logger.INFO, *args, **kws) class SuaClasse(object): def __init__(self, logger=log, *args, **kw): '''Contrutor''' #nome da base de dados self.database = 'zeitgeist' #objeto para o desktopcouch self.object_type = 'https://github.com/hugosenari/zeitgeist-extensions/wiki/ZeitgeistEvent' self.monitor = None #templates definindo com os quais eventos eu devo trabalhar #neste caso somente websites self.templates = [ Event.new_for_values( subjects=[Subject.new_for_values(interpretation=unicode(Interpretation.WEBSITE))] ) ] #log as informações self.log = logger self.log('Nova instancia criada') def novo_link(self, link, interpretation=None, manifestation=None): self.log('Criando novo evento de link: %s', link) return Event.new_for_values( interpretation=interpretation or\ Interpretation.EVENT_INTERPRETATION.RECEIVE_EVENT, manifestation=manifestation or\ Manifestation.EVENT_MANIFESTATION.SYSTEM_NOTIFICATION, actor="application://suaextensao.desktop", timestamp=int(time.time() * 1000), subjects=[ Subject.new_for_values( uri=link, interpretation=unicode(Interpretation.WEBSITE), manifestation=unicode(Manifestation.WEB_DATA_OBJECT), origin='%s/../' % link, storage='web', text=link) ] ) def inserir_no_zeitgeist(self, evento): '''Insere um evento no zeitgeist''' self.log('Inserindo novo evento no zeitgeist') ZeitgeistClient().insert_event(evento) def inserir_no_desktopcouch(self, record): '''Insere um evento no desktopcouch''' self.log('Inserindo novo evento no desktopcouch') database = DesktopDatabase(self.database, create=True) database.put_record(record) def evento_para_record(self, evento): '''Converte um evento em record''' self.log('Convertendo evento em record') record = { 'application_annotations':{ 'zeitgeist': { 'profile': 'username' } } } if evento.get_actor(): record['actor'] = evento.get_actor() if evento.get_id(): record['id'] = int(evento.get_id()) if evento.get_interpretation(): record['interpretation'] = evento.get_interpretation() if evento.get_manifestation(): record['manifestation'] = evento.get_manifestation() if evento.get_origin(): record['origin'] = evento.get_origin() if evento.get_payload(): record['payload'] = evento.get_payload() if evento.get_timestamp(): record['timestamp'] = int(evento.get_timestamp()) record['subjects'] = [] for subject in evento.get_subjects(): sub = {} if subject.get_interpretation(): sub['interpretation'] = subject.get_interpretation() if subject.get_manifestation(): sub['manifestation'] = subject.get_manifestation() if subject.get_mimetype(): sub['mimetype'] = subject.get_mimetype() if subject.get_origin(): sub['origin'] = subject.get_origin() if subject.get_storage(): sub['storage'] = subject.get_storage() if subject.get_text(): sub['text'] = subject.get_text() if subject.get_uri(): sub['uri'] = subject.get_uri() record['subjects'].append(sub) return CouchRecord(record, self.object_type) def monitora_eventos(self, templates=None): '''Monitora por novos eventos para inseri-los no desktopcouch''' self.log('Monitorando por novos eventos') templates = templates or self.templates def evento_inserido(timerange, events, *args, **kws): self.log('Novo evento recebido') for evento in events: record = self.evento_para_record(evento) self.inserir_no_desktopcouch(record) def evento_removido(timerange, events_id, *args, **kws): '''IMPLEMENTE SUA REMOÇÃO AQUI''' self.log('Evento removido') pass self.monitor = ZeitgeistClient().install_monitor( TimeRange.always(), templates, evento_inserido, evento_removido) def parar_monitor(self): '''Para de monitorar por novos eventos''' self.log('Parar a monitoração por eventos') if self.monitor: ZeitgeistClient().remove_monitor(self.monitor) self.monitor = None if "__main__" == __name__: from dbus.mainloop.glib import DBusGMainLoop import gobject, logging logging.basicConfig(level=logging.INFO) DBusGMainLoop(set_as_default=True) mloop = gobject.MainLoop() alimentador = SuaClasse() alimentador.monitora_eventos() evento_link = alimentador.novo_link('http://www.vivaolinux.com.br/artigo/Banco-de-dados-orientados-a-documentos') alimentador.inserir_no_zeitgeist(evento_link) mloop.run()


Tendo unido os pontos, há duas opções para executar:
  • Rodar como script diretamente;
  • Criar uma extensão: para o Zeitgeist, ou para o Gnome-Activity-Journal ou outro.

Segue o código da extensão para Zeitgeist: “suaextensao.py”:

from _zeitgeist.engine.extension import Extension from seumodulo import SuaClasse class DesktopCouchFeeder(Extension): def __init__(self, *args, **kws): Extension.__init__(self, *args, **kws) alimentador = SuaClasse() alimentador.monitora_eventos() evento_link = alimentador.novo_link('http://www.vivaolinux.com.br/artigo/Banco-de-dados-orientados-a-documentos')


Neste caso, seus arquivos “suaextensao.py” e o módulo “seumodulo”, devem ficar no diretório:

-> $HOME/.local/share/zeitgeist/extensions/

Para criar como extensão para o Gnome Activity Journal (aka: GAJ), coloque o código abaixo e “seumodulo” em:

-> $HOME/.local/share/gnome-activity-journal/plugins/

“suaextensao.py”:

from seumodulo import SuaClasse __name__ = 'sua extensao' __description__ = 'sua extensao faz algo' alimentador = None def activate(client, store, window): """ Ativa a extensão """ alimentador = SuaClasse() alimentador.monitora_eventos() evento_link = alimentador.novo_link('http://www.vivaolinux.com.br/artigo/Banco-de-dados-orientados-a-documentos') def deactivate(client, store, window): """ desativa a extensão """ if alimentador: alimentador.parar_monitor()


Como o Zeitgeist está sendo reescrito em Vala, creio que em breve, não será mais possível criar extensões para ele em Python diretamente, só indiretamente, como o exemplo usando Gnome Activity Journal.

Agora que seus dados estão indo para o CouchDB, você pode realizar a sincronização do CouchDB com outros servidores.

A ideia inicial seria sincronizar com o servidor do Ubuntu One, mas como informado anteriormente, esta funcionalidade será descontinuada pelo Ubuntu One. Mesmo assim, ainda é possível sincronizar o CouchDB com qualquer outro servidor ou máquina.

Espero que este conteúdo venha a ser útil.
Página anterior    

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

Criando um leitor de RSS com Python

Port Scanner com Python

Crie um bot para Telegram e gerencie a escala de plantonistas

Pydev - Preparando o Eclipse para o Python

Introdução a Threads e como implementá-las em Python

  
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