Получайте имена исполнителей только из конечной точки Spotify Web API "Get the Playlist's Tracks" - PullRequest
0 голосов
/ 23 мая 2018

Введение

Я использую эту конечную точку веб-API Spotify.Я использую параметр запроса fields, чтобы запрашивать только те данные, которые мне нужны.

Проблема

Без какой-либо фильтрации возвращаемый из API JSON будет содержать массив с именем items.Первый ключ в каждом объекте items называется added_at.Чтобы получить этот ключ, только параметр fields должен быть items(added_at).

В каждом объекте items есть еще один ключ, называемый track.Внутри track есть массив с именем artists.Каждая запись artists имеет ключ с именем name.Так что это должна быть та же ситуация, что описана во втором абзаце.Поэтому я должен получить имена артистов только с помощью items(track(artists(name))).

На самом деле это всегда возвращает весь массив artists.Кажется, что селектор (name) игнорируется.

Пример

Ответы для items(added_at, track(artists)) & items(added_at, track(artists(name))) на самом деле одинаковы и выглядят так:

{
  "items": [
    {
      "added_at": "2017-08-24T14:56:20Z",
      "track": {
        "artists": [
          {
            "external_urls": {
              "spotify": "https://open.spotify.com/artist/4V8Sr092TqfHkfAA5fXXqG"
            },
            "href": "https://api.spotify.com/v1/artists/4V8Sr092TqfHkfAA5fXXqG",
            "id": "4V8Sr092TqfHkfAA5fXXqG",
            "name": "Luis Fonsi",
            "type": "artist",
            "uri": "spotify:artist:4V8Sr092TqfHkfAA5fXXqG"
          },
          {
            "external_urls": {
              "spotify": "https://open.spotify.com/artist/4VMYDCV2IEDYJArk749S6m"
            },
            "href": "https://api.spotify.com/v1/artists/4VMYDCV2IEDYJArk749S6m",
            "id": "4VMYDCV2IEDYJArk749S6m",
            "name": "Daddy Yankee",
            "type": "artist",
            "uri": "spotify:artist:4VMYDCV2IEDYJArk749S6m"
          }
        ]
      }
    }
  ]
}

Вопрос

Итак, как я могу отфильтровать массив исполнителей, чтобы показывать только имена исполнителей, используя параметры запроса?Я ошибаюсь из-за предположения, что items & added_at можно сравнить с artists & name, и, следовательно, синтаксис, который я использую, неверен или я пропускаю что-то еще?

Правки

  • Эти два запроса также показывают тот же ответ, что и показанные выше: items(track.artists(name)) & items(track.artists).

1 Ответ

0 голосов
/ 23 мая 2018

Вы не зайдете слишком далеко, попробовав конечную точку через веб-страницу документации.Попробуйте программно.

Ниже я покажу, как вы можете получить доступ к конечной точке playlists, используя как прямые запросы (запросы Python), так и красивую оболочку для API (spotipy).

Копироватьваш токен доступа, сгенерированный на веб-странице вашего спойтинга, в файл по тому же пути, что и этот скрипт, скажем, playlists.py.

Вы можете получить имя артиста из всех списков воспроизведения, запрошенных так:

import requests
import spotipy
import spotipy.util as util
import json

SEARCH_PLAYLIST_ENDPOINT ='https://api.spotify.com/v1/search?type=playlist'

def search_playlist(name):
    path = 'token.json'
    with open(path) as t:
        token = json.load(t)
    myparams = {'type': 'playlilst'}
    myparams['q'] = name
    resp = requests.get(SEARCH_PLAYLIST_ENDPOINT, params=myparams, headers={"Authorization": "Bearer {}".format(token)})
    pprint (resp.json())
    return resp.json()


def query_playlist(playlist):

    path = 'token.json'
    with open(path) as t:
        token = json.load(t)

    sp = spotipy.Spotify(auth=token)

    data = search_playlist(playlist)
    # get playlists
    playlists = data['playlists']['items']

    for playlist in playlists:
        uri = playlist['uri']
        username = uri.split(':')[2]
        playlist_id = uri.split(':')[4]
        # query playlists
        results = sp.user_playlist(username, playlist_id)
        # separate data by track
        tracks = results['tracks']           
        # lookup       
        for item in tracks['items']:
            track = item['track']
            artist = track['artists'][0]['name']
            print artist


print query_playlist('rock and roll')
...