Ejemplo n.º 1
0
class ZeitgeistPlugin(PluginClass):

    plugin_info = {
        'name': _('Log events with Zeitgeist'),  # T: plugin name
        'description':
        _('Pushes events to the Zeitgeist daemon.'),  # T: plugin description
        'author': 'Marcel Stimberg',
        'help': 'Plugins:Log events with Zeitgeist',
    }

    @classmethod
    def check_dependencies(klass):
        has_zeitgeist = not ZeitgeistClient is None
        return has_zeitgeist, [('libzeitgeist', has_zeitgeist, False)]

    def __init__(self, ui):
        PluginClass.__init__(self, ui)
        try:
            self.zeitgeist_client = ZeitgeistClient()
            self.zeitgeist_client.register_data_source(
                'application://zim.desktop', 'Zim', _('Zim Desktop Wiki'),
                [])  # T: short description of zim
        except RuntimeError, e:
            logger.exception(
                'Loading zeitgeist client failed, will not log events')
            self.zeitgeist_client = None
Ejemplo n.º 2
0
class ZeitgeistPlugin(PluginClass):

    plugin_info = {
        'name': _('Log events with Zeitgeist'),  # T: plugin name
        'description':
        _('Pushes events to the Zeitgeist daemon.'),  # T: plugin description
        'author': 'Marcel Stimberg',
        'help': 'Plugins:Log events with Zeitgeist',
    }

    @classmethod
    def check_dependencies(klass):
        has_zeitgeist = not ZeitgeistClient is None
        return has_zeitgeist, [('libzeitgeist', has_zeitgeist, False)]

    def __init__(self, config=None):
        PluginClass.__init__(self, config)
        try:
            self.zeitgeist_client = ZeitgeistClient()
            self.zeitgeist_client.register_data_source(
                'application://zim.desktop', 'Zim', _('Zim Desktop Wiki'),
                [])  # T: short description of zim
        except RuntimeError as e:
            logger.exception(
                'Loading zeitgeist client failed, will not log events')
            self.zeitgeist_client = None

    def create_and_send_event(self, page, event_type):
        if not self.zeitgeist_client:
            return

        if not hasattr(page, 'source') \
        or not isinstance(page.source, File):
            return

        uri = page.source.uri
        origin = Gio.File(uri).get_parent().get_uri()
        text = _('Wiki page: %s') % page.name
        # T: label for how zim pages show up in the recent files menu, %s is the page name

        subject = Subject.new_for_values(
            mimetype='text/x-zim-wiki',
            uri=uri,
            origin=origin,
            interpretation=Interpretation.TEXT_DOCUMENT,
            manifestation=Manifestation.FILE_DATA_OBJECT,
            text=text)
        event = Event.new_for_values(actor='application://zim.desktop',
                                     interpretation=event_type,
                                     manifestation=Manifestation.USER_ACTIVITY,
                                     subjects=[
                                         subject,
                                     ])

        self.zeitgeist_client.insert_event(event)
Ejemplo n.º 3
0
 def _get_client(self, bus_name, app_uri, app_name, app_description,
                 event_template):
     client = None
     try:
         client = ZeitgeistClient()
         if hasattr(self.client, "register_data_source"):
             client.register_data_source(
                 bus_name,
                 app_name or bus_name,
                 app_description or bus_name,
                 event_template or \
                 [Event.new_for_values(actor=app_uri)])
         self.log(logging.DEBUG, 'your client was set')
     except Exception as e:
         self.log(logging.ERROR, 'S.O.S: %s', e)
         raise
     return client
Ejemplo n.º 4
0
 def _get_client(self, bus_name, app_uri,
                 app_name, app_description,
                 event_template):
     client = None
     try:
         client = ZeitgeistClient()
         if hasattr(self.client, "register_data_source"):
             client.register_data_source(
                 bus_name,
                 app_name or bus_name,
                 app_description or bus_name,
                 event_template or \
                 [Event.new_for_values(actor=app_uri)])
         self.log(logging.DEBUG, 'your client was set')
     except Exception as e:
         self.log(logging.ERROR, 'S.O.S: %s', e)
         raise
     return client
