Spotify APIを利用してプレイリストを作った

プログラミングを使って遊んでみた記事です。

最近札幌から東京に越してきたものの、札幌のラジオが恋しい…
NORTH WAVEというFM局をよく聴いていて、選曲がトレンドを押さえている&マイナーなアーティストもカバーしてくれているので、音楽をキャッチするのにいつもお世話になっていた。
同じJFL系のJ-WAVEもあるんだけど、似て非なる感じで。
radikoのプレミアム会員になれば解決なんだけど、そこまでの熱はないな…

そこで考えたのが、週に1回、北海道でよく聞かれた曲を集計し、ランキング化しているSAPPORO HOT 100の曲を詰め込んだプレイリストをつくること
このプレイリストを聴いておけばトレンドに触れられそう。
あとSpotifyは元々好きなサービスで、APIを利用してみたかったというのもある。   

早速プログラムしてみる。

当初のイメージ

https://www.fmnorth.co.jp/hot100/からアーティストと曲を取得し保存
→ Spotify APIでプレイリストを作成し取得した曲を追加
→ Github Actionsで毎週定期実行

こんなプログラムを

require 'nokogiri'
require 'open-uri'
require 'dotenv/load'
require 'rspotify'

# サイトから曲とアーティストを取得
url = 'https://www.fmnorth.co.jp/hot100/'
doc = Nokogiri::HTML(URI.open(url))

playlists = doc.css('.hot100List__detail').map do |row|
  track = row.at_css('.musicTitle').text.strip
  artist = row.at('.hot100List__detail--artist').text.strip
  { title: track, artist: artist }
end

# 承認リクエスト
client_id = ENV['CLIENT_ID']
client_secret = ENV['CLIENT_SECRET']
RSpotify.authenticate(client_id, client_secret)

# Spotifyのプレイリストを探し、先週分の全曲を削除
spotify_playlist = RSpotify::Playlist.find_by_id(ENV['PLAYLIST_ID'])

track_numbers = (0..spotify_playlist.total - 1).to_a
spotify_playlist.remove_tracks!(track_numbers, snapshot_id: spotify_playlist.snapshot_id)

# Spotifyのプレイリストに今週分の曲を追加
tracks = playlists.flat_map do |list|
  RSpotify::Track.search("#{list.artist} #{list.track}", limit: 1, market: 'JP')
end
spotify_playlist.add_tracks!(tracks)

Spotify APIRubyではrspotifyというRubyのラッパーがあり便利。
クライアントIDとクライアントシークレットを使って認証、プレイリスト内の曲をカスタマイズするといった流れ。

これを定期実行すればプレイリストができる!と思ったところでプレイリスト内の曲を削除や追加ができずに以下のエラー
uninitialized class variable @@users_credentials in RSpotify::User (NameError)

Spotify APIの認証について調べてみると、認証フローは4つ。

Authorization | Spotify for Developers

自分のはClient credentialsフローで、これだけだとユーザー認証が行われずプレイリストを触れないとのこと


ということでAuthorization Codeフロー(認可コードフロー)で再実装。

どうしても「サービスと連携しますか」みたいな画面で「はい」とする認証ダイアログが必要。
何やら自動化は難しそうだなと思い、慣れているRails×Omniauth×rspotifyという形で実装する。
viewに簡単なボタンを1つつけて、それを押すことで、認証→音楽を取得しDB保存→プレイリストに曲を追加とする形にした。

自動化はできなかったけど、ローカルでサーバー立ち上げて、ボタン1つでプレイリストが作れるんだから週に1回押すか….
と思ったけど、よくよく認可コードフローのページを読み直したり、以下のサイトを参考にすると、1度認証してしまえばrefreshed access_tokenを使って自動化できそう。

qiita.com

今回は時間切れということで、いつかまた続きをやってみたい。
Spotify APIを触るのは楽しかった。
認証関連の知識がまだ曖昧だと@yocajiiさんとのペアプロ時に話したら、この本を紹介してもらったので、勉強してから再実装としたい。

booth.pm

そして以前に、@jnchitoさんの下の記事を読んだ時から、日常の困りごと何か解決したいなと思ってたので、その第一歩になったかな?

blog.jnito.com


作ったプレイリストはこちら

いつでも札幌のトレンドが聞けるようになった。
結局radikoのプレミアム会員になるほうが早かったかも。