【问题标题】:Spotipy: How to read more than 100 tracks from a playlistSpotipy:如何从播放列表中读取 100 多首曲目
【发布时间】:2016-08-22 18:24:26
【问题描述】:

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

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

user_playlist_tracks(user, playlist_id=None, fields=None, limit=100, 偏移量=0,市场=无)

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

参数:

  • 用户
  • 用户的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,但它返回错误。

【问题讨论】:

    标签: python spotipy


    【解决方案1】:

    许多 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
    

    【讨论】:

    • extend() 方法真的帮了我,谢谢?
    【解决方案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

    【讨论】:

      【解决方案3】:

      我写了一个函数,它可以输出 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
      

      【讨论】:

        【解决方案4】:

        下面是 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)
        

        【讨论】:

        • 超过 100 的任何内容都会导致此错误:spotipy.client.SpotifyException: http status: 400, code:-1 - https://api.spotify.com/v1/users/im.nick.hello/playlists/7lArr0TzHvKoEsj6cotHqZ/tracks?limit=200&offset=0: Invalid limit
        • @NickBecker 从 spotify Web API 查看此链接。 developer.spotify.com/web-api/get-playlist 您需要在分页对象中使用offset 键。在我上面的帖子中,您可以看到代码允许使用 offset 参数。您必须多次调用 API,调整每次调用的偏移量。
        【解决方案5】:

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

        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-17
          • 2017-01-01
          • 2016-11-10
          相关资源
          最近更新 更多