Ejemplo n.º 5
0
class ZeitgeistPlugin(PluginClass):

    plugin_info = {
        'name': _('Log events with Zeitgeist'), # T: plugin name
        'description': _('Pushes events to the Zeitgeist daemon.'), # T: plugin description
        'author': 'Marcel Stimberg',
        'help': 'Plugins:Log events with Zeitgeist',
    }

    @classmethod
    def check_dependencies(klass):
        has_zeitgeist = not ZeitgeistClient is None
        return has_zeitgeist, [('libzeitgeist', has_zeitgeist, False)]

    def __init__(self, ui):
        PluginClass.__init__(self, ui)
        try:
            self.zeitgeist_client = ZeitgeistClient()
            self.zeitgeist_client.register_data_source('application://zim.desktop',
                'Zim', _('Zim Desktop Wiki'), []) # T: short description of zim
        except RuntimeError, e:
            logger.exception('Loading zeitgeist client failed, will not log events')
            self.zeitgeist_client = None
Ejemplo n.º 6
0
class ZeitgeistIntegration(plugin.Plugin):
    '''
    Plugin that enables integration with the Zeitgeist Framework.
    '''

    def initialize(self):
        '''
        Inicializes the Zeitgeist client and registers itself as a Zeitgeist
        data source.
        '''
        self.logger.info('Initialiazing zeitgeist plugin')
        editor = self.locator.get_service('editor')
        editor.fileOpened.connect(self._zeitgeist_log_file_open)
        editor.fileSaved.connect(self._zeitgeist_log_file_modified)

        #initialize zeitgeist client
        self.zeitgeist = ZeitgeistClient()
        self._register_data_source()

    def finish(self):
        '''
        Deletes the reference to the Zeitgeist client.
        '''
        # remove zeitgeist client
        del self.zeitgeist

        self.logger.info('Shutting down zeitgeist plugin')

    def _register_data_source(self):
        '''
        Registers the plugin as a Zeitgeist data source.
        '''
        unique_id = 'org.ninja.ide'
        name = 'Ninja IDE'
        description = 'Very versatile Python IDE'

        # Describe what sort of events will be inserted
        templates = []
        for interp in (Interpretation.EVENT_INTERPRETATION.ACCESS_EVENT,
            Interpretation.EVENT_INTERPRETATION.MODIFY_EVENT,
            Interpretation.EVENT_INTERPRETATION.LEAVE_EVENT,
            Interpretation.EVENT_INTERPRETATION.CREATE_EVENT):

            event_template = Event()
            event_template.interpretation = interp
            event_template.manifestation = Manifestation.USER_ACTIVITY

            for subj_interp in (Interpretation.DOCUMENT.TEXT_DOCUMENT.
                PLAIN_TEXT_DOCUMENT.SOURCE_CODE,
                Interpretation.DOCUMENT.TEXT_DOCUMENT.PLAIN_TEXT_DOCUMENT):

                subject_template = Subject()
                subject_template.interpretation = subj_interp
                subject_template.manifestation = Manifestation.FILE_DATA_OBJECT
                event_template.append_subject(subject_template)

            templates.append(event_template)

        self.zeitgeist.register_data_source(unique_id, name, description,
            templates)

    def _zeitgeist_log_event(self, fileName, interpretation):
        '''
        Registers an event over the file with a given interpretation.
        '''
        fileName = unicode(fileName)

        self.logger.info('Inserting event for %s' % fileName)

        subject = Subject.new_for_values(
            uri='file://%s' % fileName,
            origin='file://%s' % path.dirname(fileName),
            text=path.basename(fileName))
        event = Event.new_for_values(
            timestamp=int(time.time() * 1000),
            interpretation=interpretation,
            manifestation=Manifestation.USER_ACTIVITY,
            actor='application://ninja-ide.desktop',
            subjects=[subject])

        def on_id_received(event_ids):
            self.logger.info(
                'Logged %r with event id %d.' % (fileName, event_ids[0]))

        self.zeitgeist.insert_events([event], on_id_received)

    def _zeitgeist_log_file_open(self, fileName):
        '''
        Registers an event everytime Ninja IDE opens a file.
        '''
        self._zeitgeist_log_event(unicode(fileName),
            Interpretation.EVENT_INTERPRETATION.ACCESS_EVENT)

    def _zeitgeist_log_file_modified(self, fileName):
        '''
        Registers an event everytime Ninja IDE modifies a file.
        '''
        self._zeitgeist_log_event(unicode(fileName),
            Interpretation.EVENT_INTERPRETATION.MODIFY_EVENT)
