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 には検索結果の総件数に応じた乱数を設定し、検索結果の中からランダムに一つのアーティスト情報を取得するようにしている。