You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)

额外小提示

  1. 注意代码里的sp.audio_features,如果你的Spotify操作对象是spotify的话,这里要改成spotify.audio_features,避免对象不一致导致的错误。
  2. 最后获取播放列表歌曲的时候,Spotify的API返回结构里,歌曲列表是在playlist["tracks"]["items"]下,而不是直接playlist["items"],这个小细节可能会导致你渲染页面时拿不到歌曲数据。

这样修改后,程序就会遍历你的收藏曲目,每找到一首符合"Angry"情绪的歌就添加一次,直到收集到30首不同的歌曲,或者遍历完所有收藏曲目为止。

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

火山引擎 最新活动