Ejemplo n.º 7
0
class Zeitgeist(modules.ThreadedModule):


    def __init__(self):
        """ Constructor """
        handlers = {
                        consts.MSG_EVT_APP_QUIT:     self.onModUnloaded,
                        consts.MSG_EVT_NEW_TRACK:    self.onNewTrack,
                        consts.MSG_EVT_MOD_LOADED:   self.onModLoaded,
                        consts.MSG_EVT_APP_STARTED:  self.onModLoaded,
                        consts.MSG_EVT_MOD_UNLOADED: self.onModUnloaded,
                   }

        modules.ThreadedModule.__init__(self, handlers)


    # --== Message handlers ==--


    def onModLoaded(self):
        """ The module has been loaded """
        self.client = None

        try:
            from zeitgeist.client import ZeitgeistClient
            from zeitgeist.datamodel import Event

            self.client = ZeitgeistClient()
            if self.client.get_version() >= [0, 3, 2, 999]:
                self.client.register_data_source("Pogo", "Pogo", "Play your music",
                            [Event.new_for_values(actor="application://pogo.desktop")])
        except:
            logger.info('[%s] Could not create Zeitgeist client\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc()))


    def onModUnloaded(self):
        """ The module has been unloaded """
        self.client = None


    def onNewTrack(self, track):
        """ Send track information to Zeitgeist """
        if self.client is None:
            return

        from zeitgeist.datamodel import Interpretation

        if hasattr(Interpretation, 'ACCESS_EVENT'):
            event_type = Interpretation.ACCESS_EVENT
        else:
            event_type = Interpretation.OPEN_EVENT

        self.send_to_zeitgeist(track, event_type)


    def send_to_zeitgeist(self, track, event_type):
        """
        Other players (e.g. Rhythmbox) log the playing of individual files, but
        we want to log albums.

        Maybe it would be better to log individual files, but then we would have
        to distinguish between Manifestation.USER_ACTIVITY and
        Manifestation.SCHEDULED_ACTIVITY.

        Another possible addition would be logging Interpretation.LEAVE_EVENT.
        """
        import mimetypes, os.path

        from zeitgeist.datamodel import Event, Subject, Interpretation, Manifestation

        mime, encoding = mimetypes.guess_type(track.getFilePath(), strict=False)

        title = track.getTitle()
        album = track.getAlbum()
        artist = track.getArtist()
        uri = track.getURI()
        origin = os.path.dirname(uri)

        # Handle "unknown" tags
        if 'unknown' in title.lower():
            title = track.getBasename()
        if 'unknown' in album.lower():
            album = ''
        if 'unknown' in artist.lower():
            artist = ''

        subject = Subject.new_for_values(
            uri            = origin,
            text           = ' - '.join([part for part in [artist, album] if part]),
            mimetype       = mime,
            manifestation  = unicode(Manifestation.FILE_DATA_OBJECT),
            interpretation = unicode(Interpretation.AUDIO),
            origin         = origin,
        )

        event = Event.new_for_values(
            actor          = "application://pogo.desktop",
            subjects       = [subject,],
            interpretation = unicode(event_type),
            timestamp      = int(time.time() * 1000),
        )

        self.client.insert_event(event)