diff --git a/mopidy/backends/base/__init__.py b/mopidy/backends/base/__init__.py index 4e0f0b08..c27acae2 100644 --- a/mopidy/backends/base/__init__.py +++ b/mopidy/backends/base/__init__.py @@ -24,6 +24,3 @@ class Backend(object): #: List of URI schemes this backend can handle. uri_schemes = [] - - def __init__(self, audio): - self.audio = audio diff --git a/mopidy/backends/base/playback.py b/mopidy/backends/base/playback.py index 197ba90e..635146ff 100644 --- a/mopidy/backends/base/playback.py +++ b/mopidy/backends/base/playback.py @@ -6,7 +6,8 @@ class BasePlaybackProvider(object): pykka_traversable = True - def __init__(self, backend): + def __init__(self, audio, backend): + self.audio = audio self.backend = backend def pause(self): @@ -17,7 +18,7 @@ class BasePlaybackProvider(object): :rtype: :class:`True` if successful, else :class:`False` """ - return self.backend.audio.pause_playback().get() + return self.audio.pause_playback().get() def play(self, track): """ @@ -29,9 +30,9 @@ class BasePlaybackProvider(object): :type track: :class:`mopidy.models.Track` :rtype: :class:`True` if successful, else :class:`False` """ - self.backend.audio.prepare_change() - self.backend.audio.set_uri(track.uri).get() - return self.backend.audio.start_playback().get() + self.audio.prepare_change() + self.audio.set_uri(track.uri).get() + return self.audio.start_playback().get() def resume(self): """ @@ -41,7 +42,7 @@ class BasePlaybackProvider(object): :rtype: :class:`True` if successful, else :class:`False` """ - return self.backend.audio.start_playback().get() + return self.audio.start_playback().get() def seek(self, time_position): """ @@ -53,7 +54,7 @@ class BasePlaybackProvider(object): :type time_position: int :rtype: :class:`True` if successful, else :class:`False` """ - return self.backend.audio.set_position(time_position).get() + return self.audio.set_position(time_position).get() def stop(self): """ @@ -63,7 +64,7 @@ class BasePlaybackProvider(object): :rtype: :class:`True` if successful, else :class:`False` """ - return self.backend.audio.stop_playback().get() + return self.audio.stop_playback().get() def get_time_position(self): """ @@ -73,7 +74,7 @@ class BasePlaybackProvider(object): :rtype: int """ - return self.backend.audio.get_position().get() + return self.audio.get_position().get() def get_volume(self): """ @@ -83,7 +84,7 @@ class BasePlaybackProvider(object): :rtype: int [0..100] or :class:`None` """ - return self.backend.audio.get_volume().get() + return self.audio.get_volume().get() def set_volume(self, volume): """ @@ -94,4 +95,4 @@ class BasePlaybackProvider(object): :param: volume :type volume: int [0..100] """ - self.backend.audio.set_volume(volume) + self.audio.set_volume(volume) diff --git a/mopidy/backends/dummy/__init__.py b/mopidy/backends/dummy/__init__.py index 1d69ed7c..5e028ea3 100644 --- a/mopidy/backends/dummy/__init__.py +++ b/mopidy/backends/dummy/__init__.py @@ -12,11 +12,9 @@ class DummyBackend(ThreadingActor, base.Backend): Handles URIs starting with ``dummy:``. """ - def __init__(self, *args, **kwargs): - base.Backend.__init__(self, *args, **kwargs) - + def __init__(self, audio): self.library = DummyLibraryProvider(backend=self) - self.playback = DummyPlaybackProvider(backend=self) + self.playback = DummyPlaybackProvider(audio=audio, backend=self) self.stored_playlists = DummyStoredPlaylistsProvider(backend=self) self.uri_schemes = [u'dummy'] diff --git a/mopidy/backends/local/__init__.py b/mopidy/backends/local/__init__.py index f3e86679..ee8448b3 100644 --- a/mopidy/backends/local/__init__.py +++ b/mopidy/backends/local/__init__.py @@ -30,11 +30,9 @@ class LocalBackend(ThreadingActor, base.Backend): - :attr:`mopidy.settings.LOCAL_TAG_CACHE_FILE` """ - def __init__(self, *args, **kwargs): - base.Backend.__init__(self, *args, **kwargs) - + def __init__(self, audio): self.library = LocalLibraryProvider(backend=self) - self.playback = base.BasePlaybackProvider(backend=self) + self.playback = base.BasePlaybackProvider(audio=audio, backend=self) self.stored_playlists = LocalStoredPlaylistsProvider(backend=self) self.uri_schemes = [u'file'] diff --git a/mopidy/backends/spotify/__init__.py b/mopidy/backends/spotify/__init__.py index a79168f5..0e2a2bfa 100644 --- a/mopidy/backends/spotify/__init__.py +++ b/mopidy/backends/spotify/__init__.py @@ -41,37 +41,29 @@ class SpotifyBackend(ThreadingActor, base.Backend): # Imports inside methods are to prevent loading of __init__.py to fail on # missing spotify dependencies. - def __init__(self, *args, **kwargs): + def __init__(self, audio): from .library import SpotifyLibraryProvider from .playback import SpotifyPlaybackProvider + from .session_manager import SpotifySessionManager from .stored_playlists import SpotifyStoredPlaylistsProvider - base.Backend.__init__(self, *args, **kwargs) - self.library = SpotifyLibraryProvider(backend=self) - self.playback = SpotifyPlaybackProvider(backend=self) + self.playback = SpotifyPlaybackProvider(audio=audio, backend=self) self.stored_playlists = SpotifyStoredPlaylistsProvider(backend=self) self.uri_schemes = [u'spotify'] - self.spotify = None - # Fail early if settings are not present - self.username = settings.SPOTIFY_USERNAME - self.password = settings.SPOTIFY_PASSWORD + 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') - self.spotify = self._connect() + logger.debug(u'Connecting to Spotify') + self.spotify.start() def on_stop(self): self.spotify.logout() - - def _connect(self): - from .session_manager import SpotifySessionManager - - logger.debug(u'Connecting to Spotify') - spotify = SpotifySessionManager(self.username, self.password, - audio=self.audio, backend=self.actor_ref.proxy()) - spotify.start() - return spotify diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index 94d57f56..d3d0cfa9 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -30,10 +30,10 @@ class SpotifyPlaybackProvider(BasePlaybackProvider): Link.from_string(track.uri).as_track()) self.backend.spotify.session.play(1) - self.backend.audio.prepare_change() - self.backend.audio.set_uri('appsrc://') - self.backend.audio.start_playback() - self.backend.audio.set_metadata(track) + self.audio.prepare_change() + self.audio.set_uri('appsrc://') + self.audio.start_playback() + self.audio.set_metadata(track) self._timer.play() @@ -50,9 +50,9 @@ class SpotifyPlaybackProvider(BasePlaybackProvider): return self.seek(time_position) def seek(self, time_position): - self.backend.audio.prepare_change() + self.audio.prepare_change() self.backend.spotify.session.seek(time_position) - self.backend.audio.start_playback() + self.audio.start_playback() self._timer.seek(time_position) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index 52769d84..dab759c9 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -24,13 +24,13 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager): appkey_file = os.path.join(os.path.dirname(__file__), 'spotify_appkey.key') user_agent = 'Mopidy %s' % get_version() - def __init__(self, username, password, audio, backend): + def __init__(self, username, password, audio, backend_ref): PyspotifySessionManager.__init__(self, username, password) BaseThread.__init__(self) self.name = 'SpotifyThread' self.audio = audio - self.backend = backend + self.backend_ref = backend_ref self.connected = threading.Event() self.session = None @@ -41,6 +41,7 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager): self._initial_data_receive_completed = False def run_inside_try(self): + self.backend = self.backend_ref.proxy() self.connect() def logged_in(self, session, error):