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
...

Spotify Web API を利用しておすすめプレイリストを取得する

Spotify Web APIを利用しておすすめプレイリストを取得することができる。このプレイリスト情報は、Spotifyが作成したプレイリストが対象となる(ユーザーが作成したプレイリストは対象外)。このAPIリクエストの特徴として、日時を指定する timestamp パラメータが用意されており、指定した時間や曜日に応じて内容が変わる。

例えば、timestamp パラメータに 2020-09-16T09:00:00 のように朝9時を指定すると通勤や通学時向けのアップテンポな楽曲を集めたプレイリスト情報が得られる。朝だけでなく、昼や夕方、深夜の時間帯を指定すると、その時間帯に合わせたプレイリスト情報になる。また、曜日によっても内容が変わり、例えば土曜日の日時を指定すると「今週の〇〇を…」といったプレイリスト情報が得られる。
※月や季節、年、特定の日付に応じて内容が変わるかどうかは未確認。

下記は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',
  'timestamp' => '2020-09-16T09:00:00',
];
$response = $client->get('browse/featured-playlists', $params);
var_dump($response);

おすすめプレイリストを取得するAPIリクエストは、下記URLに対して

https://api.spotify.com/v1/browse/featured-playlists

GETリクエストを送信することで実行できる。オプションのクエリパラメータとして、country パラメータに JP を指定すると、日本向けのプレイリスト情報を取得することができる。また、timestampyyyy-MM-ddTHH:mm:ss 形式(ISO 8601)で日時を指定することができ、記事の冒頭で紹介したように、このパラメータにより時間帯や曜日に合わせた情報を得ることができる。

Spotify Web API を利用して関連アーティスト情報を取得する

Spotify Web APIを利用して指定したアーティストに関連するアーティスト情報を取得することができる。関連アーティストというのは、類似するアーティストのことで、Spotifyがコミュニティの視聴履歴データを元に割り出している。また、特定のアーティストに対して、取得できる関連アーティストは最大20アーティストまでとなる。

下記は、関連アーティスト情報を取得するコードの例。


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' .
           " -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']);

$artistId = '64tJ2EAv1R6UaZqc4iOCyj'; // YOASOBI
$response = $client->get("artists/$artistId/related-artists", []);
var_dump($response);

関連アーティスト情報を取得するAPIリクエストは、下記URL

https://api.spotify.com/v1/artists/{id}/related-artists

に対してGETリクエストを行えば良い。このとき、パスのパラメータ id にアーティストIDを指定する。

APIレスポンスとして、指定したアーティストIDに関連するアーティスト情報が返される。その件数は最大で20件までとなる。

また、関連アーティスト情報は、レスポンスデータの artists キーに入っている。

Spotify Web API を利用してアーティストの人気の曲情報を取得する

Spotify Web APIを利用してアーティストの人気の曲情報を取得することができる。取得できるのは、人気度順にソートされた最大10曲から成る曲情報となる。

下記は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' .
           " -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']);

$artistId = '64tJ2EAv1R6UaZqc4iOCyj';
$params = [
  'country' => 'JP'
];
$response = $client->get("artists/$artistId/top-tracks", $params);
var_dump($response);

アーティストの人気曲の情報は、下記URL

https://api.spotify.com/v1/artists/{id}/top-tracks

に対して、パスのパラメータ id にアーティストIDを指定しGETリクエストを送信すれば良い。また、このとき、必須のクエリパラメータとして、country パラメータに2文字の国名コードを指定する必要がある。

APIリクエスト実行後、人気曲の情報はレスポンスデータの tracks キーに配列データ(最大10曲)として保持されている。配列の各データには、曲情報に加え、アルバムとアーティスト情報も含まれている。曲名は name キー、再生可能なMP3形式の曲ファイル(30秒のプレビュー版)へのURLが preview_url キーに保持されている。曲の人気度は popularity キーの値を参照すれば良い。また、アルバムとアーティスト情報は、それぞれ album キーと artists キーに保持されている。

Spotify Web API を利用してランダムにアーティストを選んで情報を取得する方法

Spotify Web APIを利用してランダムにアーティストを選び情報を取得する方法を紹介する。

アーティストをランダムに選ぶAPIリクエストは、Spotify Web APIで直接提供されていないが、検索リクエストを工夫して利用することにより実現することができる。大まかには下記のように行う。

  1. 特定の条件でアーティストを検索するリクエストを行い、結果の総件数を取得する
  2. 結果の総件数の範囲内でランダムな整数を生成し、結果の中からアーティストを選択する

加えて、ランダムな整数を生成する上で、検索リクエスト時のクエリパラメータ offset の値が取り得る範囲を考慮する必要がある。

  • offset: 最小値は 0、最大値は 2000
    • 注意点として、offset の値は limit の値を含めて考える必要がある。limit = 20 のとき、offset の値は、offset = 0offset = 20offset = 40 のように limit の値に応じてインクリメントする必要がある。

特定の条件でアーティストの検索を行い、その結果の総件数が 2000 件内に収まる場合、総件数は offset の取り得る範囲内なので、limit1 にして、offset の値に 0 から 総件数 - 1 の範囲でランダムな整数を設定すれば、APIレスポンスとして返される結果の中から一つのアーティスト情報をランダムに選択できることになる。

検索結果の総件数が 2000 件より大きい場合は、limit の値は 1 のままで良いが、offset の取り得る範囲を超えるので、0 から 1999 の範囲でランダムな整数を生成する他ない。

下記が以上を踏まえて実装したランダムなアーティスト情報を取得するコード。


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' .
           " -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 = [
  'q' => 'genre:"j-pop"',
  'type' => 'artist',
  'market' => 'JP',
  'limit' => 1,
];

