diff --git a/mopidy/backends/base.py b/mopidy/backends/base.py new file mode 100644 index 00000000..e8a7decd --- /dev/null +++ b/mopidy/backends/base.py @@ -0,0 +1,221 @@ +import copy + + +class Backend(object): + #: Actor proxy to an instance of :class:`mopidy.audio.Audio`. + #: + #: Should be passed to the backend constructor as the kwarg ``audio``, + #: which will then set this field. + audio = None + + #: The library provider. An instance of + # :class:`mopidy.backends.base.BaseLibraryProvider`. + library = None + + #: The playback provider. An instance of + #: :class:`mopidy.backends.base.BasePlaybackProvider`. + playback = None + + #: The stored playlists provider. An instance of + #: :class:`mopidy.backends.base.BaseStoredPlaylistsProvider`. + stored_playlists = None + + #: List of URI schemes this backend can handle. + uri_schemes = [] + + +class BaseLibraryProvider(object): + """ + :param backend: backend the controller is a part of + :type backend: :class:`mopidy.backends.base.Backend` + """ + + pykka_traversable = True + + def __init__(self, backend): + self.backend = backend + + def find_exact(self, **query): + """ + See :meth:`mopidy.backends.base.LibraryController.find_exact`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def lookup(self, uri): + """ + See :meth:`mopidy.backends.base.LibraryController.lookup`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def refresh(self, uri=None): + """ + See :meth:`mopidy.backends.base.LibraryController.refresh`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def search(self, **query): + """ + See :meth:`mopidy.backends.base.LibraryController.search`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + +class BasePlaybackProvider(object): + """ + :param backend: the backend + :type backend: :class:`mopidy.backends.base.Backend` + """ + + pykka_traversable = True + + def __init__(self, audio, backend): + self.audio = audio + self.backend = backend + + def pause(self): + """ + Pause playback. + + *MAY be reimplemented by subclass.* + + :rtype: :class:`True` if successful, else :class:`False` + """ + return self.audio.pause_playback().get() + + def play(self, track): + """ + Play given track. + + *MAY be reimplemented by subclass.* + + :param track: the track to play + :type track: :class:`mopidy.models.Track` + :rtype: :class:`True` if successful, else :class:`False` + """ + self.audio.prepare_change() + self.audio.set_uri(track.uri).get() + return self.audio.start_playback().get() + + def resume(self): + """ + Resume playback at the same time position playback was paused. + + *MAY be reimplemented by subclass.* + + :rtype: :class:`True` if successful, else :class:`False` + """ + return self.audio.start_playback().get() + + def seek(self, time_position): + """ + Seek to a given time position. + + *MAY be reimplemented by subclass.* + + :param time_position: time position in milliseconds + :type time_position: int + :rtype: :class:`True` if successful, else :class:`False` + """ + return self.audio.set_position(time_position).get() + + def stop(self): + """ + Stop playback. + + *MAY be reimplemented by subclass.* + + :rtype: :class:`True` if successful, else :class:`False` + """ + return self.audio.stop_playback().get() + + def get_time_position(self): + """ + Get the current time position in milliseconds. + + *MAY be reimplemented by subclass.* + + :rtype: int + """ + return self.audio.get_position().get() + + +class BaseStoredPlaylistsProvider(object): + """ + :param backend: backend the controller is a part of + :type backend: :class:`mopidy.backends.base.Backend` + """ + + pykka_traversable = True + + def __init__(self, backend): + self.backend = backend + self._playlists = [] + + @property + def playlists(self): + """ + Currently stored playlists. + + Read/write. List of :class:`mopidy.models.Playlist`. + """ + return copy.copy(self._playlists) + + @playlists.setter # noqa + def playlists(self, playlists): + self._playlists = playlists + + def create(self, name): + """ + See :meth:`mopidy.backends.base.StoredPlaylistsController.create`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def delete(self, playlist): + """ + See :meth:`mopidy.backends.base.StoredPlaylistsController.delete`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def lookup(self, uri): + """ + See :meth:`mopidy.backends.base.StoredPlaylistsController.lookup`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def refresh(self): + """ + See :meth:`mopidy.backends.base.StoredPlaylistsController.refresh`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def rename(self, playlist, new_name): + """ + See :meth:`mopidy.backends.base.StoredPlaylistsController.rename`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError + + def save(self, playlist): + """ + See :meth:`mopidy.backends.base.StoredPlaylistsController.save`. + + *MUST be implemented by subclass.* + """ + raise NotImplementedError diff --git a/mopidy/backends/base/__init__.py b/mopidy/backends/base/__init__.py deleted file mode 100644 index c27acae2..00000000 --- a/mopidy/backends/base/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from .library import BaseLibraryProvider -from .playback import BasePlaybackProvider -from .stored_playlists import BaseStoredPlaylistsProvider - - -class Backend(object): - #: Actor proxy to an instance of :class:`mopidy.audio.Audio`. - #: - #: Should be passed to the backend constructor as the kwarg ``audio``, - #: which will then set this field. - audio = None - - #: The library provider. An instance of - # :class:`mopidy.backends.base.BaseLibraryProvider`. - library = None - - #: The playback provider. An instance of - #: :class:`mopidy.backends.base.BasePlaybackProvider`. - playback = None - - #: The stored playlists provider. An instance of - #: :class:`mopidy.backends.base.BaseStoredPlaylistsProvider`. - stored_playlists = None - - #: List of URI schemes this backend can handle. - uri_schemes = [] diff --git a/mopidy/backends/base/library.py b/mopidy/backends/base/library.py deleted file mode 100644 index 837eef49..00000000 --- a/mopidy/backends/base/library.py +++ /dev/null @@ -1,42 +0,0 @@ -class BaseLibraryProvider(object): - """ - :param backend: backend the controller is a part of - :type backend: :class:`mopidy.backends.base.Backend` - """ - - pykka_traversable = True - - def __init__(self, backend): - self.backend = backend - - def find_exact(self, **query): - """ - See :meth:`mopidy.backends.base.LibraryController.find_exact`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError - - def lookup(self, uri): - """ - See :meth:`mopidy.backends.base.LibraryController.lookup`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError - - def refresh(self, uri=None): - """ - See :meth:`mopidy.backends.base.LibraryController.refresh`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError - - def search(self, **query): - """ - See :meth:`mopidy.backends.base.LibraryController.search`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError diff --git a/mopidy/backends/base/playback.py b/mopidy/backends/base/playback.py deleted file mode 100644 index b21c30dc..00000000 --- a/mopidy/backends/base/playback.py +++ /dev/null @@ -1,77 +0,0 @@ -class BasePlaybackProvider(object): - """ - :param backend: the backend - :type backend: :class:`mopidy.backends.base.Backend` - """ - - pykka_traversable = True - - def __init__(self, audio, backend): - self.audio = audio - self.backend = backend - - def pause(self): - """ - Pause playback. - - *MAY be reimplemented by subclass.* - - :rtype: :class:`True` if successful, else :class:`False` - """ - return self.audio.pause_playback().get() - - def play(self, track): - """ - Play given track. - - *MAY be reimplemented by subclass.* - - :param track: the track to play - :type track: :class:`mopidy.models.Track` - :rtype: :class:`True` if successful, else :class:`False` - """ - self.audio.prepare_change() - self.audio.set_uri(track.uri).get() - return self.audio.start_playback().get() - - def resume(self): - """ - Resume playback at the same time position playback was paused. - - *MAY be reimplemented by subclass.* - - :rtype: :class:`True` if successful, else :class:`False` - """ - return self.audio.start_playback().get() - - def seek(self, time_position): - """ - Seek to a given time position. - - *MAY be reimplemented by subclass.* - - :param time_position: time position in milliseconds - :type time_position: int - :rtype: :class:`True` if successful, else :class:`False` - """ - return self.audio.set_position(time_position).get() - - def stop(self): - """ - Stop playback. - - *MAY be reimplemented by subclass.* - - :rtype: :class:`True` if successful, else :class:`False` - """ - return self.audio.stop_playback().get() - - def get_time_position(self): - """ - Get the current time position in milliseconds. - - *MAY be reimplemented by subclass.* - - :rtype: int - """ - return self.audio.get_position().get() diff --git a/mopidy/backends/base/stored_playlists.py b/mopidy/backends/base/stored_playlists.py deleted file mode 100644 index d808798d..00000000 --- a/mopidy/backends/base/stored_playlists.py +++ /dev/null @@ -1,75 +0,0 @@ -from copy import copy - - -class BaseStoredPlaylistsProvider(object): - """ - :param backend: backend the controller is a part of - :type backend: :class:`mopidy.backends.base.Backend` - """ - - pykka_traversable = True - - def __init__(self, backend): - self.backend = backend - self._playlists = [] - - @property - def playlists(self): - """ - Currently stored playlists. - - Read/write. List of :class:`mopidy.models.Playlist`. - """ - return copy(self._playlists) - - @playlists.setter # noqa - def playlists(self, playlists): - self._playlists = playlists - - def create(self, name): - """ - See :meth:`mopidy.backends.base.StoredPlaylistsController.create`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError - - def delete(self, playlist): - """ - See :meth:`mopidy.backends.base.StoredPlaylistsController.delete`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError - - def lookup(self, uri): - """ - See :meth:`mopidy.backends.base.StoredPlaylistsController.lookup`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError - - def refresh(self): - """ - See :meth:`mopidy.backends.base.StoredPlaylistsController.refresh`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError - - def rename(self, playlist, new_name): - """ - See :meth:`mopidy.backends.base.StoredPlaylistsController.rename`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError - - def save(self, playlist): - """ - See :meth:`mopidy.backends.base.StoredPlaylistsController.save`. - - *MUST be implemented by subclass.* - """ - raise NotImplementedError