【问题标题】:I want to make a playlist from all my liked songs on spotify with spotipy library我想用 spotify 库从我所有喜欢的歌曲中制作一个播放列表
【发布时间】:2020-12-18 03:48:26
【问题描述】:

由于我喜欢的歌曲不公开,我希望 spotipy 从所有歌曲中获取列表并将它们添加到我的播放列表中,但是当我尝试使用循环执行此操作时,它说 uri 不正确,我不知道不知道我是否应该使用其他方法。

client_credentials_manager = SpotifyClientCredentials(client_id=cid, client_secret=secret)
scope = 'user-library-read playlist-modify-public'
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager,auth_manager=SpotifyOAuth(scope=scope))
def show_tracks(results):
    for item in results['items']:
        track = item['track']
        #print("%32.32s %s" % (track['artists'][0]['name'], track['name']))
        sp.playlist_add_items(playlist_id, track['uri'])

results = sp.current_user_saved_tracks()
show_tracks(results)

while results['next']:
    results = sp.next(results)
    show_tracks(results)

错误是

HTTP Error for POST to https://api.spotify.com/v1/playlists/5ZzsovDgANZfiXgRrwq5fw/tracks returned 400 due to Invalid track uri: spotify:track:s
Traceback (most recent call last):
  File "C:\Users\ferch\AppData\Local\Programs\Python\Python37\lib\site-packages\spotipy\client.py", line 245, in _internal_call
    response.raise_for_status()
  File "C:\Users\ferch\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\models.py", line 941, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://api.spotify.com/v1/playlists/5ZzsovDgANZfiXgRrwq5fw/tracks

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "make_playlists.py", line 23, in <module>
    show_tracks(results)
  File "make_playlists.py", line 20, in show_tracks
    sp.playlist_add_items(playlist_id, track['uri'])
  File "C:\Users\ferch\AppData\Local\Programs\Python\Python37\lib\site-packages\spotipy\client.py", line 1025, in playlist_add_items
    position=position,
  File "C:\Users\ferch\AppData\Local\Programs\Python\Python37\lib\site-packages\spotipy\client.py", line 296, in _post
    return self._internal_call("POST", url, payload, kwargs)
  File "C:\Users\ferch\AppData\Local\Programs\Python\Python37\lib\site-packages\spotipy\client.py", line 266, in _internal_call
    headers=response.headers,
spotipy.exceptions.SpotifyException: http status: 400, code:-1 - https://api.spotify.com/v1/playlists/5ZzsovDgANZfiXgRrwq5fw/tracks:
 Invalid track uri: spotify:track:s, reason: None

我认为这个问题是因为track['uri']的变量类型

【问题讨论】:

    标签: python python-3.x api spotipy libspotify


    【解决方案1】:

    playlist_add_items 期望将 URI、URL 或 ID 列表添加到播放列表,但现在您传递的是单个 URI,它是这样的字符串:spotify:track:2t7rS8BHF5TmnBR5PmnnSUspotipy 库的代码很可能在循环for item in items...,因此当您将字符串传递给它时,它会将字符串中的每个字符视为不同的项目。因此它遇到第一个字符s 并尝试从中生成一个URI,从而得到spotify:track:s。这不是有效的 URI,因此请求失败。

    您可以尝试将 uri 包装在一个列表中,如下所示:

    for item in results['items']:
            track = item['track']
            # Note brackets around track['uri']
            sp.playlist_add_items(playlist_id, [track['uri']])  
    

    这将解决您现在遇到的问题,但是您可能会遇到问题,您需要为每个要添加到播放列表的曲目发出一个请求。您可能会遇到rate limiting 问题,因此我建议您尝试一次构建一个包含 100 个 URI 的列表,which is the max that can be sent in one request

    记住这一点,我们可以尝试这样的事情:

    def show_tracks(results):
        for idx in range(0, len(results['items']), 100):
             uris = [item['track']['uri'] for item in results['items'][idx:idx+100]]
             sp.playlist_add_items(playlist_id, uris)
    

    【讨论】:

    • 非常感谢! :) 一周以来,我一直试图了解 spotipy 的工作原理
    【解决方案2】:

    另一种方法是创建一个包含您要添加的曲目的所有 uris/id 的列表,然后将该列表传递给 sp.playlist_add_items() 函数。如果您进一步需要 uris 列表,这可能很有用。像这样:

    uris = []        
    
    for item in results['items']:
        track = item['track']
        uris.append(track['uri'])
    
    sp.playlist_add_items(playlist_id, uris)
    

    请记住,sp.playlist_add_items 一次只能添加

    i = 0
    increment = 99
    while i < len(songIDS)+increment:
        try:
            sp.playlist_add_items(playlistID, songIDS[i: i+increment])
        except spotipy.exceptions.SpotifyException:
            pass
    
        i += increment
    

    希望这会有所帮助,我自己只使用了一个星期的 spotipy

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 1970-01-01
      • 2023-03-26
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      相关资源
      最近更新 更多