我想创建一个使用Spotipy从Spotify播放列表中编译曲目URI列表的函数。我编写的函数现在可以正常工作,只是返回了太多信息,而我对如何过滤出想要的内容感到困惑。
我尝试索引结果本身,并在sp.user_playlist_tracks()函数中弄乱了field参数,但是似乎没有什么仅返回轨道URI。
下面的函数从'playlist_id'参数指定的Spotify播放列表中捕获所有曲目:
def get_playlist_tracks(auth_client, username, playlist_id):
# Ref - https://stackoverflow.com/questions/39086287/spotipy-how-to-read-more-than-100-tracks-from-a-playlist?noredirect=1&lq=1
results = sp.user_playlist_tracks(username,playlist_id)
tracks = results['items']
while results['next']:
results = sp.next(results)
tracks.extend(results['items'])
return tracks
该函数以JSON格式返回对象列表:
[{'album_type': 'album', 'artists': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/4WVDlzQCHAIWzBP5iZwuOJ'}, 'href': 'https://api.spotify.com/v1/artists/4WVDlzQCHAIWzBP5iZwuOJ', 'id': '4WVDlzQCHAIWzBP5iZwuOJ', 'name': 'Sybyr', 'type': 'artist', 'uri': 'spotify:artist:4WVDlzQCHAIWzBP5iZwuOJ'}], 'available_markets': ['AD', 'AE', 'AR', 'AT', 'AU', 'BE', 'BG', 'BH', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'DZ', 'EC', 'EE', 'EG', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IL', 'IN', 'IS', 'IT', 'JO', 'JP', 'KW', 'LB', 'LI', 'LT', 'LU', 'LV', 'MA', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'OM', 'PA', 'PE', 'PH', 'PL', 'PS', 'PT', 'PY', 'QA', 'RO', 'SA', 'SE', 'SG', 'SK', 'SV', 'TH', 'TN', 'TR', 'TW', 'US', 'UY', 'VN', 'ZA'], 'external_urls': {'spotify': 'https://open.spotify.com/album/4c64we435X1d5Bz6YAgrOZ'}, 'href': 'https://api.spotify.com/v1/albums/4c64we435X1d5Bz6YAgrOZ', 'id': '4c64we435X1d5Bz6YAgrOZ', 'images': [{'height': 640, 'url': 'https://i.scdn.co/image/e95d7e36e91eebde585841005d5e384b5a751c9f', 'width': 640}, {'height': 300, 'url': 'https://i.scdn.co/image/0fb974f445a9e757456f95875621b471f36e3601', 'width': 300}, {'height': 64, 'url': 'https://i.scdn.co/image/72435c83decf6b49ce5f117ea86d442245c67b97', 'width': 64}], 'name': 'Anti-World', 'release_date': '2016-03-11', 'release_date_precision': 'day', 'total_tracks': 19, 'type': 'album', 'uri': 'spotify:album:4c64we435X1d5Bz6YAgrOZ'}, 'artists': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/4WVDlzQCHAIWzBP5iZwuOJ'}, 'href': 'https://api.spotify.com/v1/artists/4WVDlzQCHAIWzBP5iZwuOJ', 'id': '4WVDlzQCHAIWzBP5iZwuOJ', 'name': 'Sybyr', 'type': 'artist', 'uri': 'spotify:artist:4WVDlzQCHAIWzBP5iZwuOJ'}], 'available_markets': ['AD', 'AE', 'AR', 'AT', 'AU', 'BE', 'BG', 'BH', 'BO', 'BR', 'CA', 'CH', 'CL', 'CO', 'CR', 'CY', 'CZ', 'DE', 'DK', 'DO', 'DZ', 'EC', 'EE', 'EG', 'ES', 'FI', 'FR', 'GB', 'GR', 'GT', 'HK', 'HN', 'HU', 'ID', 'IE', 'IL', 'IN', 'IS', 'IT', 'JO', 'JP', 'KW', 'LB', 'LI', 'LT', 'LU', 'LV', 'MA', 'MC', 'MT', 'MX', 'MY', 'NI', 'NL', 'NO', 'NZ', 'OM', 'PA', 'PE', 'PH', 'PL', 'PS', 'PT', 'PY', 'QA', 'RO', 'SA', 'SE', 'SG', 'SK', 'SV', 'TH', 'TN', 'TR', 'TW', 'US', 'UY', 'VN', 'ZA'], 'disc_number': 1, 'duration_ms': 196257, 'episode': False, 'explicit': True, 'external_ids': {'isrc': 'QM42K1611819'}, 'external_urls': {'spotify': 'https://open.spotify.com/track/1t3hLzPZV1BBl9BoQXPHVg'}, 'href': 'https://api.spotify.com/v1/tracks/1t3hLzPZV1BBl9BoQXPHVg', 'id': '1t3hLzPZV1BBl9BoQXPHVg', 'is_local': False, 'name': 'I Like Being', 'popularity': 41, 'preview_url': 'https://p.scdn.co/mp3-preview/d50e51258de77503b0944764adcc67df48e45a5d?cid=de8dcc8f79484e728e1c16279585f8a1', 'track': True, 'track_number': 11, 'type': 'track', 'uri': 'spotify:track:1t3hLzPZV1BBl9BoQXPHVg'}, 'video_thumbnail': {'url': None}}, ....]
有人知道如何索引返回结果以仅获取跟踪URI吗?还是知道如何使用field参数仅获取轨道URI?我浏览了Spotify API和Spotipy文档,但似乎没有任何答案可以回答这个特定问题。
答案 0 :(得分:0)
我想我明白了!当循环遍历“结果”中的每个项目时,可以使用item ['track'] ['uri']为轨道URI编制索引。这是我更新的get_playlist_tracks()函数,该函数将忽略所有获取的本地轨道,并将发现的URI附加到数组中:
def get_playlist_tracks(auth_client, username, playlist_id):
# Ref - https://stackoverflow.com/questions/39086287/spotipy-how-to-read-more-than-100-tracks-from-a-playlist?noredirect=1&lq=1
results = sp.user_playlist_tracks(username,playlist_id)
playlist_items = results['items']
uris = []
while results['next']:
results = sp.next(results)
playlist_items.append(results['items'])
for item in playlist_items:
is_local = item["is_local"]
if is_local == True: # Filtering out any local tracks (i.e. not hosted by Spotify)
continue
else:
track_uri = item["track"]["uri"]
uris.append(track_uri)
return uris