diff --git a/mopidy/backends/spotify/__init__.py b/mopidy/backends/spotify/__init__.py index 749a43c0..87d76c46 100644 --- a/mopidy/backends/spotify/__init__.py +++ b/mopidy/backends/spotify/__init__.py @@ -1,70 +1,2 @@ -import logging - -from pykka.actor import ThreadingActor - -from mopidy import settings -from mopidy.backends import base - -logger = logging.getLogger('mopidy.backends.spotify') - -BITRATES = {96: 2, 160: 0, 320: 1} - - -class SpotifyBackend(ThreadingActor, base.Backend): - """ - A backend for playing music from the `Spotify `_ - music streaming service. The backend uses the official `libspotify - `_ library and the - `pyspotify `_ Python bindings for - libspotify. - - .. note:: - - This product uses SPOTIFY(R) CORE but is not endorsed, certified or - otherwise approved in any way by Spotify. Spotify is the registered - trade mark of the Spotify Group. - - **Issues:** - https://github.com/mopidy/mopidy/issues?labels=backend-spotify - - **Dependencies:** - - - libspotify >= 10, < 11 (libspotify10 package from apt.mopidy.com) - - pyspotify >= 1.5 (python-spotify package from apt.mopidy.com) - - **Settings:** - - - :attr:`mopidy.settings.SPOTIFY_CACHE_PATH` - - :attr:`mopidy.settings.SPOTIFY_USERNAME` - - :attr:`mopidy.settings.SPOTIFY_PASSWORD` - """ - - # Imports inside methods are to prevent loading of __init__.py to fail on - # missing spotify dependencies. - - def __init__(self, audio): - from .library import SpotifyLibraryProvider - from .playback import SpotifyPlaybackProvider - from .session_manager import SpotifySessionManager - from .stored_playlists import SpotifyStoredPlaylistsProvider - - self.library = SpotifyLibraryProvider(backend=self) - self.playback = SpotifyPlaybackProvider(audio=audio, backend=self) - self.stored_playlists = SpotifyStoredPlaylistsProvider(backend=self) - - self.uri_schemes = [u'spotify'] - - # Fail early if settings are not present - username = settings.SPOTIFY_USERNAME - password = settings.SPOTIFY_PASSWORD - - self.spotify = SpotifySessionManager( - username, password, audio=audio, backend_ref=self.actor_ref) - - def on_start(self): - logger.info(u'Mopidy uses SPOTIFY(R) CORE') - logger.debug(u'Connecting to Spotify') - self.spotify.start() - - def on_stop(self): - self.spotify.logout() +# flake8: noqa +from .actor import SpotifyBackend diff --git a/mopidy/backends/spotify/actor.py b/mopidy/backends/spotify/actor.py new file mode 100644 index 00000000..186f5729 --- /dev/null +++ b/mopidy/backends/spotify/actor.py @@ -0,0 +1,68 @@ +import logging + +from pykka.actor import ThreadingActor + +from mopidy import settings +from mopidy.backends import base + +logger = logging.getLogger('mopidy.backends.spotify') + + +class SpotifyBackend(ThreadingActor, base.Backend): + """ + A backend for playing music from the `Spotify `_ + music streaming service. The backend uses the official `libspotify + `_ library and the + `pyspotify `_ Python bindings for + libspotify. + + .. note:: + + This product uses SPOTIFY(R) CORE but is not endorsed, certified or + otherwise approved in any way by Spotify. Spotify is the registered + trade mark of the Spotify Group. + + **Issues:** + https://github.com/mopidy/mopidy/issues?labels=backend-spotify + + **Dependencies:** + + - libspotify >= 10, < 11 (libspotify10 package from apt.mopidy.com) + - pyspotify >= 1.5 (python-spotify package from apt.mopidy.com) + + **Settings:** + + - :attr:`mopidy.settings.SPOTIFY_CACHE_PATH` + - :attr:`mopidy.settings.SPOTIFY_USERNAME` + - :attr:`mopidy.settings.SPOTIFY_PASSWORD` + """ + + # Imports inside methods are to prevent loading of __init__.py to fail on + # missing spotify dependencies. + + def __init__(self, audio): + from .library import SpotifyLibraryProvider + from .playback import SpotifyPlaybackProvider + from .session_manager import SpotifySessionManager + from .stored_playlists import SpotifyStoredPlaylistsProvider + + self.library = SpotifyLibraryProvider(backend=self) + self.playback = SpotifyPlaybackProvider(audio=audio, backend=self) + self.stored_playlists = SpotifyStoredPlaylistsProvider(backend=self) + + self.uri_schemes = [u'spotify'] + + # Fail early if settings are not present + username = settings.SPOTIFY_USERNAME + password = settings.SPOTIFY_PASSWORD + + self.spotify = SpotifySessionManager( + username, password, audio=audio, backend_ref=self.actor_ref) + + def on_start(self): + logger.info(u'Mopidy uses SPOTIFY(R) CORE') + logger.debug(u'Connecting to Spotify') + self.spotify.start() + + def on_stop(self): + self.spotify.logout() diff --git a/mopidy/backends/spotify/container_manager.py b/mopidy/backends/spotify/container_manager.py index a45b1adc..e3388e0b 100644 --- a/mopidy/backends/spotify/container_manager.py +++ b/mopidy/backends/spotify/container_manager.py @@ -3,7 +3,7 @@ import logging from spotify.manager import SpotifyContainerManager as \ PyspotifyContainerManager -logger = logging.getLogger('mopidy.backends.spotify.container_manager') +logger = logging.getLogger('mopidy.backends.spotify') class SpotifyContainerManager(PyspotifyContainerManager): diff --git a/mopidy/backends/spotify/library.py b/mopidy/backends/spotify/library.py index b254519e..e237a04a 100644 --- a/mopidy/backends/spotify/library.py +++ b/mopidy/backends/spotify/library.py @@ -3,11 +3,12 @@ import Queue from spotify import Link, SpotifyError -from mopidy.backends.base import BaseLibraryProvider -from mopidy.backends.spotify.translator import SpotifyTranslator +from mopidy.backends import base from mopidy.models import Track, Playlist -logger = logging.getLogger('mopidy.backends.spotify.library') +from .translator import SpotifyTranslator + +logger = logging.getLogger('mopidy.backends.spotify') class SpotifyTrack(Track): @@ -49,7 +50,7 @@ class SpotifyTrack(Track): return self._proxy.copy(**values) -class SpotifyLibraryProvider(BaseLibraryProvider): +class SpotifyLibraryProvider(base.BaseLibraryProvider): def find_exact(self, **query): return self.search(**query) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index d3d0cfa9..40868745 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -3,14 +3,14 @@ import time from spotify import Link, SpotifyError -from mopidy.backends.base import BasePlaybackProvider +from mopidy.backends import base from mopidy.core import PlaybackState -logger = logging.getLogger('mopidy.backends.spotify.playback') +logger = logging.getLogger('mopidy.backends.spotify') -class SpotifyPlaybackProvider(BasePlaybackProvider): +class SpotifyPlaybackProvider(base.BasePlaybackProvider): def __init__(self, *args, **kwargs): super(SpotifyPlaybackProvider, self).__init__(*args, **kwargs) diff --git a/mopidy/backends/spotify/playlist_manager.py b/mopidy/backends/spotify/playlist_manager.py index e1308a49..645a574c 100644 --- a/mopidy/backends/spotify/playlist_manager.py +++ b/mopidy/backends/spotify/playlist_manager.py @@ -3,7 +3,7 @@ import logging from spotify.manager import SpotifyPlaylistManager as PyspotifyPlaylistManager -logger = logging.getLogger('mopidy.backends.spotify.playlist_manager') +logger = logging.getLogger('mopidy.backends.spotify') class SpotifyPlaylistManager(PyspotifyPlaylistManager): diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index caa777e1..983f3861 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -5,14 +5,16 @@ import threading from spotify.manager import SpotifySessionManager as PyspotifySessionManager from mopidy import settings -from mopidy.backends.spotify import BITRATES -from mopidy.backends.spotify.container_manager import SpotifyContainerManager -from mopidy.backends.spotify.playlist_manager import SpotifyPlaylistManager -from mopidy.backends.spotify.translator import SpotifyTranslator from mopidy.models import Playlist from mopidy.utils import process, versioning -logger = logging.getLogger('mopidy.backends.spotify.session_manager') +from .container_manager import SpotifyContainerManager +from .playlist_manager import SpotifyPlaylistManager +from .translator import SpotifyTranslator + +logger = logging.getLogger('mopidy.backends.spotify') + +BITRATES = {96: 2, 160: 0, 320: 1} # pylint: disable = R0901 # SpotifySessionManager: Too many ancestors (9/7) diff --git a/mopidy/backends/spotify/stored_playlists.py b/mopidy/backends/spotify/stored_playlists.py index 85695c40..9a2328c4 100644 --- a/mopidy/backends/spotify/stored_playlists.py +++ b/mopidy/backends/spotify/stored_playlists.py @@ -1,7 +1,7 @@ -from mopidy.backends.base import BaseStoredPlaylistsProvider +from mopidy.backends import base -class SpotifyStoredPlaylistsProvider(BaseStoredPlaylistsProvider): +class SpotifyStoredPlaylistsProvider(base.BaseStoredPlaylistsProvider): def create(self, name): pass # TODO diff --git a/mopidy/backends/spotify/translator.py b/mopidy/backends/spotify/translator.py index 82c11ef7..104029f5 100644 --- a/mopidy/backends/spotify/translator.py +++ b/mopidy/backends/spotify/translator.py @@ -5,7 +5,7 @@ from spotify import Link, SpotifyError from mopidy import settings from mopidy.models import Artist, Album, Track, Playlist -logger = logging.getLogger('mopidy.backends.spotify.translator') +logger = logging.getLogger('mopidy.backends.spotify') class SpotifyTranslator(object):