Changeset 123

Show
Ignore:
Timestamp:
03/24/06 19:32:05 (3 years ago)
Author:
nicfit
Message:

More plugin work, plugins are only instantiated if the config requests it

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Makefile.in

    r118 r123  
    5454        install -m 644 ./src/*.png ${libdir} 
    5555        install -m 644 ./src/*.svg ${libdir} 
     56        # Plugins 
     57        install -m 755 -d ${libdir}/plugins 
     58        install -m 644 ./src/*.py ${libdir}/plugins 
     59        install -m 644 ./src/*.glade ${libdir}/plugins 
    5660 
    5761        install -m 755 -d ${docdir} 
  • trunk/src/audio_control.py

    r113 r123  
    2626import mesk 
    2727_ = mesk.common.i18n._ 
     28from mesk.plugin_events import AudioControlListener 
    2829 
    2930class AudioControl(gobject.GObject): 
     
    106107 
    107108        self.set_widget_sensitivites() 
     109        self._plugins = \ 
     110            mesk.plugin.get_manager().get_plugins(AudioControlListener) 
     111        # FIXME 
     112        #print self._plugins 
    108113 
    109114    def set_playlist(self, pl): 
  • trunk/src/main.py

    r121 r123  
    4141        plugin_mgr = mesk.plugin.PluginMgr(mesk.PLUGINS_DIR) 
    4242        mesk.plugin.set_manager(plugin_mgr) 
    43         print mesk.plugin.get_manager().get_plugins() 
    4443         
    4544        self.main_window = MainWindow() 
  • trunk/src/mesk/__init__.py

    r122 r123  
    6060                  _('Logging level. May be CRITICAL, ERROR, WARNING, INFO, ' 
    6161                    'VERBOSE, or DEBUG')], 
     62    'plugins': [str, '', _('A list of plugins (separated by \';\') to activate ' 
     63                           'on startup.')], 
    6264    }, 
    6365 
     
    113115import mesk.audio_source 
    114116import mesk.plugin 
     117import mesk.plugin_events 
  • trunk/src/mesk/plugin.py

    r121 r123  
    4949 
    5050    SYS_PLUGINS_DIR = './plugins' 
     51    PLUGIN_TUPLE_LEN = 5 
     52    (NAME, 
     53     DESCRIPTION, 
     54     AUTHOR, 
     55     URL, 
     56     FACTORY) = range(PLUGIN_TUPLE_LEN) 
    5157 
    5258    def __init__(self, plugins_dir): 
     
    5561        sys.path.append(self.SYS_PLUGINS_DIR) 
    5662 
    57         def plugins(root): 
     63        def load_plugins(root): 
    5864            plgins = [] 
    5965            for file in os.listdir(root): 
     
    6470            return plgins 
    6571 
    66         self.__plugins = {} 
    67         sys_plugins = plugins(self.SYS_PLUGINS_DIR) 
    68         user_plugins = plugins(plugins_dir) 
     72        self.__plugins = {}     # Loaded and active plugins 
     73        self.__all_plugins = [] # All available plugins 
     74                                # Each element in the list is an 5-tuple: 
     75                                # (NAME, DESCRIPTION, AUTHOR, URL, FACTORY) 
     76        load_plugins(self.SYS_PLUGINS_DIR) 
     77        load_plugins(plugins_dir) 
    6978        # The order of this loop dictates that user plugins override 
    7079        # system plugins 
    71         for plugin in (sys_plugins + user_plugins): 
    72             self.__plugins[plugin.name] = plugin 
     80        active_plugins = mesk.config.get(mesk.CONFIG_MAIN, 'plugins') 
     81        active_plugins = active_plugins.split(';') 
     82        for plugin_info in self.__all_plugins: 
     83            if plugin_info[self.NAME] in active_plugins: 
     84                mesk.log.info('Activating \'%s\' plugin' % \ 
     85                              plugin_info[self.NAME]) 
     86                plugin = plugin_info[self.FACTORY]() 
     87                self.__plugins[plugin_info[self.NAME]] = plugin 
    7388 
    74     def get_plugins(self): 
    75         return [plugin for plugin in self.__plugins.values()] 
     89    def get_plugins(self, type = None): 
     90        if not type: 
     91            return [plugin for plugin in self.__plugins.values()] 
     92 
     93        plugins = [] 
     94        for p in self.__plugins.values(): 
     95            if isinstance(p, type): 
     96                plugins.append(p) 
     97        return plugins 
    7698 
    7799    def load_plugin(self, plugin_file): 
     
    88110            __import__(module) 
    89111            module = sys.modules[module] 
    90             entry_point = getattr(module, 'create_plugin') 
    91             plugin = entry_point() 
     112            plugin_info = self._make_plugin_tuple(module) 
     113            if plugin_info: 
     114                self.__all_plugins.append(plugin_info) 
    92115        except Exception, ex: 
    93116            mesk.log.error('Plugin \'%s\' failed to load: %s' % (module, 
     
    101124 
    102125        return plugin 
     126 
     127    def _make_plugin_tuple(self, module): 
     128        try: 
     129            name = getattr(module, 'NAME') 
     130            descr = getattr(module, 'DESCRIPTION') 
     131            author = getattr(module, 'AUTHOR') 
     132            url = getattr(module, 'URL') 
     133            factory = getattr(module, 'create_plugin') 
     134            return (name, descr, author, url, factory) 
     135        except AttributeError, ex: 
     136            mesk.log.verbose('Skipping non plugin module: %s' % str(ex)) 
     137            return None 
  • trunk/src/plugins/audioscrobbler.py

    r122 r123  
    2424_ = mesk.common.i18n._ 
    2525from mesk.plugin import Plugin 
     26from mesk.plugin_events import SourceListener 
     27 
     28# Required variables 
     29NAME = 'audioscrobbler' 
     30DESCRIPTION = _('Submits played songs to last.fm') 
     31AUTHOR = 'Travis Shirk <travis@pobox.com>' 
     32URL = 'http://mesk.nicfit.net/plugins/' 
    2633 
    2734PROTOCOL_VERSION = '1.1' 
     
    3643CONFIG_SECTION = 'audioscrobbler' 
    3744 
    38 class AudioscrobblerPlugin(Plugin): 
     45class AudioscrobblerPlugin(Plugin, SourceListener): 
    3946 
    4047    def __init__(self): 
    41         Plugin.__init__(self, 'audioscrobbler', 
    42                         _('Submits played songs to last.fm'), 
    43                         'Travis Shirk <travis@pobox.com>', 
    44                         'http://mesk.nicfit.net/plugins/') 
     48        Plugin.__init__(self, NAME, DESCRIPTION, AUTHOR, URL) 
    4549 
    4650        self.user = '' 
     
    6569        pass 
    6670 
    67     def on_play(self): 
    68         pass 
    69     def on_pause(self): 
    70         pass 
    71     def on_stop(self): 
    72         pass 
     71    def on_plugin_source_started(self, audio_source): 
     72        print "on_plugin_source_started", audio_source 
     73    def on_plugin_source_ended(self, audio_source): 
     74        print "on_plugin_source_ended", audio_source 
    7375 
    7476def create_plugin():