def play(self, track): if track.uri is None: return False spotify_backend = self.backend.actor_ref.proxy() need_data_callback_bound = functools.partial( need_data_callback, spotify_backend) enough_data_callback_bound = functools.partial( enough_data_callback, spotify_backend) seek_data_callback_bound = functools.partial( seek_data_callback, spotify_backend) self._first_seek = True try: spotify_track = Link.from_string(track.uri).as_track() utils.wait_for_object_to_load(spotify_track, self._timeout) self.backend.spotify.session.load(spotify_track) self.backend.spotify.session.play(1) self.backend.spotify.buffer_timestamp = 0 self.audio.prepare_change() self.audio.set_appsrc( self._caps, need_data=need_data_callback_bound, enough_data=enough_data_callback_bound, seek_data=seek_data_callback_bound) self.audio.start_playback() self.audio.set_metadata(track) return True except SpotifyError as e: logger.info('Playback of %s failed: %s', track.uri, e) return False
def _lookup_track(self, uri): track = Link.from_string(uri).as_track() utils.wait_for_object_to_load(track, self._timeout) if track.is_loaded(): return [SpotifyTrack(track=track)] else: return [SpotifyTrack(uri=uri)]
def play(self, track): if track.uri is None: return False spotify_backend = self.backend.actor_ref.proxy() need_data_callback_bound = functools.partial(need_data_callback, spotify_backend) enough_data_callback_bound = functools.partial(enough_data_callback, spotify_backend) seek_data_callback_bound = functools.partial(seek_data_callback, spotify_backend) self._first_seek = True try: spotify_track = Link.from_string(track.uri).as_track() utils.wait_for_object_to_load(spotify_track, self._timeout) self.backend.spotify.session.load(spotify_track) self.backend.spotify.session.play(1) self.backend.spotify.buffer_timestamp = 0 self.audio.prepare_change() self.audio.set_appsrc(self._caps, need_data=need_data_callback_bound, enough_data=enough_data_callback_bound, seek_data=seek_data_callback_bound) self.audio.start_playback() self.audio.set_metadata(track) return True except SpotifyError as e: logger.info('Playback of %s failed: %s', track.uri, e) return False
def browse(self, uri): if uri == self.root_directory.uri: return self._root variant, identifier = translator.parse_uri(uri.lower()) if variant == 'album': album = Link.from_string(uri).as_album() album_browser = self.backend.spotify.session.browse_album(album) utils.wait_for_object_to_load(album_browser, self._timeout) return [translator.to_mopidy_track_ref(t) for t in album_browser] if variant == 'user': playlist = Link.from_string(uri).as_playlist() utils.wait_for_object_to_load(playlist, self._timeout) return [translator.to_mopidy_track_ref(t) for t in playlist] if variant != 'toplist': return [] if identifier == 'countries': return self._countries if identifier not in ('all', 'current'): identifier = identifier.upper() if identifier not in SPOTIFY_COUNTRIES: return [] result = [] done = threading.Event() def callback(browser, userdata): for track in browser: result.append(translator.to_mopidy_track_ref(track)) done.set() logger.debug('Performing toplist browse for %s', identifier) ToplistBrowser(b'tracks', bytes(identifier), callback, None) if not done.wait(self._timeout): logger.warning('%s toplist browse timed out.', identifier) return result
def _lookup_playlist(self, uri): playlist = Link.from_string(uri).as_playlist() utils.wait_for_object_to_load(playlist, self._timeout) return [SpotifyTrack(track=t) for t in playlist]
def _lookup_artist(self, uri): artist = Link.from_string(uri).as_artist() artist_browser = self.backend.spotify.session.browse_artist(artist) utils.wait_for_object_to_load(artist_browser, self._timeout) return [SpotifyTrack(track=t) for t in artist_browser]