Split BaseStoredPlaylistsController in controller and provider

This commit is contained in:
Stein Magnus Jodal 2010-11-01 23:19:32 +01:00
parent beeda04785
commit f486bf512d
7 changed files with 139 additions and 35 deletions

View File

@ -116,8 +116,16 @@ Playback provider
:undoc-members:
Backend implementations
=======================
Stored playlists provider
-------------------------
.. autoclass:: mopidy.backends.base.BaseStoredPlaylistsProvider
:members:
:undoc-members:
Backend provider implementations
================================
* :mod:`mopidy.backends.dummy`
* :mod:`mopidy.backends.libspotify`

View File

@ -4,15 +4,16 @@ import random
import time
from mopidy import settings
from mopidy.backends.base.current_playlist import BaseCurrentPlaylistController
from mopidy.backends.base.library import BaseLibraryController
from mopidy.backends.base.playback import (BasePlaybackController,
BasePlaybackProvider)
from mopidy.backends.base.stored_playlists import BaseStoredPlaylistsController
from mopidy.frontends.mpd import translator
from mopidy.models import Playlist
from mopidy.utils import get_class
from .current_playlist import BaseCurrentPlaylistController
from .library import BaseLibraryController
from .playback import BasePlaybackController, BasePlaybackProvider
from .stored_playlists import (BaseStoredPlaylistsController,
BaseStoredPlaylistsProvider)
logger = logging.getLogger('mopidy.backends.base')
__all__ = ['BaseBackend', 'BasePlaybackController', 'BasePlaybackProvider',

View File

@ -7,24 +7,30 @@ class BaseStoredPlaylistsController(object):
"""
:param backend: backend the controller is a part of
:type backend: :class:`BaseBackend`
:param provider: provider the controller should use
:type provider: instance of :class:`BaseStoredPlaylistsProvider`
"""
def __init__(self, backend):
def __init__(self, backend, provider):
self.backend = backend
self._playlists = []
self.provider = provider
def destroy(self):
"""Cleanup after component."""
pass
self.provider.destroy()
@property
def playlists(self):
"""List of :class:`mopidy.models.Playlist`."""
return copy(self._playlists)
"""
Currently stored playlists.
Read/write. List of :class:`mopidy.models.Playlist`.
"""
return self.provider.playlists
@playlists.setter
def playlists(self, playlists):
self._playlists = playlists
self.provider.playlists = playlists
def create(self, name):
"""
@ -34,7 +40,7 @@ class BaseStoredPlaylistsController(object):
:type name: string
:rtype: :class:`mopidy.models.Playlist`
"""
raise NotImplementedError
return self.provider.create(name)
def delete(self, playlist):
"""
@ -43,7 +49,7 @@ class BaseStoredPlaylistsController(object):
:param playlist: the playlist to delete
:type playlist: :class:`mopidy.models.Playlist`
"""
raise NotImplementedError
return self.provider.delete(playlist)
def get(self, **criteria):
"""
@ -55,13 +61,14 @@ class BaseStoredPlaylistsController(object):
get(name='a') # Returns track with name 'a'
get(uri='xyz') # Returns track with URI 'xyz'
get(name='a', uri='xyz') # Returns track with name 'a' and URI 'xyz'
get(name='a', uri='xyz') # Returns track with name 'a' and URI
# 'xyz'
:param criteria: one or more criteria to match by
:type criteria: dict
:rtype: :class:`mopidy.models.Playlist`
"""
matches = self._playlists
matches = self.playlists
for (key, value) in criteria.iteritems():
matches = filter(lambda p: getattr(p, key) == value, matches)
if len(matches) == 1:
@ -82,11 +89,14 @@ class BaseStoredPlaylistsController(object):
:type uri: string
:rtype: :class:`mopidy.models.Playlist`
"""
raise NotImplementedError
return self.provider.lookup(uri)
def refresh(self):
"""Refresh stored playlists."""
raise NotImplementedError
"""
Refresh the stored playlists in
:attr:`mopidy.backends.base.BaseStoredPlaylistsController.playlists`.
"""
return self.provider.refresh(uri)
def rename(self, playlist, new_name):
"""
@ -97,7 +107,7 @@ class BaseStoredPlaylistsController(object):
:param new_name: the new name
:type new_name: string
"""
raise NotImplementedError
return self.provider.rename(playlist, new_name)
def save(self, playlist):
"""
@ -106,4 +116,85 @@ class BaseStoredPlaylistsController(object):
:param playlist: the playlist
:type playlist: :class:`mopidy.models.Playlist`
"""
return self.provider.save(playlist)
class BaseStoredPlaylistsProvider(object):
"""
:param backend: backend the controller is a part of
:type backend: :class:`BaseBackend`
"""
def __init__(self, backend):
self.backend = backend
self._playlists = []
def destroy(self):
"""
Cleanup after component.
May be overridden by subclasses.
"""
pass
@property
def playlists(self):
"""
Currently stored playlists.
Read/write. List of :class:`mopidy.models.Playlist`.
"""
return copy(self._playlists)
@playlists.setter
def playlists(self, playlists):
self._playlists = playlists
def create(self, name):
"""
To be overridden by subclass.
See :meth:`mopidy.backends.base.BaseStoredPlaylistsController.create`.
"""
raise NotImplementedError
def delete(self, playlist):
"""
To be overridden by subclass.
See :meth:`mopidy.backends.base.BaseStoredPlaylistsController.delete`.
"""
raise NotImplementedError
def lookup(self, uri):
"""
To be overridden by subclass.
See :meth:`mopidy.backends.base.BaseStoredPlaylistsController.lookup`.
"""
raise NotImplementedError
def refresh(self):
"""
To be overridden by subclass.
See :meth:`mopidy.backends.base.BaseStoredPlaylistsController.refresh`.
"""
raise NotImplementedError
def rename(self, playlist, new_name):
"""
To be overridden by subclass.
See :meth:`mopidy.backends.base.BaseStoredPlaylistsController.rename`.
"""
raise NotImplementedError
def save(self, playlist):
"""
To be overridden by subclass.
See :meth:`mopidy.backends.base.BaseStoredPlaylistsController.save`.
"""
raise NotImplementedError

View File

@ -1,6 +1,6 @@
from mopidy.backends.base import (BaseBackend, BaseCurrentPlaylistController,
BasePlaybackController, BasePlaybackProvider, BaseLibraryController,
BaseStoredPlaylistsController)
BaseStoredPlaylistsController, BaseStoredPlaylistsProvider)
from mopidy.models import Playlist
class DummyBackend(BaseBackend):
@ -22,7 +22,9 @@ class DummyBackend(BaseBackend):
self.playback = DummyPlaybackController(backend=self,
provider=playback_provider)
self.stored_playlists = DummyStoredPlaylistsController(backend=self)
stored_playlists_provider = DummyStoredPlaylistsProvider(backend=self)
self.stored_playlists = BaseStoredPlaylistsController(backend=self,
provider=stored_playlists_provider)
self.uri_handlers = [u'dummy:']
@ -75,9 +77,7 @@ class DummyPlaybackProvider(BasePlaybackProvider):
return True
class DummyStoredPlaylistsController(BaseStoredPlaylistsController):
_playlists = []
class DummyStoredPlaylistsProvider(BaseStoredPlaylistsProvider):
def create(self, name):
playlist = Playlist(name=name)
self._playlists.append(playlist)

View File

@ -2,7 +2,7 @@ import logging
from mopidy import settings
from mopidy.backends.base import (BaseBackend, BaseCurrentPlaylistController,
BasePlaybackController)
BasePlaybackController, BaseStoredPlaylistsController)
logger = logging.getLogger('mopidy.backends.libspotify')
@ -36,7 +36,7 @@ class LibspotifyBackend(BaseBackend):
def __init__(self, *args, **kwargs):
from .library import LibspotifyLibraryController
from .playback import LibspotifyPlaybackProvider
from .stored_playlists import LibspotifyStoredPlaylistsController
from .stored_playlists import LibspotifyStoredPlaylistsProvider
super(LibspotifyBackend, self).__init__(*args, **kwargs)
@ -48,8 +48,10 @@ class LibspotifyBackend(BaseBackend):
self.playback = BasePlaybackController(backend=self,
provider=playback_provider)
self.stored_playlists = LibspotifyStoredPlaylistsController(
stored_playlists_provider = LibspotifyStoredPlaylistsProvider(
backend=self)
self.stored_playlists = BaseStoredPlaylistsController(backend=self,
provider=stored_playlists_provider)
self.uri_handlers = [u'spotify:', u'http://open.spotify.com/']

View File

@ -1,6 +1,6 @@
from mopidy.backends.base import BaseStoredPlaylistsController
from mopidy.backends.base import BaseStoredPlaylistsProvider
class LibspotifyStoredPlaylistsController(BaseStoredPlaylistsController):
class LibspotifyStoredPlaylistsProvider(BaseStoredPlaylistsProvider):
def create(self, name):
pass # TODO

View File

@ -8,7 +8,7 @@ from mopidy import settings
from mopidy.backends.base import (BaseBackend,
BaseCurrentPlaylistController, BaseLibraryController,
BasePlaybackController, BasePlaybackProvider,
BaseStoredPlaylistsController)
BaseStoredPlaylistsController, BaseStoredPlaylistsProvider)
from mopidy.models import Playlist, Track, Album
from mopidy.utils.process import pickle_connection
@ -34,7 +34,9 @@ class LocalBackend(BaseBackend):
self.library = LocalLibraryController(backend=self)
self.stored_playlists = LocalStoredPlaylistsController(backend=self)
stored_playlists_provider = LocalStoredPlaylistsProvider(backend=self)
self.stored_playlists = BaseStoredPlaylistsController(backend=self,
provider=stored_playlists_provider)
self.current_playlist = BaseCurrentPlaylistController(backend=self)
@ -74,9 +76,9 @@ class LocalPlaybackProvider(BasePlaybackProvider):
return self.backend.output.set_state('READY')
class LocalStoredPlaylistsController(BaseStoredPlaylistsController):
class LocalStoredPlaylistsProvider(BaseStoredPlaylistsProvider):
def __init__(self, *args, **kwargs):
super(LocalStoredPlaylistsController, self).__init__(*args, **kwargs)
super(LocalStoredPlaylistsProvider, self).__init__(*args, **kwargs)
self._folder = os.path.expanduser(settings.LOCAL_PLAYLIST_FOLDER)
self.refresh()