// まずは、乱数生成に必要な総件数を取得するためにAPIリクエストを行う
$response = $client->get("search", $params);

$n = $response['artists']['total'];
echo "total: $n\n";

if ($n > 0)
{
  // offset に乱数をセットして、結果の中から
  // ランダムにアーティスト情報を取得する
  $params['offset'] = rand(0, min($n - 1, 1999));
  $response = $client->get("search", $params);

  $randomArtist = $response['artists']['items'][0];

  var_dump($randomArtist);
}

検索リクエストは、下記URL

https://api.spotify.com/v1/search

に対して、GETリクエストを行えば良い。このとき、必須のクエリパラメータとして q パラメータと type パラメータを指定する必要がある。

上記のコードでは、q パラメータに genre:"j-pop" を指定しジャンルを限定している。genre:"j-pop" year:2020genre:"j-pop" year:2015-2020 のようにして特定の年や年の範囲を指定することもできる。
q パラメータについての詳細は下記を参照のこと。
Search for an Item | Spotify for Developers

そして、type パラメータに artist を指定している。これによりアーティストを対象に検索を行うことができる。

また、オプションのクエリパラメータとして、marketJP を指定し、日本で利用可能なコンテンツを持つアーティストが対象になるようにしている。

結果のページネーションに利用する limitoffset パラメータは記事の冒頭で説明したように、limit には 1 を設定して、offset には検索結果の総件数に応じた乱数を設定し、検索結果の中からランダムに一つのアーティスト情報を取得するようにしている。

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' .
           " -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']);

$artistId = '64tJ2EAv1R6UaZqc4iOCyj'; // YOASOBI
$response = $client->get("artists/$artistId", []);
var_dump($response);

アーティストのカタログ情報は、パスのパラメータ id にアーティストIDを指定し、下記のURLに対してGETリクエストを送信すれば良い。

https://api.spotify.com/v1/artists/{id}

APIリクエスト実行後、レスポンスデータの followers キー下に hreftotal キーがあり、total キーの値がフォロワー数を指す。href キーには、フォロワーの詳細情報を得るためのWeb APIのエンドポイントが入るが、現時点でまだサポートされていないため、値は常に null となる。

レスポンスデータの genres キーには、アーティストに関連付けられたジャンルのリストが保持されている。

レスポンスデータにある popularity キーは、アーティストの人気度を示すもので、この人気度はアーティストの全ての曲の人気度から計算される。0 から 100 までの値が入り、100 が最も人気があることを示す。

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' .
           " -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 = [
  'market' => 'JP',
];
$albumId = '4nLIK2uFzYUJqLAfJZYgLx';
$response = $client->get("albums/$albumId", $params);
var_dump($response);

アルバムのカタログ情報は、下記URLに対してGETリクエストを送信することで得ることができる。

https://api.spotify.com/v1/albums/{id}

パスのパラメータ id には、アルバムIDを指定する。

また、APIリクエスト時のオプションのクエリパラメータとして market パラメータに2文字の国名コードを指定することができる。このパラメータを指定すると、Spotifyユーザーのプロフィール設定に登録された国情報により、アルバム内の特定の曲がそのユーザーの国では入手不可となる場合に、そのユーザーの国で利用可能なオリジナル曲の別の実体の曲データがあれば、その情報をAPIレスポンスに入れてくれる(公式ドキュメントでは、この機能を「Track Relinking」と呼んでいる)。
※Spotifyは、それぞれのマーケット(国)で入手可能な複数の実体の曲データを保持している。これはアルバム内の曲がそれぞれの国で別のライセンスで複数回リリースされた場合に一般的に起こる。
※Track Relinkingの詳細は下記を参照のこと
Track Relinking Guide | Spotify for Developers

APIリクエスト実行後、APIレスポンスの tracks キー下の items キーにアルバム内の曲のリスト情報が配列データとして保持されている。曲数は total_tracks キーに保持されている。

items キーに保持された各曲のデータには name キーがあり、曲名を得るにはこの値を参照すれば良い。また、preview_url キーには、MP3形式の楽曲(30秒のプレビュー版)へのURLが保持されている。

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' .
           " -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',
  //'limit' => 1,
  //'offset' => 1,
];
$response = $client->get('browse/new-releases', $params);
var_dump($response);

ニューリリース情報は、下記URL

https://api.spotify.com/v1/browse/new-releases

に対して、GETリクエストを行えば取得することができる。

オプションのクエリパラメータとして、countrylimitoffset パラメータを指定することができる。

country パラメータには、2文字の国名コードを指定することができ、特定の国名コードを指定した場合、レスポンスとして返されるリリース情報をその国に関連するものに限定することができる。何も指定しない場合、全世界向けのニューリリース情報がレスポンスとして返される。上記のコードの例では JP(日本)を指定している。

limit パラメータは、レスポンスに含めるアルバム件数を指定するためのもので、デフォルト値は 20、最大値として 50 まで設定することができる。

offset パラメータは、結果のページネーションを行うためのもので、デフォルトでは 0 が設定され、最初の結果がレスポンスとして返される。以降の結果を取得していくには、この値を limit の値ずつインクリメントしていけば良い。例えば limit = 20 のとき、offset = 0 の次は offset = 20、その次は offset= 40 というようにインクリメントしていく。

APIリクエスト実行後、APIレスポンスの items キーにリクエストしたデータの本体であるニューリリース情報が保持されている。デフォルト(limit = 20)では、items キーに20件のアルバムの基本データ(詳細ではなく簡略版の情報)が含まれる。