Python生成Spotify播放列表重复同一曲目问题求助
解决Spotify心情播放列表重复同一首歌的问题
嘿,我完全懂你现在的困扰!作为Python新手遇到这种问题太正常了,别慌,我们来一步步把它搞定。
问题根源
你生成的播放列表全是同一首歌重复30次,核心问题出在这段代码里的while循环:
if track_mood == "Angry": while len(tracks_uris) < 30: track_uri = "spotify:track:{}".format(track['id']) tracks_uris.append(track_uri)
当你找到第一首符合"Angry"情绪的歌曲时,这个while循环会一直执行——只要tracks_uris的长度小于30,它就会反复把同一首歌的URI添加进去,直到列表填满30个位置,自然就全是同一首歌了。
修复方案
我们只需要把while改成if,同时在收集够30首歌后直接跳出外层的for循环(避免不必要的遍历):
@app.route("/playlist_mood_angry") def mood_playlist_angry(): # define mood and create empty track list selected_mood = "Angry" tracks_uris = [] # we need all the tracks uri to add to the future playlist if 'auth_header' in session: auth_header = session['auth_header'] # get user profile and saved tracks user_profile_data = spotify.get_users_profile(auth_header) user_id = user_profile_data["id"] saved_tracks_data = spotify.get_user_saved_tracks(auth_header) playlist_name = 'CSMoodlet: Angry' playlist_description = "A playlist for when you're just pissed off and want a soundtrack to go with it. Automatically curated by CSMoodlet." # go through saved tracks dictionary, get the tracks and for each one check if features average matches selected mood for item in saved_tracks_data["items"]: # 先判断是否已经收集够30首,够了就直接跳出循环 if len(tracks_uris) >= 30: break track = item["track"] # 注意:这里的sp是不是应该和前面的spotify对象一致?如果是笔误记得调整 features = spotify.audio_features(track['id']) acousticness = features[0]['acousticness'] danceability = features[0]['danceability'] energy = features[0]['energy'] speechiness = features[0]['speechiness'] valence = features[0]['valence'] track_mood = spotify.define_mood(acousticness, danceability, energy, speechiness, valence) # 符合条件且还没收集够的话,添加一次 if track_mood == "Angry": track_uri = "spotify:track:{}".format(track['id']) tracks_uris.append(track_uri) # once it has gone through all saved tracks, create the playlist and add the tracks new_playlist = spotify.create_playlist(auth_header, user_id, playlist_name, playlist_description) new_playlist_id = new_playlist['id'] added_playlist = spotify.add_tracks_to_playlist(auth_header, new_playlist_id, tracks_uris) playlist = spotify.get_playlist(auth_header, new_playlist_id) tracks_data = [] # 注意:Spotify API返回的playlist中,歌曲列表在playlist["tracks"]["items"]里,不是直接playlist["items"] for item in playlist["tracks"]["items"]: track_data = item["track"] tracks_data.append(track_data) return render_template("created_playlist.html", selected_mood = selected_mood, playlist_tracks=tracks_data)
额外小提示
- 注意代码里的
sp.audio_features,如果你的Spotify操作对象是spotify的话,这里要改成spotify.audio_features,避免对象不一致导致的错误。 - 最后获取播放列表歌曲的时候,Spotify的API返回结构里,歌曲列表是在
playlist["tracks"]["items"]下,而不是直接playlist["items"],这个小细节可能会导致你渲染页面时拿不到歌曲数据。
这样修改后,程序就会遍历你的收藏曲目,每找到一首符合"Angry"情绪的歌就添加一次,直到收集到30首不同的歌曲,或者遍历完所有收藏曲目为止。
内容的提问来源于stack exchange,提问作者loureiro




