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

Spotify中Explicit Tracks识别返回None问题排查及优化咨询

问题分析与解决方案

咱们先拆解你遇到的两个核心问题,再给出修复后的代码,最后聊聊怎么更高效地实现这个需求。

一、为什么返回结果始终是None?

你的代码里有两个关键错误:

  1. dict.update()的返回值误区:Python字典的update()方法是直接修改原字典,它不会返回新字典,而是返回None。你写new_albums = albums.update(...)的时候,相当于把new_albums直接赋值成了None,这就是最终返回None的根本原因。
  2. 字典语法错误:你传递给update的内容格式不对,正确的字典结构应该是{键: 值},你漏了外层的大括号。

二、修复后的代码

我们调整逻辑,直接往new_albums字典里添加条目,避开错误的update用法:

import time
import spotipy
import spotipy.util as util
from config import spotify_token

def albumDrop():
    sp = spotipy.Spotify(auth=spotify_token)
    new_albums = {}  # 不需要额外的albums字典,直接用new_albums存结果
    artistList = sp.current_user_top_artists(limit=50, offset=0, time_range='long_term')['items']
    
    for artist in artistList:
        print(f"{artist['name']} (ID: {artist['id']})")
        # 可按需添加country参数,避免地区版权导致的专辑缺失
        artistAlbumsList = sp.artist_albums(
            artist["id"], album_type='album', limit=3)['items']
        
        for album in artistAlbumsList:
            album_key = f"{artist['name']} - {album['name']}"
            print(f"{album['release_date']} | {artist['name']} | {album['name']} | {album['external_urls']['spotify']} | {album['id']}")
            
            albumTracks = sp.album_tracks(album['id'], limit=50)['items']
            has_explicit = False
            
            # 找到一首Explicit曲目就停止遍历,节省时间
            for track in albumTracks:
                if track['explicit']:
                    has_explicit = True
                    break
            
            if has_explicit:
                # 直接向new_albums添加条目,无需使用update
                new_albums[album_key] = {
                    'Release Date': album['release_date'],
                    'Artist Name': artist['name'],
                    'Album Name': album['name'],
                    'Album URI': album['external_urls']['spotify'],
                    'Album ID': album['id'],
                    'Explicit': has_explicit
                }
    
    return new_albums

if __name__ == "__main__":
    start = time.time()
    latestAlbums = albumDrop()
    print(latestAlbums)
    print(f"执行耗时: {time.time() - start:.2f}秒")

三、更高效的实现方式

Spotify API有调用速率限制,我们可以通过减少请求次数来优化:

1. 缓存已检查的专辑

如果同一个专辑被多个艺术家关联(比如合辑),用集合缓存已检查的专辑ID,避免重复查询:

checked_album_ids = set()  # 放在函数开头
# 遍历专辑时先判断
if album['id'] in checked_album_ids:
    continue
checked_album_ids.add(album['id'])

2. 批量获取曲目信息

sp.album_tracks()一次只能查一个专辑的曲目,我们可以用sp.tracks()批量查询(最多一次50个ID),减少API请求次数:

# 收集当前专辑所有曲目ID
track_ids = [track['id'] for track in albumTracks]
# 分批次处理
for i in range(0, len(track_ids), 50):
    batch_ids = track_ids[i:i+50]
    tracks = sp.tracks(batch_ids)['tracks']
    # 用any()快速判断是否有Explicit曲目
    if any(t['explicit'] for t in tracks):
        # 添加到new_albums
        break

3. 处理API限流

如果遇到请求被限流,可以添加短暂延迟(比如time.sleep(0.1)),或者用tenacity库实现自动重试逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:35:17