使用Spotipy添加指定歌手歌曲至Spotify播放列表的异常问题
问题解决:Spotipy搜索Adele时混入非目标歌手歌曲
问题根源
- 搜索查询格式错误:你当前的查询用逗号分隔
artist: {top_artist_name}, track: {top_songs[i]},不符合Spotify搜索API的语法规范——逗号会被当作搜索词的一部分,导致artist过滤条件失效,搜索结果会包含其他歌手的同名歌曲。 - 未验证结果匹配性:直接取搜索结果的第一个条目,没有检查该歌曲的实际艺术家是否与目标一致,遇到翻唱、同名歌曲时就会出错。
修正后的代码
def get_songs_uris(self, top_artist_name, top_songs): for song_title in top_songs: # 使用Spotify标准搜索语法,双引号包裹避免空格干扰,无多余逗号 query = f'artist:"{top_artist_name}" track:"{song_title}"' songs_data = self.sp.search(q=query, type="track", limit=5) # 遍历搜索结果,找到真正属于目标歌手的歌曲 for track in songs_data["tracks"]["items"]: # 检查歌曲的艺术家是否包含目标歌手(兼容合作单曲场景) for artist in track["artists"]: if artist["name"].lower() == top_artist_name.lower(): self.songs_URIs.append(track["uri"]) break else: continue # 没找到匹配的艺术家,继续下一个结果 break # 找到匹配的歌曲,跳出循环处理下一首 else: # 没有找到匹配的歌曲,可添加日志提示 print(f"未找到歌手 {top_artist_name} 的歌曲 {song_title}") return self.songs_URIs
关键改进点
- 规范搜索语法:用
artist:"歌手名" track:"歌曲名"的格式,确保Spotify正确解析过滤条件,精准定位目标歌曲。 - 结果验证:遍历搜索结果,检查每首歌的艺术家列表,确保包含目标歌手(兼容合作单曲场景),避免混入翻唱或同名歌曲。
- 容错处理:添加未找到歌曲的提示,避免因搜索结果为空导致索引错误。
内容的提问来源于stack exchange,提问作者Łukasz Pawlik
相关产品推荐
相关产品推荐

