Я хочу создать плейлист из всех моих любимых песен на spotify с помощью библиотеки spotipy

#python #python-3.x #api #spotipy #libspotify

#python #python-3.x #API #spotipy #libspotify

Вопрос:

Поскольку мои любимые песни не являются общедоступными, я хочу, чтобы 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("2.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:UsersferchAppDataLocalProgramsPythonPython37libsite-packagesspotipyclient.py", line 245, in _internal_call
    response.raise_for_status()
  File "C:UsersferchAppDataLocalProgramsPythonPython37libsite-packagesrequestsmodels.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:UsersferchAppDataLocalProgramsPythonPython37libsite-packagesspotipyclient.py", line 1025, in playlist_add_items
    position=position,
  File "C:UsersferchAppDataLocalProgramsPythonPython37libsite-packagesspotipyclient.py", line 296, in _post
    return self._internal_call("POST", url, payload, kwargs)
  File "C:UsersferchAppDataLocalProgramsPythonPython37libsite-packagesspotipyclient.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’]

Ответ №1:

playlist_add_items ожидает, что список URI, URL-адресов или идентификаторов будет добавлен в плейлист, но прямо сейчас вы передаете один URI, который представляет собой строку, подобную этой : spotify:track:2t7rS8BHF5TmnBR5PmnnSU . Код spotipy библиотеки, вероятно, выполняет цикл 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']])  
 

Это решит проблему, с которой вы сталкиваетесь сейчас, но у вас могут возникнуть проблемы с выполнением одного запроса на трек, который вы хотите добавить в плейлист. Вы можете столкнуться с проблемами ограничения скорости, поэтому я рекомендую попытаться создать список из 100 URI одновременно, что является максимальным значением, которое может быть отправлено в одном запросе.

Помня об этом, мы могли бы попробовать что-то вроде этого:

 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)
 

Комментарии:

1. Большое спасибо! 🙂 Я пытался узнать, как работает spotipy в течение недели

Ответ №2:

Другим способом сделать это было бы создать список со всеми uri / идентификаторами треков, которые вы хотите добавить, а затем передать этот список в функцию sp.playlist_add_items() . Это может быть полезно, если вам снова понадобится список uri в дальнейшем. Вот так :

 uris = []        

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

sp.playlist_add_items(playlist_id, uris)
 

Имейте в виду, что sp.playlist_add_items позволяет добавлять только <= 100 треков одновременно. я создал этот цикл для обработки добавления списка треков независимо от размера: (где songIDs — это список идентификаторов песен / uri)

 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 всего неделю