运行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)
问题分析
- 请求无超时处理:Spotipy默认同步请求未设置超时,若网络波动或API响应异常,会导致程序无限阻塞,且原代码仅捕获
SpotifyException,无法覆盖超时、网络错误等情况。 - 未处理分页逻辑:Spotify的
album_tracks接口默认仅返回20条曲目,超过20条的专辑需要分页获取,虽不会直接导致冻结,但可能隐藏后续问题。 - 隐性权限/版本问题:部分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
相关产品推荐
相关产品推荐

