Limit audio access to the playback provider
This commit is contained in:
parent
c115cf123f
commit
609bd6a5b5
@ -24,6 +24,3 @@ class Backend(object):
|
||||
|
||||
#: List of URI schemes this backend can handle.
|
||||
uri_schemes = []
|
||||
|
||||
def __init__(self, audio):
|
||||
self.audio = audio
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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']
|
||||
|
||||
@ -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']
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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):
|
||||
|
||||
Loading…
Reference in New Issue
Block a user