Exemplo n.º 1
0
    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) == []
Exemplo n.º 2
0
    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) == []
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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) == []
Exemplo n.º 6
0
    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 != ()
Exemplo n.º 7
0
    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)'
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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)'
Exemplo n.º 10
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
Exemplo n.º 11
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
Exemplo n.º 12
0
    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
Exemplo n.º 13
0
 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)
Exemplo n.º 14
0
    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)
Exemplo n.º 15
0
 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)
Exemplo n.º 16
0
    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)
Exemplo n.º 17
0
    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)
Exemplo n.º 18
0
 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,
     )
Exemplo n.º 19
0
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
Exemplo n.º 20
0
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
Exemplo n.º 21
0
    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
Exemplo n.º 22
0
    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
Exemplo n.º 23
0
    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'
Exemplo n.º 24
0
    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
Exemplo n.º 25
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'
Exemplo n.º 26
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'
Exemplo n.º 27
0
 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
Exemplo n.º 28
0
    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
Exemplo n.º 29
0
    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
Exemplo n.º 30
0
    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'
Exemplo n.º 31
0
    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
Exemplo n.º 32
0
    def test_adds_name_for_starred_playlists(self, sp_starred_mock):
        playlist = translator.to_playlist(sp_starred_mock)

        assert playlist.name == 'Starred'
Exemplo n.º 33
0
    def test_adds_name_for_starred_playlists(self, sp_starred_mock):
        playlist = translator.to_playlist(sp_starred_mock)

        assert playlist.name == 'Starred'