Spotify Web API を利用してカテゴリーのプレイリストを取得する

Spotify Web APIを利用して「ポップ」や「ロック」など特定のカテゴリーのプレイリストを取得することができる。

指定できるカテゴリーについては、これもSpotify Web APIを利用して一覧を取得することができる。まず、このカテゴリー一覧を取得するコードの例が下記となる。


class SpotifyApiClient
{
  private $rootEndpoint = 'https://api.spotify.com/v1/';

  private $accessToken;

  public function __construct($ACCESS_TOKEN)
  {
    $this->accessToken = $ACCESS_TOKEN;
  }

  public function get($path, array $queryParams)
  {
    $url = $this->rootEndpoint . $path;

    if (!empty($queryParams))
      $url .= '?' . http_build_query($queryParams);

    $response = $this->execCurlGET($url);
    sleep(1);

    return json_decode($response, true);
  }

  private function execCurlGET($url)
  {
    $cmd = 'curl --silent' .
           " -H 'Authorization: Bearer {$this->accessToken}'" .
           " '$url'";

    echo "# $cmd\n";

    return shell_exec($cmd);
  }
}


$tokenFile = 'token_new.json';
$token = json_decode(file_get_contents($tokenFile), true);
$client = new SpotifyApiClient($token['access_token']);

$params = [
  'country' => 'JP',
  'locale' => 'ja_JP',
  'limit' => 50,
];
$response = $client->get("browse/categories", $params);

foreach ($response['categories']['items'] as $i => $item)
{
  echo "{$item['id']}, {$item['name']}\n";
}

Spotifyのカテゴリー一覧を取得するには、下記URL

https://api.spotify.com/v1/browse/categories

に対してGETリクエストを行えば良い。

オプションのクエリパラメータとして、country パラメータに2文字の国名コードを指定すると、その国向けのカテゴリーを取得することができる。

また、locale パラメータを指定すると、指定した言語でカテゴリー名を得ることができる(カテゴリーによっては指定した言語で取得できないものもある)。ja_JP のように2文字の言語コードと国名コードをアンダースコアで繋げた文字列を指定する。

limit パラメータは、APIレスポンスに含める最大の結果件数を指定するもので、今回のAPIリクエストでは、APIレスポンスに含める最大カテゴリー数に該当する。上記のコードの例では、50 を指定し最大50件のカテゴリーを取得するようにしている。

下記はコードの出力結果。APIレスポンスとして返ってくるデータの categories キー下にある items キーにカテゴリー情報が配列データとして含まれている。この配列データの各要素には id キーと name キーがあり、上記のコードの例では、この値を参照し出力している。id キーと name キーはそれぞれ、カテゴリーID(例:toplists)とカテゴリー名(例:トップリスト)に対応する。


toplists, トップリスト
radar, Early Noise
j_tracks, J-トラック
pop, ポップ
mood, Mood

...省略...

family, キッズ&ファミリー

次に、取得したカテゴリーIDを使って、特定のカテゴリーのプレイリストをリクエストするコードの例が下記。


class SpotifyApiClient
{
  private $rootEndpoint = 'https://api.spotify.com/v1/';

  private $accessToken;

  public function __construct($ACCESS_TOKEN)
  {
    $this->accessToken = $ACCESS_TOKEN;
  }

  public function get($path, array $queryParams)
  {
    $url = $this->rootEndpoint . $path;

    if (!empty($queryParams))
      $url .= '?' . http_build_query($queryParams);

    $response = $this->execCurlGET($url);
    sleep(1);

    return json_decode($response, true);
  }

  private function execCurlGET($url)
  {
    $cmd = 'curl --silent' .
           " -H 'Authorization: Bearer {$this->accessToken}'" .
           " '$url'";

    echo "# $cmd\n";

    return shell_exec($cmd);
  }
}


$tokenFile = 'token_new.json';
$token = json_decode(file_get_contents($tokenFile), true);
$client = new SpotifyApiClient($token['access_token']);

$categoryId = 'pop';
$params = [
  'country' => 'JP',
];
$response = $client->get("browse/categories/{$categoryId}/playlists", $params);

foreach ($response['playlists']['items'] as $i => $item)
{
  echo "#$i\n";
  echo "name: {$item['name']}\n";
  echo "description: {$item['description']}\n";
  echo "uri: {$item['uri']}\n";
}

特定のカテゴリーのプレイリストを取得するには、下記URL

https://api.spotify.com/v1/browse/categories/{category_id}/playlists

に対してGETリクエストを送信すれば良い。パスのパラメータ category_id にはカテゴリーIDを指定する。

オプションのクエリパラメータとして、country パラメータに2文字の国名コードを指定すると、指定した国向けのプレイリストが得られる。

なお、特定の国向けに特別に存在するカテゴリーIDに対して country パラメータにそれとは違う国名コードを指定するとステータスコードコード 404 が返ってくる。例えば、日本向けに特別に存在するカテゴリーID j_tracks に対して country パラメータに US を指定すると、APIレスポンスのステータスコードとして 404 が返ってきてしまい、結果を得ることができない。無用なエラー処理を省くためには、カテゴリー一覧を取得したときの country パラメータの値とカテゴリーのプレイリストを取得するときの country パラメータの値は同一の国名コードに合わせたほうが無難といえる。

APIレスポンスとして返ってくるデータの playlists キー下にある items キーに指定したカテゴリーのプレイリスト情報が配列データとして入っている。上記のコードの例では、この配列データの各要素にある name キー、description キー、uri キーを参照し、プレイリスト名、プレイリストの説明文、プレイリストのURIを出力している。下記がその出力結果。


#0
name: Top Hits Japan
description: 世界中のトレンドと日本の最新ヒット曲をまとめてお届け。cover: あいみょん
uri: spotify:playlist:37i9dQZF1DXayDMsJG9ZBv
#1
name: Next Up
description: 前週のNew Releaseで大きく注目を浴びた楽曲。 cover: James Blake
uri: spotify:playlist:37i9dQZF1DWZvuOKNcLsjv
#2
name: Spotify Japan 急上昇チャート
description: Spotify Japanのデイリー急上昇チャート。9月17日付。
uri: spotify:playlist:37i9dQZF1DX9vYRBO9gjDe
...