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

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

Qu1cksc0pe - All-in-One Static Malware Analysis Tool

Python - Usando requests anônimos através da rede Tor

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

Embutindo imagens nos scripts Python para aplicações Tkinter

Arduino com Bluetooth e pySerial

  
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