Spotifyプレイリストの変更履歴を記録する

Spotifyのプレイリストを定期バックアップして、変更履歴をGitHubでコミット履歴として見れるようにしたかった。Spotifyプレイリストをエクスポートするスクリプトを既に公開してる人もいるけど、大抵認証時にポップアップが出てくるタイプで自動実行できなさそうだったので、自分で作った。

f:id:YaaMaa:20191005014052p:plain
追加したり移動したりしてる

新しく知った曲は「New」っていうプレイリストに入れておいて、しばらく聴き続けてだいたい歌詞を覚えたら、覚えた曲用プレイリストに移動するという運用をしている。もともとは、留学中にカラオケ行くことになったときに、やばい洋楽なんか何も知らんって焦って、とりあえず流行ってそうな曲を頭に詰め込むために始めた方法だったけど、それが妙に習慣化して今も続いている。こういう管理方法なので、それぞれの曲をいつ頃知って、どれくらいの時間をかけて覚えたのかを記録するためにプレイリストのバックアップが必要になった。

Spotifyには「プレイリストに変更があればwebhookで通知」みたいな機能はなさそう*1なので、1日1回のcronジョブで現在のプレイリスト一覧を取ってきて、前のデータとの差分を1個ずつコミットしている。

Spotify API

認証

Spotify APIにアクセスするには、クライアント登録をしてから認証が必要。認証にはauthorization code, client credentials, implicit grantの3つの方法があるけど、client credentialsはユーザー情報にアクセスできないし、implicit grantではaccess keyを更新するためのrefresh tokenをもらえないので、authorization codeを使う。

  1. /authorizeってエンドポイントにclient IDをクエリパラメータとしてくっつけたURLにアクセスする
  2. アクセスを許可しますか?みたいな画面になるので、自分のSpotifyアカウントでログインした状態でOK押す
  3. 設定しておいたリダイレクト先のURLにauthorization codeをクエリパラメータとしてつけた状態でリダイレクトされる
  4. そのauthorization codeをclient IDとかと共に/api/tokenにPOSTしたら、access tokenとrefresh tokenがもらえる
  5. Refreshするときは、/api/tokenにrefresh tokenをPOSTすると、新しいaccess tokenがもらえる

という手順でできた。

5の説明に"A new refresh token might be returned too."って書いてあるけど、それはrefresh tokenも定期的にexpireしちゃうって意味なのか、別に新しいやつを使わなくてもいいのかについては、情報が見つからなかった。今はrefresh tokenをsecretsに登録しといてaccess tokenは都度取得して使うようにしてるけど、refresh tokenも更新しないといけない場合もあるんかな...。

GitHub Actions

GitHubで全部完結したらありがたいので、初めてGitHub Actionsを使った。

トリガー

開発中はpushしたら即実行してくれた方が動作確認が楽なので、ワークフローの実行タイミングをon [push]にしていた。けどそのワークフローから更にpushする処理があるので、無限ループになるのでは?ってちょっと心配だった。意外とそんなことはなくて、わざと止めてくれているらしい

Git

actions/checkoutっていうアクションが$GITHUB_WORKSPACEリポジトリの中身を持ってきてくれる。このアクションがgit checkout $GITHUB_SHAを実行するためdetached HEAD状態になるので、現ブランチに行きたければ自分でcheckoutする必要がある。私の場合はmasterって決まってるからいいけど、そうじゃない人はブランチ名を$GITHUB_REFから頑張って取ってて大変そうだった。

pushするのは、$GITHUB_ACTORsecrets.GITHUB_TOKEN(自分でsecretsに入れなくても勝手に登録してくれるやつ)を使えばできた。

run: git push "https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}" master

曲の表記

曲情報を書くとき、今までは「曲名 / アーティスト名」とか「アーティスト名 - 曲名」とか全く統一性なく適当に書いてたけど、この機会にどれが一番無難か調べてみようと思った。有名どころのサイトに行って、曲ページの<title>を確認してみたら、タイトルとアーティスト名の順番や区切り文字について意外とバリエーションがあった。

サイト 表記
Spotify Title · Artist (再生中のタイミングだけ)
Genius Lyrics ArtistTitle (ちょっと長いハイフン)
Musixmatch Artist - Title
AZLyrics Artist - Title
Shazam Title - Artist
Last.fm TitleArtist (かなり長いハイフン)
プチリリ Title / Artist

Artist - Titleが一番多そうなので、コミットメッセージに曲情報載せるときもそれに従った。


f:id:YaaMaa:20191005031019p:plain

これで、間違えて曲を削除しちゃって「今何消したっけ!!」ってなることもないので安心。

*1:Zapierにintegrationはあるけど、トラックの削除はたぶん検出できなさそうだった