Split BaseLibraryController in controller and provider

This commit is contained in:
Stein Magnus Jodal 2010-11-02 23:07:15 +01:00
parent 0b681a4e4c
commit 13ece43363
8 changed files with 100 additions and 31 deletions

View File

@ -25,6 +25,14 @@ Stored playlists provider
:undoc-members:
Library provider
================
.. autoclass:: mopidy.backends.base.BaseLibraryProvider
:members:
:undoc-members:
Backend provider implementations
================================

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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