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