FengLiuFeseliud / pycloudmusic

优雅的异步高性能 Python 音乐 API 库 (网易云音乐)
https://fengliufeseliud.github.io/pycloudmusic/
MIT License
25 stars 4 forks source link

Question: How to access the data from musicapi.search_playlist function? #6

Closed TimG233 closed 1 year ago

TimG233 commented 1 year ago

我尝试去搜索一个playlist通过关键词,但是他不能像musicapi.search_music 一样去操作 (变成list),否则会有报错。目前这个不确定是我的操作有问题还是程序有Bug 代码:

# after login
search_playlist = await musicapi.search_playlist(key="古风", page=0, limit=5)
print(search_playlist)  # (531, <generator object Music163Api.search_playlist.<locals>.<genexpr> at 0x0000029BC0970AC0>)
search_playlist = list(search_playlist[1])
print(search_playlist)

报错:

Traceback (most recent call last):
  File "...\resources\netease_login_test.py", line 69, in <module>
    asyncio.run(netease_search())
  File "... \Python\Python39\lib\asyncio\runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "... \Python\Python39\lib\asyncio\base_events.py", line 647, in run_until_complete
    return future.result()
  File "... \resources\netease_login_test.py", line 60, in netease_search
    search_playlist = list(search_playlist[1])
  File "... \venv\lib\site-packages\pycloudmusic\music163.py", line 132, in <genexpr>
    return data["result"]["playlistCount"], (PlayList(playlist_data) for playlist_data in data["result"]['playlists'])
  File "... \venv\lib\site-packages\pycloudmusic\object\music163.py", line 418, in __init__
    self.tags = playlist_data['tags']
KeyError: 'tags'
TimG233 commented 1 year ago

经过测试,Playlist这个class (\object\music163.py) 里的playlist_data不一定会有以下这些 (根据不同的playlist)

FengLiuFeseliud commented 1 year ago

因为搜索出来的数据不完全,所以分成了不同的类,可以使用 id 再次请求获取完整数据

FengLiuFeseliud commented 1 year ago

应该返回的是 ShortPlaylist 对象,可以先改一下库代码,晚点修一下,没注意

FengLiuFeseliud commented 1 year ago

也可以先用 musicapi._search

FengLiuFeseliud commented 1 year ago

修完了 更新至 v0.1.4.5 可以正常使用

from pycloudmusic import Music163Api
import asyncio

async def main():
    musicapi = Music163Api()

    for playlist in (await musicapi.search_playlist(key="古风", page=0, limit=5))[1]:
        print(playlist.name, playlist.id)

    print("=" * 50)

    # 搜索数据没有 tag 获取完整歌单再获取 tag
    for splaylist in (await musicapi.search_playlist(key="古风", page=0, limit=5))[1]:
        playlist = await musicapi.playlist(splaylist.id)
        print(playlist.name, playlist.id, playlist.tags_str, playlist.tags)

asyncio.run(main())