Spotipy:如何从播放列表中读取超过 100 首曲目
Spotipy: How to read more than 100 tracks from a playlist
我正在尝试使用 python 的 Spotipy library 提取特定播放列表中的所有曲目。
user_playlist_tracks函数限制为100个曲目,与参数限制无关。 Spotipy 文档将其描述为:
user_playlist_tracks(user, playlist_id=None, fields=None, limit=100,
offset=0, market=None)
Get full details of the tracks of a playlist
owned by a user.
Parameters:
- user
- the id of the user playlist_id
- the id of the playlist fields
- which fields to return limit
- the maximum number of tracks to return offset
- the index of the first track to return market
- an ISO 3166-1 alpha-2 country code.
使用 Spotify 进行身份验证后,我目前使用的是这样的东西:
username = xxxx
playlist = #fromspotipy
sp_playlist = sp.user_playlist_tracks(username, playlist_id=playlist)
tracks = sp_playlist['items']
print tracks
有没有办法return超过100首曲目?我已经尝试在函数参数中设置 limit=None,但它 return 是一个错误。
下面是spotipy中使用的user_playlist_tracks
模块。 (注意它默认为 100 个限制)。
尝试将限制设置为 200。
def user_playlist_tracks(self, user, playlist_id = None, fields=None,
limit=100, offset=0):
''' Get full details of the tracks of a playlist owned by a user.
Parameters:
- user - the id of the user
- playlist_id - the id of the playlist
- fields - which fields to return
- limit - the maximum number of tracks to return
- offset - the index of the first track to return
'''
plid = self._get_id('playlist', playlist_id)
return self._get("users/%s/playlists/%s/tracks" % (user, plid),
limit=limit, offset=offset, fields=fields)
许多 spotipy 方法 return 分页结果,因此您必须滚动浏览它们才能查看超过最大限制的内容。我在收集播放列表的完整曲目列表时最常遇到这种情况,因此创建了一个自定义方法来处理此问题:
def get_playlist_tracks(username,playlist_id):
results = sp.user_playlist_tracks(username,playlist_id)
tracks = results['items']
while results['next']:
results = sp.next(results)
tracks.extend(results['items'])
return tracks
另一种解决方法是编写一个 for 循环并执行:
offset +=100
然后您可以在末尾连接轨道,或将它们放入数据框中。
函数参考:
playlist_tracks(playlist_id, fields=None, limit=100, offset=0, market=None)
参考:https://spotipy.readthedocs.io/en/2.7.0/#spotipy.client.Spotify.playlist_tracks
我写了一个可以输出 Panda 的 DataFrame 的函数,它提取所有元数据(不是全部,因为我不想,但你可以做一些 space 表示)超过 100 首歌曲的播放列表。我通过 遍历每首歌曲,找到每首歌曲的元数据,将元数据保存到字典,然后将字典连接到 DataFrame 来实现。它需要您的用户名和播放列表 ID 作为输入。
# Function to extract MetaData from a playlist thats longer than 100 songs
def get_playlist_tracks_more_than_100_songs(username, playlist_id):
results = sp.user_playlist_tracks(username,playlist_id)
tracks = results['items']
while results['next']:
results = sp.next(results)
tracks.extend(results['items'])
results = tracks
playlist_tracks_id = []
playlist_tracks_titles = []
playlist_tracks_artists = []
playlist_tracks_first_artists = []
playlist_tracks_first_release_date = []
playlist_tracks_popularity = []
for i in range(len(results)):
print(i) # Counter
if i == 0:
playlist_tracks_id = results[i]['track']['id']
playlist_tracks_titles = results[i]['track']['name']
playlist_tracks_first_release_date = results[i]['track']['album']['release_date']
playlist_tracks_popularity = results[i]['track']['popularity']
artist_list = []
for artist in results[i]['track']['artists']:
artist_list= artist['name']
playlist_tracks_artists = artist_list
features = sp.audio_features(playlist_tracks_id)
features_df = pd.DataFrame(data=features, columns=features[0].keys())
features_df['title'] = playlist_tracks_titles
features_df['all_artists'] = playlist_tracks_artists
features_df['popularity'] = playlist_tracks_popularity
features_df['release_date'] = playlist_tracks_first_release_date
features_df = features_df[['id', 'title', 'all_artists', 'popularity', 'release_date',
'danceability', 'energy', 'key', 'loudness',
'mode', 'acousticness', 'instrumentalness',
'liveness', 'valence', 'tempo',
'duration_ms', 'time_signature']]
continue
else:
try:
playlist_tracks_id = results[i]['track']['id']
playlist_tracks_titles = results[i]['track']['name']
playlist_tracks_first_release_date = results[i]['track']['album']['release_date']
playlist_tracks_popularity = results[i]['track']['popularity']
artist_list = []
for artist in results[i]['track']['artists']:
artist_list= artist['name']
playlist_tracks_artists = artist_list
features = sp.audio_features(playlist_tracks_id)
new_row = {'id':[playlist_tracks_id],
'title':[playlist_tracks_titles],
'all_artists':[playlist_tracks_artists],
'popularity':[playlist_tracks_popularity],
'release_date':[playlist_tracks_first_release_date],
'danceability':[features[0]['danceability']],
'energy':[features[0]['energy']],
'key':[features[0]['key']],
'loudness':[features[0]['loudness']],
'mode':[features[0]['mode']],
'acousticness':[features[0]['acousticness']],
'instrumentalness':[features[0]['instrumentalness']],
'liveness':[features[0]['liveness']],
'valence':[features[0]['valence']],
'tempo':[features[0]['tempo']],
'duration_ms':[features[0]['duration_ms']],
'time_signature':[features[0]['time_signature']]
}
dfs = [features_df, pd.DataFrame(new_row)]
features_df = pd.concat(dfs, ignore_index = True)
except:
continue
return features_df
尝试上述解决方案时,我收到了关键错误消息。我终于明白了。这是我的解决方案。这仅用于在下一页显示 tracks/artists。
id = "5lrkIjzukk65X4ksulpA0H?si=9db60a70278a4fd6"
results = sp.playlist_items(id)
tracks = results['tracks']
next_pages = 14
track_list = []
for i in range(next_pages):
tracks = sp.next(tracks)
for y in range(0,100):
try:
track = tracks['items'][y]['track']['name']
artist = tracks['items'][y]['track']['artists'][0]['name']
track_list.append(artist)
except:
continue
print(track_list)
不幸的是,SpotiPy 使他们的 API 访问变得复杂。尝试在 r 中使用 SpotifyR,只需几行代码即可完成。不需要循环、列表、额外变量或附加。然后,如果您愿意,只需将其弹回 python。
library(spotifyr)
df <- get_playlist_audio_features('playlist_owner_username', 'playlist_uri')
砰的一声,大功告成。我不确定最大值是多少,但我知道它超过 300 首歌曲,因为我已经把它拉进去了。
我正在尝试使用 python 的 Spotipy library 提取特定播放列表中的所有曲目。
user_playlist_tracks函数限制为100个曲目,与参数限制无关。 Spotipy 文档将其描述为:
user_playlist_tracks(user, playlist_id=None, fields=None, limit=100, offset=0, market=None)
Get full details of the tracks of a playlist owned by a user.
Parameters:
- user
- the id of the user playlist_id
- the id of the playlist fields
- which fields to return limit
- the maximum number of tracks to return offset
- the index of the first track to return market
- an ISO 3166-1 alpha-2 country code.
使用 Spotify 进行身份验证后,我目前使用的是这样的东西:
username = xxxx
playlist = #fromspotipy
sp_playlist = sp.user_playlist_tracks(username, playlist_id=playlist)
tracks = sp_playlist['items']
print tracks
有没有办法return超过100首曲目?我已经尝试在函数参数中设置 limit=None,但它 return 是一个错误。
下面是spotipy中使用的user_playlist_tracks
模块。 (注意它默认为 100 个限制)。
尝试将限制设置为 200。
def user_playlist_tracks(self, user, playlist_id = None, fields=None,
limit=100, offset=0):
''' Get full details of the tracks of a playlist owned by a user.
Parameters:
- user - the id of the user
- playlist_id - the id of the playlist
- fields - which fields to return
- limit - the maximum number of tracks to return
- offset - the index of the first track to return
'''
plid = self._get_id('playlist', playlist_id)
return self._get("users/%s/playlists/%s/tracks" % (user, plid),
limit=limit, offset=offset, fields=fields)
许多 spotipy 方法 return 分页结果,因此您必须滚动浏览它们才能查看超过最大限制的内容。我在收集播放列表的完整曲目列表时最常遇到这种情况,因此创建了一个自定义方法来处理此问题:
def get_playlist_tracks(username,playlist_id):
results = sp.user_playlist_tracks(username,playlist_id)
tracks = results['items']
while results['next']:
results = sp.next(results)
tracks.extend(results['items'])
return tracks
另一种解决方法是编写一个 for 循环并执行:
offset +=100
然后您可以在末尾连接轨道,或将它们放入数据框中。 函数参考:
playlist_tracks(playlist_id, fields=None, limit=100, offset=0, market=None)
参考:https://spotipy.readthedocs.io/en/2.7.0/#spotipy.client.Spotify.playlist_tracks
我写了一个可以输出 Panda 的 DataFrame 的函数,它提取所有元数据(不是全部,因为我不想,但你可以做一些 space 表示)超过 100 首歌曲的播放列表。我通过 遍历每首歌曲,找到每首歌曲的元数据,将元数据保存到字典,然后将字典连接到 DataFrame 来实现。它需要您的用户名和播放列表 ID 作为输入。
# Function to extract MetaData from a playlist thats longer than 100 songs
def get_playlist_tracks_more_than_100_songs(username, playlist_id):
results = sp.user_playlist_tracks(username,playlist_id)
tracks = results['items']
while results['next']:
results = sp.next(results)
tracks.extend(results['items'])
results = tracks
playlist_tracks_id = []
playlist_tracks_titles = []
playlist_tracks_artists = []
playlist_tracks_first_artists = []
playlist_tracks_first_release_date = []
playlist_tracks_popularity = []
for i in range(len(results)):
print(i) # Counter
if i == 0:
playlist_tracks_id = results[i]['track']['id']
playlist_tracks_titles = results[i]['track']['name']
playlist_tracks_first_release_date = results[i]['track']['album']['release_date']
playlist_tracks_popularity = results[i]['track']['popularity']
artist_list = []
for artist in results[i]['track']['artists']:
artist_list= artist['name']
playlist_tracks_artists = artist_list
features = sp.audio_features(playlist_tracks_id)
features_df = pd.DataFrame(data=features, columns=features[0].keys())
features_df['title'] = playlist_tracks_titles
features_df['all_artists'] = playlist_tracks_artists
features_df['popularity'] = playlist_tracks_popularity
features_df['release_date'] = playlist_tracks_first_release_date
features_df = features_df[['id', 'title', 'all_artists', 'popularity', 'release_date',
'danceability', 'energy', 'key', 'loudness',
'mode', 'acousticness', 'instrumentalness',
'liveness', 'valence', 'tempo',
'duration_ms', 'time_signature']]
continue
else:
try:
playlist_tracks_id = results[i]['track']['id']
playlist_tracks_titles = results[i]['track']['name']
playlist_tracks_first_release_date = results[i]['track']['album']['release_date']
playlist_tracks_popularity = results[i]['track']['popularity']
artist_list = []
for artist in results[i]['track']['artists']:
artist_list= artist['name']
playlist_tracks_artists = artist_list
features = sp.audio_features(playlist_tracks_id)
new_row = {'id':[playlist_tracks_id],
'title':[playlist_tracks_titles],
'all_artists':[playlist_tracks_artists],
'popularity':[playlist_tracks_popularity],
'release_date':[playlist_tracks_first_release_date],
'danceability':[features[0]['danceability']],
'energy':[features[0]['energy']],
'key':[features[0]['key']],
'loudness':[features[0]['loudness']],
'mode':[features[0]['mode']],
'acousticness':[features[0]['acousticness']],
'instrumentalness':[features[0]['instrumentalness']],
'liveness':[features[0]['liveness']],
'valence':[features[0]['valence']],
'tempo':[features[0]['tempo']],
'duration_ms':[features[0]['duration_ms']],
'time_signature':[features[0]['time_signature']]
}
dfs = [features_df, pd.DataFrame(new_row)]
features_df = pd.concat(dfs, ignore_index = True)
except:
continue
return features_df
尝试上述解决方案时,我收到了关键错误消息。我终于明白了。这是我的解决方案。这仅用于在下一页显示 tracks/artists。
id = "5lrkIjzukk65X4ksulpA0H?si=9db60a70278a4fd6"
results = sp.playlist_items(id)
tracks = results['tracks']
next_pages = 14
track_list = []
for i in range(next_pages):
tracks = sp.next(tracks)
for y in range(0,100):
try:
track = tracks['items'][y]['track']['name']
artist = tracks['items'][y]['track']['artists'][0]['name']
track_list.append(artist)
except:
continue
print(track_list)
不幸的是,SpotiPy 使他们的 API 访问变得复杂。尝试在 r 中使用 SpotifyR,只需几行代码即可完成。不需要循环、列表、额外变量或附加。然后,如果您愿意,只需将其弹回 python。
library(spotifyr)
df <- get_playlist_audio_features('playlist_owner_username', 'playlist_uri')
砰的一声,大功告成。我不确定最大值是多少,但我知道它超过 300 首歌曲,因为我已经把它拉进去了。