From d93d3e6fcdfb0076ea467ae7cac0789f322f87f7 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Tue, 24 Dec 2013 00:22:58 +0100 Subject: [PATCH] local: Add local/library config value - Updated library provider to support missing library - Added config value to select local library provider - Updated tests to use library config value --- docs/ext/local.rst | 5 +++++ mopidy/backends/local/__init__.py | 10 ++++++++-- mopidy/backends/local/actor.py | 13 ++++++++++--- mopidy/backends/local/ext.conf | 1 + mopidy/backends/local/library.py | 8 ++++++++ mopidy/ext.py | 4 +--- tests/backends/local/events_test.py | 1 + tests/backends/local/library_test.py | 5 ++++- tests/backends/local/playback_test.py | 1 + tests/backends/local/playlists_test.py | 1 + tests/backends/local/tracklist_test.py | 1 + 11 files changed, 41 insertions(+), 9 deletions(-) diff --git a/docs/ext/local.rst b/docs/ext/local.rst index eed51829..5cf4b2d3 100644 --- a/docs/ext/local.rst +++ b/docs/ext/local.rst @@ -35,6 +35,11 @@ Configuration values If the local extension should be enabled or not. +.. confval:: local/library + + Local library provider to use, change this if you want to use a third party + library for local files. + .. confval:: local/media_dir Path to directory with local media files. diff --git a/mopidy/backends/local/__init__.py b/mopidy/backends/local/__init__.py index e0e917f7..d42f08ce 100644 --- a/mopidy/backends/local/__init__.py +++ b/mopidy/backends/local/__init__.py @@ -21,6 +21,7 @@ class Extension(ext.Extension): def get_config_schema(self): schema = super(Extension, self).get_config_schema() + schema['library'] = config.String() schema['media_dir'] = config.Path() schema['data_dir'] = config.Path() schema['playlists_dir'] = config.Path() @@ -30,9 +31,14 @@ class Extension(ext.Extension): schema['excluded_file_extensions'] = config.List(optional=True) return schema - def get_backend_classes(self): + def setup(self, registry): from .actor import LocalBackend - return [LocalBackend] + from .json import JsonLibrary + + LocalBackend.libraries = registry['local:library'] + + registry.add('backend', LocalBackend) + registry.add('local:library', JsonLibrary) def get_command(self): from .commands import LocalCommand diff --git a/mopidy/backends/local/actor.py b/mopidy/backends/local/actor.py index 3da246db..5925f993 100644 --- a/mopidy/backends/local/actor.py +++ b/mopidy/backends/local/actor.py @@ -8,7 +8,6 @@ import pykka from mopidy.backends import base from mopidy.utils import encoding, path -from .json import JsonLibrary from .library import LocalLibraryProvider from .playback import LocalPlaybackProvider from .playlists import LocalPlaylistsProvider @@ -18,6 +17,7 @@ logger = logging.getLogger('mopidy.backends.local') class LocalBackend(pykka.ThreadingActor, base.Backend): uri_schemes = ['local'] + libraries = [] def __init__(self, config, audio): super(LocalBackend, self).__init__() @@ -26,8 +26,15 @@ class LocalBackend(pykka.ThreadingActor, base.Backend): self.check_dirs_and_files() - # TODO: move to getting this from registry - library = JsonLibrary(config) + libraries = dict((l.name, l) for l in self.libraries) + library_name = config['local']['library'] + + if library_name in libraries: + library = libraries[library_name](config) + logger.debug('Using %s as the local library', library_name) + else: + library = None + logger.warning('Local library %s not found', library_name) self.playback = LocalPlaybackProvider(audio=audio, backend=self) self.playlists = LocalPlaylistsProvider(backend=self) diff --git a/mopidy/backends/local/ext.conf b/mopidy/backends/local/ext.conf index e826a451..5f83db05 100644 --- a/mopidy/backends/local/ext.conf +++ b/mopidy/backends/local/ext.conf @@ -1,5 +1,6 @@ [local] enabled = true +library = json media_dir = $XDG_MUSIC_DIR data_dir = $XDG_DATA_DIR/mopidy/local playlists_dir = $XDG_DATA_DIR/mopidy/local/playlists diff --git a/mopidy/backends/local/library.py b/mopidy/backends/local/library.py index 89a6da4d..aeb7736b 100644 --- a/mopidy/backends/local/library.py +++ b/mopidy/backends/local/library.py @@ -15,15 +15,23 @@ class LocalLibraryProvider(base.BaseLibraryProvider): self.refresh() def refresh(self, uri=None): + if not self._library: + return 0 num_tracks = self._library.load() logger.info('Loaded %d local tracks using %s', num_tracks, self._library.name) def lookup(self, uri): + if not self._library: + return [] return self._library.lookup(uri) def find_exact(self, query=None, uris=None): + if not self._library: + return None return self._library.search(query=query, uris=uris, exact=True) def search(self, query=None, uris=None): + if not self._library: + return None return self._library.search(query=query, uris=uris, exact=False) diff --git a/mopidy/ext.py b/mopidy/ext.py index c79ebe40..a9ca2519 100644 --- a/mopidy/ext.py +++ b/mopidy/ext.py @@ -69,9 +69,6 @@ class Extension(object): for frontend_class in self.get_frontend_classes(): registry.add('frontend', frontend_class) - for library_updater in self.get_library_updaters(): - registry.add('local:library', library_updater) - self.register_gstreamer_elements() def get_frontend_classes(self): @@ -92,6 +89,7 @@ class Extension(object): """ return [] + # TODO: remove def get_library_updaters(self): """List of library updater classes diff --git a/tests/backends/local/events_test.py b/tests/backends/local/events_test.py index 2424ed42..967d4cdb 100644 --- a/tests/backends/local/events_test.py +++ b/tests/backends/local/events_test.py @@ -19,6 +19,7 @@ class LocalBackendEventsTest(unittest.TestCase): 'media_dir': path_to_data_dir(''), 'data_dir': path_to_data_dir(''), 'playlists_dir': b'', + 'library': 'json', } } diff --git a/tests/backends/local/library_test.py b/tests/backends/local/library_test.py index 9bfcb233..40bece7d 100644 --- a/tests/backends/local/library_test.py +++ b/tests/backends/local/library_test.py @@ -7,7 +7,7 @@ import unittest import pykka from mopidy import core -from mopidy.backends.local import actor +from mopidy.backends.local import actor, json from mopidy.models import Track, Album, Artist from tests import path_to_data_dir @@ -63,10 +63,12 @@ class LocalLibraryProviderTest(unittest.TestCase): 'media_dir': path_to_data_dir(''), 'data_dir': path_to_data_dir(''), 'playlists_dir': b'', + 'library': 'json', }, } def setUp(self): + actor.LocalBackend.libraries = [json.JsonLibrary] self.backend = actor.LocalBackend.start( config=self.config, audio=None).proxy() self.core = core.Core(backends=[self.backend]) @@ -74,6 +76,7 @@ class LocalLibraryProviderTest(unittest.TestCase): def tearDown(self): pykka.ActorRegistry.stop_all() + actor.LocalBackend.libraries = [] def test_refresh(self): self.library.refresh() diff --git a/tests/backends/local/playback_test.py b/tests/backends/local/playback_test.py index 4da420ef..7d48cfea 100644 --- a/tests/backends/local/playback_test.py +++ b/tests/backends/local/playback_test.py @@ -24,6 +24,7 @@ class LocalPlaybackProviderTest(unittest.TestCase): 'media_dir': path_to_data_dir(''), 'data_dir': path_to_data_dir(''), 'playlists_dir': b'', + 'library': 'json', } } diff --git a/tests/backends/local/playlists_test.py b/tests/backends/local/playlists_test.py index 447de3f8..6c602282 100644 --- a/tests/backends/local/playlists_test.py +++ b/tests/backends/local/playlists_test.py @@ -21,6 +21,7 @@ class LocalPlaylistsProviderTest(unittest.TestCase): 'local': { 'media_dir': path_to_data_dir(''), 'data_dir': path_to_data_dir(''), + 'library': 'json', } } diff --git a/tests/backends/local/tracklist_test.py b/tests/backends/local/tracklist_test.py index 14bf678d..28def50c 100644 --- a/tests/backends/local/tracklist_test.py +++ b/tests/backends/local/tracklist_test.py @@ -20,6 +20,7 @@ class LocalTracklistProviderTest(unittest.TestCase): 'media_dir': path_to_data_dir(''), 'data_dir': path_to_data_dir(''), 'playlists_dir': b'', + 'library': 'json', } } tracks = [