From 13ece433634a9697a5921f787fe56a148e7fabef Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 2 Nov 2010 23:07:15 +0100 Subject: [PATCH] Split BaseLibraryController in controller and provider --- docs/api/backends/providers.rst | 8 +++ mopidy/backends/base/__init__.py | 2 +- mopidy/backends/base/library.py | 61 ++++++++++++++++++-- mopidy/backends/dummy/__init__.py | 13 +++-- mopidy/backends/libspotify/__init__.py | 9 ++- mopidy/backends/libspotify/library.py | 4 +- mopidy/backends/local/__init__.py | 26 +++++---- tests/frontends/mpd/current_playlist_test.py | 8 +-- 8 files changed, 100 insertions(+), 31 deletions(-) diff --git a/docs/api/backends/providers.rst b/docs/api/backends/providers.rst index 0b042241..9289dd06 100644 --- a/docs/api/backends/providers.rst +++ b/docs/api/backends/providers.rst @@ -25,6 +25,14 @@ Stored playlists provider :undoc-members: +Library provider +================ + +.. autoclass:: mopidy.backends.base.BaseLibraryProvider + :members: + :undoc-members: + + Backend provider implementations ================================ diff --git a/mopidy/backends/base/__init__.py b/mopidy/backends/base/__init__.py index 7ee86015..70b17397 100644 --- a/mopidy/backends/base/__init__.py +++ b/mopidy/backends/base/__init__.py @@ -9,7 +9,7 @@ from mopidy.models import Playlist from mopidy.utils import get_class from .current_playlist import BaseCurrentPlaylistController -from .library import BaseLibraryController +from .library import BaseLibraryController, BaseLibraryProvider from .playback import BasePlaybackController, BasePlaybackProvider from .stored_playlists import (BaseStoredPlaylistsController, BaseStoredPlaylistsProvider) diff --git a/mopidy/backends/base/library.py b/mopidy/backends/base/library.py index 94f40863..a1df83cd 100644 --- a/mopidy/backends/base/library.py +++ b/mopidy/backends/base/library.py @@ -8,12 +8,13 @@ class BaseLibraryController(object): :type backend: :class:`BaseBackend` """ - def __init__(self, backend): + def __init__(self, backend, provider): self.backend = backend + self.provider = provider def destroy(self): """Cleanup after component.""" - pass + self.provider.destroy() def find_exact(self, **query): """ @@ -32,7 +33,7 @@ class BaseLibraryController(object): :type query: dict :rtype: :class:`mopidy.models.Playlist` """ - raise NotImplementedError + return self.provider.find_exact(**query) def lookup(self, uri): """ @@ -42,7 +43,7 @@ class BaseLibraryController(object): :type uri: string :rtype: :class:`mopidy.models.Track` or :class:`None` """ - raise NotImplementedError + return self.provider.lookup(uri) def refresh(self, uri=None): """ @@ -51,7 +52,7 @@ class BaseLibraryController(object): :param uri: directory or track URI :type uri: string """ - raise NotImplementedError + return self.provider.refresh(uri) def search(self, **query): """ @@ -70,4 +71,54 @@ class BaseLibraryController(object): :type query: dict :rtype: :class:`mopidy.models.Playlist` """ + return self.provider.search(**query) + + +class BaseLibraryProvider(object): + """ + :param backend: backend the controller is a part of + :type backend: :class:`BaseBackend` + """ + + def __init__(self, backend): + self.backend = backend + + def destroy(self): + """ + Cleanup after component. + + *MAY be implemented by subclasses.* + """ + pass + + def find_exact(self, **query): + """ + See :meth:`mopidy.backends.base.BaseLibraryController.find_exact`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def lookup(self, uri): + """ + See :meth:`mopidy.backends.base.BaseLibraryController.lookup`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def refresh(self, uri=None): + """ + See :meth:`mopidy.backends.base.BaseLibraryController.refresh`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def search(self, **query): + """ + See :meth:`mopidy.backends.base.BaseLibraryController.search`. + + *MUST be implemented by subclass.* + """ raise NotImplementedError diff --git a/mopidy/backends/dummy/__init__.py b/mopidy/backends/dummy/__init__.py index 6b259338..df4428e3 100644 --- a/mopidy/backends/dummy/__init__.py +++ b/mopidy/backends/dummy/__init__.py @@ -1,6 +1,7 @@ from mopidy.backends.base import (BaseBackend, BaseCurrentPlaylistController, BasePlaybackController, BasePlaybackProvider, BaseLibraryController, - BaseStoredPlaylistsController, BaseStoredPlaylistsProvider) + BaseLibraryProvider, BaseStoredPlaylistsController, + BaseStoredPlaylistsProvider) from mopidy.models import Playlist @@ -27,7 +28,9 @@ class DummyBackend(BaseBackend): self.current_playlist = BaseCurrentPlaylistController(backend=self) - self.library = DummyLibraryController(backend=self) + library_provider = DummyLibraryProvider(backend=self) + self.library = BaseLibraryController(backend=self, + provider=library_provider) playback_provider = DummyPlaybackProvider(backend=self) self.playback = BasePlaybackController(backend=self, @@ -40,8 +43,10 @@ class DummyBackend(BaseBackend): self.uri_handlers = [u'dummy:'] -class DummyLibraryController(BaseLibraryController): - _library = [] +class DummyLibraryProvider(BaseLibraryProvider): + def __init__(self, *args, **kwargs): + super(DummyLibraryProvider, self).__init__(*args, **kwargs) + self._library = [] def find_exact(self, **query): return Playlist() diff --git a/mopidy/backends/libspotify/__init__.py b/mopidy/backends/libspotify/__init__.py index 98b9e884..0eefcd41 100644 --- a/mopidy/backends/libspotify/__init__.py +++ b/mopidy/backends/libspotify/__init__.py @@ -2,7 +2,8 @@ import logging from mopidy import settings from mopidy.backends.base import (BaseBackend, BaseCurrentPlaylistController, - BasePlaybackController, BaseStoredPlaylistsController) + BaseLibraryController, BasePlaybackController, + BaseStoredPlaylistsController) logger = logging.getLogger('mopidy.backends.libspotify') @@ -34,7 +35,7 @@ class LibspotifyBackend(BaseBackend): # missing spotify dependencies. def __init__(self, *args, **kwargs): - from .library import LibspotifyLibraryController + from .library import LibspotifyLibraryProvider from .playback import LibspotifyPlaybackProvider from .stored_playlists import LibspotifyStoredPlaylistsProvider @@ -42,7 +43,9 @@ class LibspotifyBackend(BaseBackend): self.current_playlist = BaseCurrentPlaylistController(backend=self) - self.library = LibspotifyLibraryController(backend=self) + library_provider = LibspotifyLibraryProvider(backend=self) + self.library = BaseLibraryController(backend=self, + provider=library_provider) playback_provider = LibspotifyPlaybackProvider(backend=self) self.playback = BasePlaybackController(backend=self, diff --git a/mopidy/backends/libspotify/library.py b/mopidy/backends/libspotify/library.py index 972eaf03..948c69b2 100644 --- a/mopidy/backends/libspotify/library.py +++ b/mopidy/backends/libspotify/library.py @@ -3,14 +3,14 @@ import multiprocessing from spotify import Link, SpotifyError -from mopidy.backends.base import BaseLibraryController +from mopidy.backends.base import BaseLibraryProvider from mopidy.backends.libspotify import ENCODING from mopidy.backends.libspotify.translator import LibspotifyTranslator from mopidy.models import Playlist logger = logging.getLogger('mopidy.backends.libspotify.library') -class LibspotifyLibraryController(BaseLibraryController): +class LibspotifyLibraryProvider(BaseLibraryProvider): def find_exact(self, **query): return self.search(**query) diff --git a/mopidy/backends/local/__init__.py b/mopidy/backends/local/__init__.py index cf9cbd60..a5b6fb7a 100644 --- a/mopidy/backends/local/__init__.py +++ b/mopidy/backends/local/__init__.py @@ -5,10 +5,10 @@ import os import shutil from mopidy import settings -from mopidy.backends.base import (BaseBackend, - BaseCurrentPlaylistController, BaseLibraryController, - BasePlaybackController, BasePlaybackProvider, - BaseStoredPlaylistsController, BaseStoredPlaylistsProvider) +from mopidy.backends.base import (BaseBackend, BaseCurrentPlaylistController, + BaseLibraryController, BaseLibraryProvider, BasePlaybackController, + BasePlaybackProvider, BaseStoredPlaylistsController, + BaseStoredPlaylistsProvider) from mopidy.models import Playlist, Track, Album from mopidy.utils.process import pickle_connection @@ -32,18 +32,20 @@ class LocalBackend(BaseBackend): def __init__(self, *args, **kwargs): super(LocalBackend, self).__init__(*args, **kwargs) - self.library = LocalLibraryController(backend=self) - - stored_playlists_provider = LocalStoredPlaylistsProvider(backend=self) - self.stored_playlists = BaseStoredPlaylistsController(backend=self, - provider=stored_playlists_provider) - self.current_playlist = BaseCurrentPlaylistController(backend=self) + library_provider = LocalLibraryProvider(backend=self) + self.library = BaseLibraryController(backend=self, + provider=library_provider) + playback_provider = LocalPlaybackProvider(backend=self) self.playback = LocalPlaybackController(backend=self, provider=playback_provider) + stored_playlists_provider = LocalStoredPlaylistsProvider(backend=self) + self.stored_playlists = BaseStoredPlaylistsController(backend=self, + provider=stored_playlists_provider) + self.uri_handlers = [u'file://'] @@ -149,9 +151,9 @@ class LocalStoredPlaylistsProvider(BaseStoredPlaylistsProvider): self._playlists.append(playlist) -class LocalLibraryController(BaseLibraryController): +class LocalLibraryProvider(BaseLibraryProvider): def __init__(self, *args, **kwargs): - super(LocalLibraryController, self).__init__(*args, **kwargs) + super(LocalLibraryProvider, self).__init__(*args, **kwargs) self._uri_mapping = {} self.refresh() diff --git a/tests/frontends/mpd/current_playlist_test.py b/tests/frontends/mpd/current_playlist_test.py index 8a4b9ab5..a4179637 100644 --- a/tests/frontends/mpd/current_playlist_test.py +++ b/tests/frontends/mpd/current_playlist_test.py @@ -12,7 +12,7 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): def test_add(self): needle = Track(uri='dummy://foo') - self.b.library._library = [Track(), Track(), needle, Track()] + self.b.library.provider._library = [Track(), Track(), needle, Track()] self.b.current_playlist.append( [Track(), Track(), Track(), Track(), Track()]) self.assertEqual(len(self.b.current_playlist.tracks), 5) @@ -40,7 +40,7 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): def test_addid_without_songpos(self): needle = Track(uri='dummy://foo') - self.b.library._library = [Track(), Track(), needle, Track()] + self.b.library.provider._library = [Track(), Track(), needle, Track()] self.b.current_playlist.append( [Track(), Track(), Track(), Track(), Track()]) self.assertEqual(len(self.b.current_playlist.tracks), 5) @@ -58,7 +58,7 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): def test_addid_with_songpos(self): needle = Track(uri='dummy://foo') - self.b.library._library = [Track(), Track(), needle, Track()] + self.b.library.provider._library = [Track(), Track(), needle, Track()] self.b.current_playlist.append( [Track(), Track(), Track(), Track(), Track()]) self.assertEqual(len(self.b.current_playlist.tracks), 5) @@ -71,7 +71,7 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): def test_addid_with_songpos_out_of_bounds_should_ack(self): needle = Track(uri='dummy://foo') - self.b.library._library = [Track(), Track(), needle, Track()] + self.b.library.provider._library = [Track(), Track(), needle, Track()] self.b.current_playlist.append( [Track(), Track(), Track(), Track(), Track()]) self.assertEqual(len(self.b.current_playlist.tracks), 5)