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

运行Spotipy的get_album_tracks函数时程序冻结且无报错求助

解决Spotipy调用album_tracks时程序冻结无异常的问题

我调用Spotipy的get_album_tracks函数时程序直接冻结,既不返回结果也不触发异常捕获输出错误信息。使用的是Aphex Twin《Selected Ambient Works》专辑ID「7aNclGRxTysfh6z0d8671k」,但search_album函数能正常运行。

原函数代码

def get_album_tracks(sp, album_id):
    try:
        album_tracks = sp.album_tracks(album_id)
        tracks = album_tracks["items"]

        # Create a list to hold track details
        track_details = []
        for track in tracks:
            track_info = {
                "track_name": track["name"],
                "track_id": track["id"],
                "artists": [artist["name"] for artist in track["artists"]],
            }
            track_details.append(track_info)

        return track_details

    except SpotifyException as e:
        print(f"Spotify API error {e.code}: {e.msg}")
        return None

调用代码

album_tracks = get_album_tracks(sp, "7aNclGRxTysfh6z0d8671k")
print(album_tracks)

问题分析

  1. 请求无超时处理:Spotipy默认同步请求未设置超时,若网络波动或API响应异常,会导致程序无限阻塞,且原代码仅捕获SpotifyException,无法覆盖超时、网络错误等情况。
  2. 未处理分页逻辑:Spotify的album_tracks接口默认仅返回20条曲目,超过20条的专辑需要分页获取,虽不会直接导致冻结,但可能隐藏后续问题。
  3. 隐性权限/版本问题:部分Spotipy版本对公开数据接口的请求逻辑存在差异,可能导致请求静默失败。

修复方案

修改函数,添加超时控制、通用异常捕获和分页处理:

from spotipy.exceptions import SpotifyException
import requests

def get_album_tracks(sp, album_id):
    try:
        # 设置请求超时,避免无限阻塞
        sp._session.timeout = 10
        album_tracks = sp.album_tracks(album_id)
        tracks = album_tracks["items"]
        
        # 处理分页,获取专辑所有曲目
        while album_tracks["next"]:
            album_tracks = sp.next(album_tracks)
            tracks.extend(album_tracks["items"])

        track_details = []
        for track in tracks:
            track_info = {
                "track_name": track["name"],
                "track_id": track["id"],
                "artists": [artist["name"] for artist in track["artists"]],
            }
            track_details.append(track_info)

        return track_details

    except SpotifyException as e:
        print(f"Spotify API错误 {e.code}: {e.msg}")
        return None
    except requests.exceptions.Timeout:
        print("请求超时,请检查网络或稍后重试")
        return None
    except Exception as e:
        print(f"未知错误: {str(e)}")
        return None

修复说明

  • 给Spotipy的请求session设置10秒超时,避免程序无限冻结;
  • 新增分页逻辑,确保获取专辑全部曲目;
  • 补充捕获超时异常和通用异常,能输出所有未预料的错误信息,方便排查问题。

内容的提问来源于stack exchange,提问作者Niels Demeyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:17:08