diff --git a/mopidy/__main__.py b/mopidy/__main__.py index 03da85b9..1a134cc5 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -55,7 +55,8 @@ def main(): log.setup_logging( logging_config, options.verbosity_level, options.save_debug_log) - all_extensions = ext.load_extensions() + installed_extensions = ext.load_extensions() + all_extensions = ext.validate_extensions(installed_extensions) # TODO: wrap config in RO proxy. config, config_errors = get_config( @@ -76,6 +77,8 @@ def main(): create_file_structures() check_old_locations() + ext.register_gstreamer_elements(enabled_extensions) + # Anything that wants to exit after this point must use # mopidy.utils.process.exit_process as actors have been started. audio = setup_audio(config) diff --git a/mopidy/config/__init__.py b/mopidy/config/__init__.py index 20c2315e..3a96b556 100644 --- a/mopidy/config/__init__.py +++ b/mopidy/config/__init__.py @@ -10,7 +10,7 @@ from mopidy.config.schemas import * from mopidy.config.types import * from mopidy.utils import path -logger = logging.getLogger('mopdiy.config') +logger = logging.getLogger('mopidy.config') _config_dir = os.path.dirname(__file__) diff --git a/mopidy/ext.py b/mopidy/ext.py index 9d30afd1..8a8a1beb 100644 --- a/mopidy/ext.py +++ b/mopidy/ext.py @@ -91,39 +91,75 @@ class Extension(object): def load_extensions(): - extensions = [] + """Find all installed extensions. + + :returns: list of installed extensions + """ + + installed_extensions = [] + for entry_point in pkg_resources.iter_entry_points('mopidy.ext'): logger.debug('Loading entry point: %s', entry_point) - - try: - extension_class = entry_point.load() - except pkg_resources.DistributionNotFound as ex: - logger.info( - 'Disabled extension %s: Dependency %s not found', - entry_point.name, ex) - continue - + extension_class = entry_point.load(require=False) extension = extension_class() - + extension.entry_point = entry_point + installed_extensions.append(extension) logger.debug( 'Loaded extension: %s %s', extension.dist_name, extension.version) - if entry_point.name != extension.ext_name: + names = (e.ext_name for e in installed_extensions) + logging.debug('Discovered extensions: %s', ', '.join(names)) + return installed_extensions + + +def validate_extensions(installed_extensions): + """Verify extension's dependencies and environment. + + :param installed_extensions: list of installed extensions + :returns: list of valid extensions + """ + + valid_extensions = [] + + for extension in installed_extensions: + logger.debug('Validating extension: %s', extension.ext_name) + + if extension.ext_name != extension.entry_point.name: logger.warning( 'Disabled extension %(ep)s: entry point name (%(ep)s) ' 'does not match extension name (%(ext)s)', - {'ep': entry_point.name, 'ext': extension.ext_name}) + {'ep': extension.entry_point.name, 'ext': extension.ext_name}) + continue + + try: + extension.entry_point.require() + except pkg_resources.DistributionNotFound as ex: + logger.info( + 'Disabled extension %s: Dependency %s not found', + extension.ext_name, ex) continue try: extension.validate_environment() except exceptions.ExtensionError as ex: logger.info( - 'Disabled extension %s: %s', entry_point.name, ex.message) + 'Disabled extension %s: %s', extension.ext_name, ex.message) continue - extensions.append(extension) + valid_extensions.append(extension) - names = (e.ext_name for e in extensions) - logging.debug('Discovered extensions: %s', ', '.join(names)) - return extensions + names = (e.ext_name for e in valid_extensions) + logger.debug('Valid extensions: %s', ', '.join(names)) + return valid_extensions + + +def register_gstreamer_elements(enabled_extensions): + """Registers custom GStreamer elements from extensions. + + :params enabled_extensions: list of enabled extensions + """ + + for extension in enabled_extensions: + logger.debug( + 'Registering GStreamer elements for: %s', extension.ext_name) + extension.register_gstreamer_elements()