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
This commit is contained in:
Thomas Adamcik 2013-12-24 00:22:58 +01:00
parent e065f349db
commit d93d3e6fcd
11 changed files with 41 additions and 9 deletions

View File

@ -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.

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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',
}
}

View File

@ -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()

View File

@ -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',
}
}

View File

@ -21,6 +21,7 @@ class LocalPlaylistsProviderTest(unittest.TestCase):
'local': {
'media_dir': path_to_data_dir(''),
'data_dir': path_to_data_dir(''),
'library': 'json',
}
}

View File

@ -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 = [