9

我正在尝试使用 Python 的Spotipy 库提取某个播放列表中的所有曲目。

user_playlist_tracks 函数限制为 100 首曲目,与参数限制无关。Spotipy 文档将其描述为:

user_playlist_tracks(用户,playlist_id=None,fields=None,limit=100,offset=0,market=None)

获取用户拥有的播放列表曲目的完整详细信息。

参数:

  • 用户
  • 用户的id playlist_id
  • 播放列表字段的 id
  • 返回哪些字段限制
  • 返回偏移量的最大轨道数
  • 第一道回归市场指数
  • ISO 3166-1 alpha-2 国家代码。

在通过 Spotify 进行身份验证后,我目前正在使用这样的东西:

username = xxxx
playlist = #fromspotipy
sp_playlist = sp.user_playlist_tracks(username, playlist_id=playlist)
tracks = sp_playlist['items']
print tracks

有没有办法返回 100 多首曲目?我尝试在函数参数中设置 limit=None ,但它返回错误。

4

5 回答 5

29

许多 spotipy 方法返回分页结果,因此您必须滚动浏览它们才能查看的不仅仅是最大限制。我在收集播放列表的完整曲目列表时最常遇到这种情况,因此创建了一个自定义方法来处理这个问题:

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
于 2016-08-24T02:33:30.117 回答
2

另一种解决方法是编写一个 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

于 2020-04-08T16:45:00.393 回答
2

我写了一个函数,它可以输出Panda 的 DataFrame,它会为超过 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
于 2021-10-09T22:07:33.823 回答
0

下面是user_playlist_tracksspotipy中使用的模块。(注意它默认为 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)
于 2016-08-22T20:00:38.320 回答
0

尝试上述解决方案时,我收到了关键错误消息。我最终想通了。这是我的解决方案。这仅用于在下一页显示曲目/艺术家。

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)
于 2022-02-23T18:48:49.837 回答