Spotify APIで自分専用の再生数ランキングを作る

2023-12-31雑記Tech

Spotifyから公開されているWeb APIを用いて再生数ランキングを作りました。
公式のサンプルアプリケーションをベースにシュッと開発できたので記録として残します。

GitHub: https://github.com/yuu26jp/spotify-playback-ranking

Spotify API

Spotify APIでは、公開されている楽曲情報やユーザに紐づく再生履歴などを自由に参照できます。
更新系APIも提供されており、プレイリストの編集やプレーヤーの操作も可能です。

認証方式によって取得できる情報が異なり、APIクライアント単位の認証では楽曲の公開情報へ、Spotifyユーザ単位の認証では個人データにもアクセスできます。

楽曲のメタデータには曲の雰囲気を示すパラメータやテンポなどの数値も含まれており、レコメンドの裏側をうかがい知れたりしてなかなか面白いです。

ユーザ情報を取得する場合の例

% curl 'https://api.spotify.com/v1/me' -H 'authorization: Bearer xxxxxxxx'
{
  "display_name" : "yuu26",
  "external_urls" : {
    "spotify" : "https://open.spotify.com/user/215mf7bo3kbazu7rdxyal5sgy"
  },
  "href" : "https://api.spotify.com/v1/users/215mf7bo3kbazu7rdxyal5sgy",
  "id" : "215mf7bo3kbazu7rdxyal5sgy",
  "images" : [ {
    "url" : "https://i.scdn.co/image/ab67757000003b822e3c3382d06af425afad7813",
    "height" : 64,
    "width" : 64
  }, {
    "url" : "https://i.scdn.co/image/ab6775700000ee852e3c3382d06af425afad7813",
    "height" : 300,
    "width" : 300
  } ],
  "type" : "user",
  "uri" : "spotify:user:215mf7bo3kbazu7rdxyal5sgy",
  "followers" : {
    "href" : null,
    "total" : 1
  },
  "country" : "JP",
  "product" : "premium",
  "explicit_content" : {
    "filter_enabled" : false,
    "filter_locked" : false
  },
  "email" : "xxxxxxxx"
}

Get User’s Top Items API

公開されているAPIの一つ Get User’s Top Items で再生回数の多いアイテムを取得できます。
初期値では英語が返ってくるため Accept-Language: ja を加えて日本語に変更。

% curl 'https://api.spotify.com/v1/me/top/tracks?limit=50&time_range=short_term' -H 'Accept-Language: ja' -H 'authorization: Bearer xxxxxxxx'
{
  "items" : [ {
    "album" : {
      "album_type" : "SINGLE",
      "artists" : [ {
        "external_urls" : {
          "spotify" : "https://open.spotify.com/artist/5Vo1hnCRmCM6M4thZCInCj"
        },
        "href" : "https://api.spotify.com/v1/artists/5Vo1hnCRmCM6M4thZCInCj",
        "id" : "5Vo1hnCRmCM6M4thZCInCj",
        "name" : "Official髭男dism",
        "type" : "artist",
        "uri" : "spotify:artist:5Vo1hnCRmCM6M4thZCInCj"
      } ],
      "available_markets" : [ "JP" ],
      "external_urls" : {
        "spotify" : "https://open.spotify.com/album/7HgPSKEcCguaAzen1GIgka"
      },
      "href" : "https://api.spotify.com/v1/albums/7HgPSKEcCguaAzen1GIgka",
      "id" : "7HgPSKEcCguaAzen1GIgka",
      "images" : [ {
        "height" : 640,
        "url" : "https://i.scdn.co/image/ab67616d0000b273c090f8a6263469689b070620",
        "width" : 640
      }, {
        "height" : 300,
        "url" : "https://i.scdn.co/image/ab67616d00001e02c090f8a6263469689b070620",
        "width" : 300
      }, {
        "height" : 64,
        "url" : "https://i.scdn.co/image/ab67616d00004851c090f8a6263469689b070620",
        "width" : 64
      } ],
      "name" : "SOULSOUP",
      "release_date" : "2023-12-13",
      "release_date_precision" : "day",
      "total_tracks" : 1,
      "type" : "album",
      "uri" : "spotify:album:7HgPSKEcCguaAzen1GIgka"
    },
    "artists" : [ {
      "external_urls" : {
        "spotify" : "https://open.spotify.com/artist/5Vo1hnCRmCM6M4thZCInCj"
      },
      "href" : "https://api.spotify.com/v1/artists/5Vo1hnCRmCM6M4thZCInCj",
      "id" : "5Vo1hnCRmCM6M4thZCInCj",
      "name" : "Official髭男dism",
      "type" : "artist",
      "uri" : "spotify:artist:5Vo1hnCRmCM6M4thZCInCj"
    } ],
    "available_markets" : [ "JP" ],
    "disc_number" : 1,
    "duration_ms" : 314469,
    "explicit" : false,
    "external_ids" : {
      "isrc" : "JPPC02312635"
    },
    "external_urls" : {
      "spotify" : "https://open.spotify.com/track/7r23DlIJauiYbGYojLgarV"
    },
    "href" : "https://api.spotify.com/v1/tracks/7r23DlIJauiYbGYojLgarV",
    "id" : "7r23DlIJauiYbGYojLgarV",
    "is_local" : false,
    "name" : "SOULSOUP",
    "popularity" : 70,
    "preview_url" : "https://p.scdn.co/mp3-preview/eb03bb502bed11ea73bc2388ff3fd1bdb6737f68?cid=2c07c58bb20c4f529f5e262b85b6b1ba",
    "track_number" : 1,
    "type" : "track",
    "uri" : "spotify:track:7r23DlIJauiYbGYojLgarV"
  },
  { 以降50曲目まで…… },
  ]
}

time_range パラメータで期間を指定でき、以下3つから指定できます。

  • short_term : 直近4週間
  • medium_term : 直近6ヶ月
  • long_term : 利用可能な全期間

今回はこのAPIを用いて、直近1ヶ月の再生数ランキングを作りました。

公式サンプルコード

GitHub上で公開されている公式のサンプルコードを参考にします。

余談ですが、Spotify APIのPythonライブラリは「Spotipy」という名前でした。かわいい。

実装内容と動作イメージ

サンプルコードがBootstrapを用いたWebアプリとなっており、この実装を参考に構築しました。
具体的には呼び出すAPIを /v1/me/top/tracks に変更、フロントを楽曲情報に合わせて変更した程度。
PR: https://github.com/yuu26jp/spotify-playback-ranking/pull/4/files

起動すると、まずはSpotifyでのログインを要求されます。

Spotify側の認証/認可を済ませると……

楽曲ランキングが表示されます。

まとめ

Spotify APIを用いて 再生数ランキングを確認するアプリ を作りました。
膨大なAPIドキュメントからも分かる通り、他にもさまざまな機能があり遊びがいがありそうです。

(深く考えずにツイートで宣言したら大晦日の夜に急いで書き上げる羽目になった)

雑記Tech