diff --git a/docs/api/backends/providers.rst b/docs/api/backends/providers.rst index 9289dd06..903e220b 100644 --- a/docs/api/backends/providers.rst +++ b/docs/api/backends/providers.rst @@ -37,5 +37,5 @@ Backend provider implementations ================================ * :mod:`mopidy.backends.dummy` -* :mod:`mopidy.backends.libspotify` +* :mod:`mopidy.backends.spotify` * :mod:`mopidy.backends.local` diff --git a/docs/changes.rst b/docs/changes.rst index 03044731..ddb46bb8 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -21,6 +21,10 @@ No description yet. - Support high bitrate (320k) audio. See :attr:`mopidy.settings.SPOTIFY_HIGH_BITRATE` for details. + - Rename :mod:`mopidy.backends.libspotify` to :mod:`mopidy.backends.spotify`. + If you have set :attr:`mopidy.settings.BACKENDS` explicitly, you may need + to update the setting's value. + - Catch and log error caused by playlist folder boundaries being threated as normal playlists. More permanent fix requires support for checking playlist types in pyspotify. diff --git a/docs/installation/index.rst b/docs/installation/index.rst index f6754371..26b50994 100644 --- a/docs/installation/index.rst +++ b/docs/installation/index.rst @@ -31,7 +31,7 @@ Otherwise, make sure you got the required dependencies installed. - Dependencies for at least one Mopidy backend: - - The default backend, :mod:`mopidy.backends.libspotify`, requires libspotify + - The default backend, :mod:`mopidy.backends.spotify`, requires libspotify and pyspotify. See :doc:`libspotify`. - The local backend, :mod:`mopidy.backends.local`, requires no additional diff --git a/docs/modules/backends/libspotify.rst b/docs/modules/backends/libspotify.rst deleted file mode 100644 index e7528757..00000000 --- a/docs/modules/backends/libspotify.rst +++ /dev/null @@ -1,7 +0,0 @@ -******************************************************* -:mod:`mopidy.backends.libspotify` -- Libspotify backend -******************************************************* - -.. automodule:: mopidy.backends.libspotify - :synopsis: Spotify backend using the libspotify library - :members: diff --git a/docs/modules/backends/spotify.rst b/docs/modules/backends/spotify.rst new file mode 100644 index 00000000..938d6337 --- /dev/null +++ b/docs/modules/backends/spotify.rst @@ -0,0 +1,7 @@ +************************************************* +:mod:`mopidy.backends.spotify` -- Spotify backend +************************************************* + +.. automodule:: mopidy.backends.spotify + :synopsis: Backend for the Spotify music streaming service + :members: diff --git a/mopidy/backends/libspotify/__init__.py b/mopidy/backends/spotify/__init__.py similarity index 61% rename from mopidy/backends/libspotify/__init__.py rename to mopidy/backends/spotify/__init__.py index ad2926c7..d36f6250 100644 --- a/mopidy/backends/libspotify/__init__.py +++ b/mopidy/backends/spotify/__init__.py @@ -4,54 +4,55 @@ from mopidy import settings from mopidy.backends.base import (Backend, CurrentPlaylistController, LibraryController, PlaybackController, StoredPlaylistsController) -logger = logging.getLogger('mopidy.backends.libspotify') +logger = logging.getLogger('mopidy.backends.spotify') ENCODING = 'utf-8' -class LibspotifyBackend(Backend): +class SpotifyBackend(Backend): """ - A `Spotify `_ backend which uses the official - `libspotify `_ - library and the `pyspotify `_ Python - bindings for libspotify. - - **Issues:** - http://github.com/mopidy/mopidy/issues/labels/backend-libspotify - - **Settings:** - - - :attr:`mopidy.settings.SPOTIFY_CACHE_PATH` - - :attr:`mopidy.settings.SPOTIFY_USERNAME` - - :attr:`mopidy.settings.SPOTIFY_PASSWORD` + 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:** + http://github.com/mopidy/mopidy/issues/labels/backend-spotify + + **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, *args, **kwargs): - from .library import LibspotifyLibraryProvider - from .playback import LibspotifyPlaybackProvider - from .stored_playlists import LibspotifyStoredPlaylistsProvider + from .library import SpotifyLibraryProvider + from .playback import SpotifyPlaybackProvider + from .stored_playlists import SpotifyStoredPlaylistsProvider - super(LibspotifyBackend, self).__init__(*args, **kwargs) + super(SpotifyBackend, self).__init__(*args, **kwargs) self.current_playlist = CurrentPlaylistController(backend=self) - library_provider = LibspotifyLibraryProvider(backend=self) + library_provider = SpotifyLibraryProvider(backend=self) self.library = LibraryController(backend=self, provider=library_provider) - playback_provider = LibspotifyPlaybackProvider(backend=self) + playback_provider = SpotifyPlaybackProvider(backend=self) self.playback = PlaybackController(backend=self, provider=playback_provider) - stored_playlists_provider = LibspotifyStoredPlaylistsProvider( + stored_playlists_provider = SpotifyStoredPlaylistsProvider( backend=self) self.stored_playlists = StoredPlaylistsController(backend=self, provider=stored_playlists_provider) @@ -61,11 +62,11 @@ class LibspotifyBackend(Backend): self.spotify = self._connect() def _connect(self): - from .session_manager import LibspotifySessionManager + from .session_manager import SpotifySessionManager logger.info(u'Mopidy uses SPOTIFY(R) CORE') logger.debug(u'Connecting to Spotify') - spotify = LibspotifySessionManager( + spotify = SpotifySessionManager( settings.SPOTIFY_USERNAME, settings.SPOTIFY_PASSWORD, core_queue=self.core_queue, output=self.output) diff --git a/mopidy/backends/libspotify/library.py b/mopidy/backends/spotify/library.py similarity index 87% rename from mopidy/backends/libspotify/library.py rename to mopidy/backends/spotify/library.py index 948c69b2..16391473 100644 --- a/mopidy/backends/libspotify/library.py +++ b/mopidy/backends/spotify/library.py @@ -4,13 +4,13 @@ import multiprocessing from spotify import Link, SpotifyError from mopidy.backends.base import BaseLibraryProvider -from mopidy.backends.libspotify import ENCODING -from mopidy.backends.libspotify.translator import LibspotifyTranslator +from mopidy.backends.spotify import ENCODING +from mopidy.backends.spotify.translator import SpotifyTranslator from mopidy.models import Playlist -logger = logging.getLogger('mopidy.backends.libspotify.library') +logger = logging.getLogger('mopidy.backends.spotify.library') -class LibspotifyLibraryProvider(BaseLibraryProvider): +class SpotifyLibraryProvider(BaseLibraryProvider): def find_exact(self, **query): return self.search(**query) @@ -20,7 +20,7 @@ class LibspotifyLibraryProvider(BaseLibraryProvider): # TODO Block until metadata_updated callback is called. Before that # the track will be unloaded, unless it's already in the stored # playlists. - return LibspotifyTranslator.to_mopidy_track(spotify_track) + return SpotifyTranslator.to_mopidy_track(spotify_track) except SpotifyError as e: logger.warning(u'Failed to lookup: %s', uri, e) return None diff --git a/mopidy/backends/libspotify/playback.py b/mopidy/backends/spotify/playback.py similarity index 91% rename from mopidy/backends/libspotify/playback.py rename to mopidy/backends/spotify/playback.py index 29409ff4..a066d90e 100644 --- a/mopidy/backends/libspotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -4,9 +4,9 @@ from spotify import Link, SpotifyError from mopidy.backends.base import BasePlaybackProvider -logger = logging.getLogger('mopidy.backends.libspotify.playback') +logger = logging.getLogger('mopidy.backends.spotify.playback') -class LibspotifyPlaybackProvider(BasePlaybackProvider): +class SpotifyPlaybackProvider(BasePlaybackProvider): def pause(self): return self.backend.output.set_state('PAUSED') diff --git a/mopidy/backends/libspotify/session_manager.py b/mopidy/backends/spotify/session_manager.py similarity index 87% rename from mopidy/backends/libspotify/session_manager.py rename to mopidy/backends/spotify/session_manager.py index f736a40e..6ec6b4c9 100644 --- a/mopidy/backends/libspotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -2,28 +2,29 @@ import logging import os import threading -from spotify.manager import SpotifySessionManager +import spotify.manager from mopidy import get_version, settings -from mopidy.backends.libspotify.translator import LibspotifyTranslator +from mopidy.backends.spotify.translator import SpotifyTranslator from mopidy.models import Playlist from mopidy.utils.process import BaseThread -logger = logging.getLogger('mopidy.backends.libspotify.session_manager') +logger = logging.getLogger('mopidy.backends.spotify.session_manager') # pylint: disable = R0901 -# LibspotifySessionManager: Too many ancestors (9/7) +# SpotifySessionManager: Too many ancestors (9/7) -class LibspotifySessionManager(SpotifySessionManager, BaseThread): +class SpotifySessionManager(spotify.manager.SpotifySessionManager, BaseThread): cache_location = settings.SPOTIFY_CACHE_PATH settings_location = settings.SPOTIFY_CACHE_PATH appkey_file = os.path.join(os.path.dirname(__file__), 'spotify_appkey.key') user_agent = 'Mopidy %s' % get_version() def __init__(self, username, password, core_queue, output): - SpotifySessionManager.__init__(self, username, password) + spotify.manager.SpotifySessionManager.__init__( + self, username, password) BaseThread.__init__(self, core_queue) - self.name = 'LibspotifySMThread' + self.name = 'SpotifySMThread' self.output = output self.connected = threading.Event() self.session = None @@ -53,7 +54,7 @@ class LibspotifySessionManager(SpotifySessionManager, BaseThread): playlists = [] for spotify_playlist in session.playlist_container(): playlists.append( - LibspotifyTranslator.to_mopidy_playlist(spotify_playlist)) + SpotifyTranslator.to_mopidy_playlist(spotify_playlist)) playlists = filter(None, playlists) self.core_queue.put({ 'command': 'set_stored_playlists', @@ -111,7 +112,7 @@ class LibspotifySessionManager(SpotifySessionManager, BaseThread): def callback(results, userdata=None): # TODO Include results from results.albums(), etc. too playlist = Playlist(tracks=[ - LibspotifyTranslator.to_mopidy_track(t) + SpotifyTranslator.to_mopidy_track(t) for t in results.tracks()]) connection.send(playlist) self.connected.wait() diff --git a/mopidy/backends/libspotify/spotify_appkey.key b/mopidy/backends/spotify/spotify_appkey.key similarity index 100% rename from mopidy/backends/libspotify/spotify_appkey.key rename to mopidy/backends/spotify/spotify_appkey.key diff --git a/mopidy/backends/libspotify/stored_playlists.py b/mopidy/backends/spotify/stored_playlists.py similarity index 84% rename from mopidy/backends/libspotify/stored_playlists.py rename to mopidy/backends/spotify/stored_playlists.py index 6f2a7aad..054e2bd1 100644 --- a/mopidy/backends/libspotify/stored_playlists.py +++ b/mopidy/backends/spotify/stored_playlists.py @@ -1,6 +1,6 @@ from mopidy.backends.base import BaseStoredPlaylistsProvider -class LibspotifyStoredPlaylistsProvider(BaseStoredPlaylistsProvider): +class SpotifyStoredPlaylistsProvider(BaseStoredPlaylistsProvider): def create(self, name): pass # TODO diff --git a/mopidy/backends/libspotify/translator.py b/mopidy/backends/spotify/translator.py similarity index 93% rename from mopidy/backends/libspotify/translator.py rename to mopidy/backends/spotify/translator.py index 4a42cf97..50ee07d1 100644 --- a/mopidy/backends/libspotify/translator.py +++ b/mopidy/backends/spotify/translator.py @@ -4,12 +4,12 @@ import logging from spotify import Link, SpotifyError from mopidy import settings -from mopidy.backends.libspotify import ENCODING +from mopidy.backends.spotify import ENCODING from mopidy.models import Artist, Album, Track, Playlist -logger = logging.getLogger('mopidy.backends.libspotify.translator') +logger = logging.getLogger('mopidy.backends.spotify.translator') -class LibspotifyTranslator(object): +class SpotifyTranslator(object): @classmethod def to_mopidy_artist(cls, spotify_artist): if not spotify_artist.is_loaded(): diff --git a/mopidy/settings.py b/mopidy/settings.py index 1aaa4318..23aa7cb6 100644 --- a/mopidy/settings.py +++ b/mopidy/settings.py @@ -12,12 +12,12 @@ Available settings and their default values. #: #: Default:: #: -#: BACKENDS = (u'mopidy.backends.libspotify.LibspotifyBackend',) +#: BACKENDS = (u'mopidy.backends.spotify.SpotifyBackend',) #: #: .. note:: #: Currently only the first backend in the list is used. BACKENDS = ( - u'mopidy.backends.libspotify.LibspotifyBackend', + u'mopidy.backends.spotify.SpotifyBackend', ) #: The log format used for informational logging. @@ -169,24 +169,24 @@ MPD_SERVER_HOSTNAME = u'127.0.0.1' #: Default: 6600 MPD_SERVER_PORT = 6600 -#: Path to the libspotify cache. +#: Path to the Spotify cache. #: -#: Used by :mod:`mopidy.backends.libspotify`. -SPOTIFY_CACHE_PATH = u'~/.mopidy/libspotify_cache' +#: Used by :mod:`mopidy.backends.spotify`. +SPOTIFY_CACHE_PATH = u'~/.mopidy/spotify_cache' #: Your Spotify Premium username. #: -#: Used by :mod:`mopidy.backends.libspotify`. +#: Used by :mod:`mopidy.backends.spotify`. SPOTIFY_USERNAME = u'' #: Your Spotify Premium password. #: -#: Used by :mod:`mopidy.backends.libspotify`. +#: Used by :mod:`mopidy.backends.spotify`. SPOTIFY_PASSWORD = u'' #: Do you prefer high bitrate (320k)? #: -#: Used by :mod:`mopidy.backends.libspotify`. +#: Used by :mod:`mopidy.backends.spotify`. # #: Default:: #: