Beispiel #1
0
    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)]
Beispiel #3
0
 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)]
Beispiel #4
0
    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
Beispiel #5
0
    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 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
Beispiel #7
0
 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]
Beispiel #8
0
 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]
 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]
Beispiel #10
0
 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]