def test_filters_out_none_tracks(self, sp_track_mock, sp_playlist_mock): sp_track_mock.is_loaded = False playlist = translator.to_playlist(sp_playlist_mock) assert playlist.length == 0 assert list(playlist.tracks) == []
def test_returns_none_if_unloaded(self): sp_playlist = mock.Mock(spec=spotify.Playlist) sp_playlist.is_loaded = False playlist = translator.to_playlist(sp_playlist) assert playlist is None
def test_filters_out_none_tracks(self, web_track_mock, web_playlist_mock): del web_track_mock["type"] playlist = translator.to_playlist(web_playlist_mock) assert playlist.length == 0 assert list(playlist.tracks) == []
def test_dont_check_playable(self, web_playlist_mock): del web_playlist_mock["tracks"]["items"][0]["track"]["is_playable"] playlist = translator.to_playlist( web_playlist_mock, check_playable=False ) assert playlist.tracks != ()
def test_includes_by_owner_in_name_if_owned_by_another_user( self, sp_playlist_mock, sp_user_mock): sp_user_mock.canonical_name = 'bob' sp_playlist_mock.user = sp_user_mock playlist = translator.to_playlist(sp_playlist_mock, username='******') assert playlist.name == 'Foo (by bob)'
def test_no_track_data(self, web_playlist_mock): del web_playlist_mock["tracks"] playlist = translator.to_playlist(web_playlist_mock) assert playlist.uri == "spotify:user:alice:playlist:foo" assert playlist.name == "Foo" assert playlist.length == 0
def test_successful_translation(self, sp_track_mock, sp_playlist_mock): track = translator.to_track(sp_track_mock) playlist = translator.to_playlist(sp_playlist_mock) assert playlist.uri == 'spotify:user:alice:playlist:foo' assert playlist.name == 'Foo' assert playlist.length == 1 assert track in playlist.tracks assert playlist.last_modified is None
def test_successful_translation(self, web_track_mock, web_playlist_mock): track = translator.web_to_track(web_track_mock) playlist = translator.to_playlist(web_playlist_mock) assert playlist.uri == "spotify:user:alice:playlist:foo" assert playlist.name == "Foo" assert playlist.length == 1 assert track in playlist.tracks assert playlist.last_modified is None
def create(self, name): try: sp_playlist = (self._backend._session.playlist_container. add_new_playlist(name)) except ValueError as exc: logger.warning('Failed creating new Spotify playlist "%s": %s', name, exc) except spotify.Error: logger.warning('Failed creating new Spotify playlist "%s"', name) else: username = self._backend._session.user_name return translator.to_playlist(sp_playlist, username=username)
def test_calls_to_playlist_ref(self, web_playlist_mock): ref_mock = mock.Mock(spec=models.Ref.playlist) ref_mock.uri = str(sentinel.uri) ref_mock.name = str(sentinel.name) with patch.object(translator, "to_playlist_ref", return_value=ref_mock) as ref_func_mock: playlist = translator.to_playlist(web_playlist_mock) ref_func_mock.assert_called_once_with(web_playlist_mock, mock.ANY) assert playlist.uri == str(sentinel.uri) assert playlist.name == str(sentinel.name)
def create(self, name): try: sp_playlist = ( self._backend._session.playlist_container .add_new_playlist(name)) except ValueError as exc: logger.warning( 'Failed creating new Spotify playlist "%s": %s', name, exc) except spotify.Error: logger.warning('Failed creating new Spotify playlist "%s"', name) else: username = self._backend._session.user_name return translator.to_playlist(sp_playlist, username=username)
def _get_playlist(self, uri, as_items=False): try: sp_playlist = self._backend._session.get_playlist(uri) except spotify.Error as exc: logger.debug('Failed to lookup Spotify URI %s: %s', uri, exc) return if not sp_playlist.is_loaded: logger.debug( 'Waiting for Spotify playlist to load: %s', sp_playlist) sp_playlist.load(self._timeout) username = self._backend._session.user_name return translator.to_playlist( sp_playlist, username=username, bitrate=self._backend._bitrate, as_items=as_items)
def _get_playlist(self, uri, as_items=False): try: sp_playlist = self._backend._session.get_playlist(uri) except spotify.Error as exc: logger.debug('Failed to lookup Spotify URI %s: %s', uri, exc) return if not sp_playlist.is_loaded: logger.debug( 'Waiting for Spotify playlist to load: %s', sp_playlist) sp_playlist.load() username = self._backend._session.user_name return translator.to_playlist( sp_playlist, username=username, bitrate=self._backend._bitrate, as_items=as_items)
def create(self, name): if not name: return None web_playlist = web.create_playlist(self._backend._web_client, name) if web_playlist is None: logger.error(f"Failed to create Spotify playlist '{name}'") return logger.info(f"Created Spotify playlist '{name}'") return translator.to_playlist( web_playlist, username=self._backend._web_client.user_id, bitrate=self._backend._bitrate, # Note: we are not filtering out (currently) unplayable tracks; # otherwise they would be removed when editing the playlist. check_playable=False, )
def playlist_lookup(session, web_client, uri, bitrate, as_items=False, with_owner=False): if web_client is None or not web_client.logged_in: return logger.debug(f'Fetching Spotify playlist "{uri!r}"') web_playlist = web_client.get_playlist(uri) if web_playlist == {}: logger.error(f"Failed to lookup Spotify playlist URI {uri!r}") return playlist = translator.to_playlist( web_playlist, username=web_client.user_id, bitrate=bitrate, as_items=as_items, # Note: we are not filtering out (currently) unplayable tracks; # otherwise they would be removed when editing the playlist. check_playable=False, ) if playlist is None: return # Store the libspotify Link for each track so they will be loaded in the # background ready for using later. if session.connection.state is spotify.ConnectionState.LOGGED_IN: if as_items: tracks = playlist else: tracks = playlist.tracks for track in tracks: if track.uri in _sp_links: continue try: _sp_links[track.uri] = session.get_link(track.uri) except ValueError as exc: logger.info(f"Failed to get link {track.uri!r}: {exc}") if with_owner: owner = web_playlist.get("owner", {}).get("id") return playlist, owner return playlist
def playlist_lookup(session, web_client, uri, bitrate, as_items=False): if web_client is None or not web_client.logged_in: return logger.debug(f'Fetching Spotify playlist "{uri!r}"') web_playlist = web_client.get_playlist(uri) if web_playlist == {}: logger.error(f"Failed to lookup Spotify playlist URI {uri!r}") return playlist = translator.to_playlist( web_playlist, username=web_client.user_id, bitrate=bitrate, as_items=as_items, ) if playlist is None: return # Store the libspotify Link for each track so they will be loaded in the # background ready for using later. if session.connection.state is spotify.ConnectionState.LOGGED_IN: if as_items: tracks = playlist else: tracks = playlist.tracks for track in tracks: if track.uri in _sp_links: continue try: _sp_links[track.uri] = session.get_link(track.uri) except ValueError as exc: logger.info(f"Failed to get link {track.uri!r}: {exc}") return playlist
def test_as_items(self, sp_track_mock, sp_playlist_mock): track_ref = translator.to_track_ref(sp_track_mock) items = translator.to_playlist(sp_playlist_mock, as_items=True) assert track_ref in items
def test_as_items(self, web_track_mock, web_playlist_mock): track_ref = translator.web_to_track_ref(web_track_mock) items = translator.to_playlist(web_playlist_mock, as_items=True) assert track_ref in items
def test_includes_folders_in_name(self, sp_playlist_mock): playlist = translator.to_playlist( sp_playlist_mock, folders=['Bar', 'Baz']) assert playlist.name == 'Bar/Baz/Foo'
def test_as_items_no_track_data(self, web_playlist_mock): del web_playlist_mock["tracks"] items = translator.to_playlist(web_playlist_mock, as_items=True) assert len(items) == 0
def test_reorders_starred_playlists(self, sp_starred_mock): playlist = translator.to_playlist(sp_starred_mock) assert len(playlist.tracks) == 2 assert playlist.tracks[0].name == 'Newest' assert playlist.tracks[1].name == 'Oldest'
def test_returns_none_if_invalid_ref(self, web_artist_mock): with patch.object(translator, "web_to_artist_ref", return_value=None): assert translator.to_playlist(web_artist_mock) is None
def test_returns_none_if_playlist_folder(self): sp_playlist_folder = mock.Mock(spec=spotify.PlaylistFolder) playlist = translator.to_playlist(sp_playlist_folder) assert playlist is None
def test_includes_folders_in_name(self, sp_playlist_mock): playlist = translator.to_playlist(sp_playlist_mock, folders=['Bar', 'Baz']) assert playlist.name == 'Bar/Baz/Foo'
def test_adds_name_for_starred_playlists(self, sp_starred_mock): playlist = translator.to_playlist(sp_starred_mock) assert playlist.name == 'Starred'