You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()接口。

解决方案

修改代码,分开获取用户自己创建的歌单和关注的歌单:

  1. 用current_user_playlists()找自定义的Saved Weekly歌单
  2. 用current_user_followed_playlists()获取用户关注的所有歌单,从中查找Discover Weekly
  3. 处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:02:05