Split BaseLibraryController in controller and provider
This commit is contained in:
parent
0b681a4e4c
commit
13ece43363
@ -25,6 +25,14 @@ Stored playlists provider
|
||||
:undoc-members:
|
||||
|
||||
|
||||
Library provider
|
||||
================
|
||||
|
||||
.. autoclass:: mopidy.backends.base.BaseLibraryProvider
|
||||
:members:
|
||||
:undoc-members:
|
||||
|
||||
|
||||
Backend provider implementations
|
||||
================================
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user