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.