Limit audio access to the playback provider

This commit is contained in:
Stein Magnus Jodal 2012-09-28 01:38:39 +02:00
parent c115cf123f
commit 609bd6a5b5
7 changed files with 35 additions and 48 deletions

View File

@ -24,6 +24,3 @@ class Backend(object):
#: List of URI schemes this backend can handle.
uri_schemes = []
def __init__(self, audio):
self.audio = audio

View File

@ -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)

View File

@ -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']

View File

@ -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']

View File

@ -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

View File

@ -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)

View File

@ -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):