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, )
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)
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, )
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)
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)
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 )
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, )