Exemple #1
0
    async def get_playlist(
            self, playlist_id: typing.Union[int, str]) -> api.Playlist:
        resp = await self.get_playlist_detail_raw(playlist_id)

        try:
            playlist = resp['data']['data']['collectDetail']
            total = int(playlist['songCount'])
            tracks = playlist['songs']
            track_ids = playlist['allSongs']
        except (KeyError, ValueError):
            raise exceptions.DataError('get playlist: no data')

        if total == 0:
            raise exceptions.DataError('get playlist: no data')

        if total > _SONG_REQUEST_LIMIT:

            async def patch_tracks(*ids: typing.Union[int, str]):
                return await self.get_songs_raw(*ids)

            tasks = []
            for i in range(_SONG_REQUEST_LIMIT, total, _SONG_REQUEST_LIMIT):
                song_ids = track_ids[i:min(i + _SONG_REQUEST_LIMIT, total)]
                tasks.append(asyncio.ensure_future(patch_tracks(*song_ids)))

            await asyncio.gather(*tasks)
            for task in tasks:
                if not task.exception():
                    try:
                        data = task.result()['data']['data']
                        _songs = data.get('songs', [])
                        tracks.extend(_songs)
                    except KeyError:
                        continue

        await self._patch_song_lyric(*tracks)
        songs = _resolve(*tracks)
        return api.Playlist(
            playlist_id=playlist['listId'],
            name=playlist['collectName'].strip(),
            pic_url=playlist.get('collectLogo', ''),
            count=len(songs),
            songs=songs,
        )
Exemple #2
0
    async def get_playlist(
            self, playlist_id: typing.Union[int, str]) -> api.Playlist:
        resp = await self.get_playlist_raw(playlist_id)

        try:
            playlist = resp['data']['cdlist'][0]
            _songs = playlist['songlist']
        except (KeyError, IndexError):
            raise exceptions.DataError('get playlist: no data')

        if not _songs:
            raise exceptions.DataError('get playlist: no data')

        await self._patch_song_lyric(*_songs)
        songs = _resolve(*_songs)
        return api.Playlist(name=playlist['dissname'],
                            pic_url=playlist.get('dir_pic_url2', ''),
                            count=len(songs),
                            songs=songs)
Exemple #3
0
    async def get_playlist(
            self, playlist_id: typing.Union[int, str]) -> api.Playlist:
        resp = await self.get_playlist_raw(playlist_id)
        try:
            total = resp['playlist']['trackCount']
            tracks = resp['playlist']['tracks']
            track_ids = resp['playlist']['trackIds']
        except KeyError:
            raise exceptions.DataError('get playlist: no data')

        if total == 0:
            raise exceptions.DataError('get playlist: no data')

        if total > _SONG_REQUEST_LIMIT:
            song_ids = [
                track_ids[i]['id'] for i in range(_SONG_REQUEST_LIMIT, total)
            ]

            async def patch_tracks(*ids: typing.Union[int, str]):
                return await self.get_songs_raw(*ids)

            extra = total - _SONG_REQUEST_LIMIT
            tasks = []
            for i in range(0, extra, _SONG_REQUEST_LIMIT):
                _ids = song_ids[i:min(i + _SONG_REQUEST_LIMIT, extra)]
                tasks.append(asyncio.ensure_future(patch_tracks(*_ids)))

            await asyncio.gather(*tasks)
            for task in tasks:
                if not task.exception():
                    tracks.extend(task.result().get('songs', []))

        await self._patch_song_url(*tracks)
        await self._patch_song_lyric(*tracks)
        songs = _resolve(*tracks)
        return api.Playlist(
            playlist_id=resp['playlist']['id'],
            name=resp['playlist']['name'].strip(),
            pic_url=resp['playlist']['coverImgUrl'],
            count=len(songs),
            songs=songs,
        )
Exemple #4
0
    async def get_playlist(
            self, playlist_id: typing.Union[int, str]) -> api.Playlist:
        resp = await self.get_playlist_raw(playlist_id)

        try:
            playlist = resp['data']
            _songs = playlist['musicList']
        except KeyError:
            raise exceptions.DataError('get playlist: no data')

        if not _songs:
            raise exceptions.DataError('get playlist: no data')

        await self._patch_song_url(*_songs)
        await self._patch_song_lyric(*_songs)
        songs = _resolve(*_songs)
        return api.Playlist(name=playlist['name'].strip(),
                            pic_url=playlist.get('img700', ''),
                            count=len(songs),
                            songs=songs)
Exemple #5
0
    async def get_playlist(
            self, playlist_id: typing.Union[int, str]) -> api.Playlist:
        resp = await self.get_playlist_raw(playlist_id)

        try:
            playlist = resp['resource'][0]
            _songs = playlist['songItems']
        except (KeyError, IndexError):
            raise exceptions.DataError('get playlist: no data')

        if not _songs:
            raise exceptions.DataError('get playlist: no data')

        await self._patch_song_lyric(*_songs)
        _patch_song_url(*_songs)
        _patch_song_info(*_songs)
        songs = _resolve(*_songs)
        return api.Playlist(name=playlist['title'].strip(),
                            pic_url=playlist['imgItem']['img'],
                            count=len(songs),
                            songs=songs)
Exemple #6
0
    async def get_playlist(self, special_id: typing.Union[int, str]) -> api.Playlist:
        playlist_info = await self.get_playlist_info_raw(special_id)
        playlist_song = await self.get_playlist_song_raw(special_id)

        try:
            _songs = playlist_song['data']['info']
        except KeyError:
            raise exceptions.DataError('get playlist: no data')

        if not _songs:
            raise exceptions.DataError('get playlist: no data')

        await self.patch_song_info(*_songs)
        await self.patch_album_info(*_songs)
        await self.patch_song_lyric(*_songs)
        songs = _resolve(*_songs)
        return api.Playlist(
            name=playlist_info['data']['specialname'].strip(),
            pic_url=playlist_info['data']['imgurl'].replace('{size}', '480'),
            count=len(songs),
            songs=songs
        )
Exemple #7
0
    async def get_playlist(
            self, playlist_id: typing.Union[int, str]) -> api.Playlist:
        resp = await self.get_playlist_raw(playlist_id)

        try:
            playlist = resp['result']['info']
            _songs = resp['result']['songlist']
        except KeyError:
            raise exceptions.DataError('get playlist: no data')

        if not _songs:
            raise exceptions.DataError('get playlist: no data')

        await self._patch_song_url(*_songs)
        await self._patch_song_lyric(*_songs)
        songs = _resolve(*_songs)
        return api.Playlist(
            playlist_id=playlist['list_id'],
            name=playlist['list_title'].strip(),
            pic_url=playlist.get('list_pic', ''),
            count=len(songs),
            songs=songs,
        )