スクレイピング+Spotify-APIで、アイドル楽曲大賞投票結果のプレイリストを作成しました

はじめに

自分のため、そして楽曲派のオタクの方々のために、2015年度から2023年度までのアイドル楽曲大賞における①メジャーアイドル楽曲部門、②インディーズ/地方アイドル楽曲部門のランキング1~100位までのプレイリストを作成した。
タイトルに書いてあるとおり、スクレイピング+Spotify-APIで自動作成したのでその手順とハマったポイントをまとめていく。

要約(プレイリストを見に来た人向け)

open.spotify.com

open.spotify.com

  • 2022年度以前のプレイリストについては下記記事にまとめた。

otter-k.hatenablog.com

  • もし順位が違う、関係ない曲が入っているなどの問題があればぜひコメントやご連絡いただけると本当に助かります……

要約(使用技術を見に来た人向け)

github.com

アイドル楽曲大賞とは

www.esrp2.jp

ライターのピロスエさんが毎年12月に開催している、1年間で発表されたアイドル楽曲のランキングをみんなの投票で決めようという企画。
タワーレコードの一部店舗ではランキング上位の作品を特集したコーナーが作られるなど、注目度の高いイベントになっている。

具体的にどう動かしたか

①ランキングのスクレイピング(IdolMusicAwardCrawler)

scrape_idol_music_award/scrape_idol_music_award.rb at main · Otter-K/scrape_idol_music_award · GitHub

投票結果のページのtableタグ内にデータが格納されているので、シンプルなopen-uri+nokogiriの構成で取って来る。
なお、CSVの区切り文字に\t(タブ文字)を使っているのは、通常の,(カンマ)区切りだとMirror,Mirrorでバグるし、;(セミコロン)区切りだとC;ONでバグるからである(エスケープしろという意見は粋じゃないので無視する)。

Spotify APIによる楽曲取得、プレイリスト作成

②(1)OAuth認証(generate_spotify_auth.rb)

scrape_idol_music_award/generate_spotify_auth.rb at main · Otter-K/scrape_idol_music_award · GitHub

APIからプレイリストを作成するためには、作成主体となるSpotifyアカウントでOAuth認証を通す必要がある。 そのためOmniAuth2.0+Sinatraを使ってローカルでサーバーを立てようと思ったのだが、最新版の情報があまり見つからず地味に手こずった。
OmniAuth2.0+Sinatraのハマりポイントは別記事にまとめた。

②(2)楽曲取得(PlaylistCreator)

scrape_idol_music_award/create_playlist.rb at main · Otter-K/scrape_idol_music_award · GitHub

RSpotifyを使っているため、 RSpotify::Track.searchでパッと書けると思った……が、うまくいかない。
具体的に言うと、公式APIドキュメントに乗っているfilterを使ったクエリRSpotify::Track.searchでは通らなかった。
色々調査してみると、Client Credentials Grantフローで発行したトークンだとfilterが使えない模様。何となく怪しい挙動な気がする……
RSpotifyの検索時に使ってるトークンはRSpotify.authenticateで発行したやつをずっと使っているので、そこで詰まっていた。

def prepare_user
  RSpotify::User.new(JSON.parse(ENV['OAUTH_TOKENS'])).tap do |user|
    # ユーザー認証後のTokenでないと検索結果が安定しないためToken更新
    RSpotify.instance_variable_set(:@client_token, user.credentials['token'])
  end
end

User.newをラップして、無理やりトークン更新処理を追加して対応した。

②(3)プレイリスト作成、楽曲追加(PlaylistCreator)

ここまで来たら特に詰まるポイントはなかった。
プレイリスト作成して、①で作ったCSVをもとに取得した楽曲を追加していくのを繰り返すのみ。
強いて言えばrate limitに気を付けないとエラー吐くぐらい。

おわりに

僕の投票結果(インディーズ/地方アイドル楽曲のみ)を載せておくのでぜひ聴いてください。
1位 コロニアルスタイル / NUANCE

open.spotify.com

2位 革命 / vividbird

open.spotify.com

3位 STARB×CKS SHOWER / AFTERS

open.spotify.com

4位 Sparkle / SANDAL TELEPHONE

open.spotify.com

5位 生意気ねチェリー / 美味しい曖昧 open.spotify.com

あと赤レンガ空中さんぽのMVもかなり見てほしいです。よろしくお願いします。

www.youtube.com