Spotify API无法获取Discover Weekly歌单问题求助
解决Spotipy无法获取Discover Weekly歌单的问题
问题描述
我用Python编写了一个Flask应用,目的是自动将Spotify Discover Weekly中的歌曲保存到自定义歌单,但代码始终无法找到Discover Weekly歌单。目前代码能正常列出其他所有歌单,我也已经手动关注了Discover Weekly,但它就是不出现在API返回结果里。补充说明:有人建议检查返回结果的最大限制,但我的情况不适用——默认限制是50,而我总共只有41个歌单(包含Discover Weekly)。
原代码如下:
def save_discover_weekly(token_info): sp = spotipy.Spotify(auth=token_info['access_token']) cur_playlists = sp.current_user_playlists()['items'] discover_weekly_id = None saved_weekly_id = None for playlist in cur_playlists: print(playlist['name']) if playlist['name'] == 'Discover Weekly': discover_weekly_id = playlist['id'] print(discover_weekly_id) break if playlist['name'] == 'Saved Weekly': saved_weekly_id = playlist['id'] print(saved_weekly_id) if discover_weekly_id is None: return "Discover Weekly not found" if not saved_weekly_id: print("Creating saved weekly playlist") saved_weekly = sp.user_playlist_create(sp.current_user()['id'], "Saved Weekly", True) saved_weekly_id = saved_weekly['id'] discover_weekly_songs = sp.playlist_items(discover_weekly_id) song_uris = [song['track']['uri'] for song in discover_weekly_songs['items']] sp.user_playlist_add_tracks(sp.current_user()['id'], saved_weekly_id, song_uris) return "Discover Weekly songs saved to Saved Weekly playlist!"
问题原因
Spotify的current_user_playlists()接口默认仅返回用户自行创建的歌单,而Discover Weekly是Spotify官方生成的歌单,即使用户关注了它,也不会出现在该接口的返回结果中。要获取用户关注的所有歌单(包括官方歌单),需要调用current_user_followed_playlists()接口。
解决方案
修改代码,分开获取用户自己创建的歌单和关注的歌单:
- 用
current_user_playlists()找自定义的Saved Weekly歌单 - 用
current_user_followed_playlists()获取用户关注的所有歌单,从中查找Discover Weekly - 处理
current_user_followed_playlists()的分页逻辑,确保不会遗漏歌单
修改后的代码:
def save_discover_weekly(token_info): sp = spotipy.Spotify(auth=token_info['access_token']) discover_weekly_id = None saved_weekly_id = None # 获取用户自行创建的歌单,查找Saved Weekly cur_playlists = sp.current_user_playlists()['items'] for playlist in cur_playlists: print(playlist['name']) if playlist['name'] == 'Saved Weekly': saved_weekly_id = playlist['id'] print(saved_weekly_id) break # 获取用户关注的所有歌单,查找Discover Weekly(处理分页) followed_playlists = [] results = sp.current_user_followed_playlists(limit=50) followed_playlists.extend(results['items']) while results['next']: results = sp.next(results) followed_playlists.extend(results['items']) for item in followed_playlists: playlist = item['playlist'] print(playlist['name']) if playlist['name'] == 'Discover Weekly': discover_weekly_id = playlist['id'] print(discover_weekly_id) break if discover_weekly_id is None: return "Discover Weekly not found" if not saved_weekly_id: print("Creating saved weekly playlist") saved_weekly = sp.user_playlist_create(sp.current_user()['id'], "Saved Weekly", True) saved_weekly_id = saved_weekly['id'] discover_weekly_songs = sp.playlist_items(discover_weekly_id) song_uris = [song['track']['uri'] for song in discover_weekly_songs['items']] sp.user_playlist_add_tracks(sp.current_user()['id'], saved_weekly_id, song_uris) return "Discover Weekly songs saved to Saved Weekly playlist!"
关键说明
current_user_followed_playlists()的返回结构与current_user_playlists()不同,每个元素是包含playlist字段的字典,需要通过item['playlist']获取歌单详情- 分页逻辑可以确保即使未来关注的歌单数量超过50,也能完整获取所有数据
- 分开处理两类歌单,既符合接口的设计逻辑,也能提升查找效率
内容的提问来源于stack exchange,提问作者Brandon Pardi
相关产品推荐
相关产品推荐

