Spotifyのプレイリストを定期バックアップして、変更履歴をGitHubでコミット履歴として見れるようにしたかった。Spotifyプレイリストをエクスポートするスクリプトを既に公開してる人もいるけど、大抵認証時にポップアップが出てくるタイプで自動実行できなさそうだったので、自分で作った。
新しく知った曲は「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を使う。
/authorize
ってエンドポイントにclient IDをクエリパラメータとしてくっつけたURLにアクセスする- アクセスを許可しますか?みたいな画面になるので、自分のSpotifyアカウントでログインした状態でOK押す
- 設定しておいたリダイレクト先のURLにauthorization codeをクエリパラメータとしてつけた状態でリダイレクトされる
- そのauthorization codeをclient IDとかと共に
/api/token
にPOSTしたら、access tokenとrefresh tokenがもらえる - 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_ACTOR
とsecrets.GITHUB_TOKEN
(自分でsecretsに入れなくても勝手に登録してくれるやつ)を使えばできた。
run: git push "https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}" master
曲の表記
曲情報を書くとき、今までは「曲名 / アーティスト名」とか「アーティスト名 - 曲名」とか全く統一性なく適当に書いてたけど、この機会にどれが一番無難か調べてみようと思った。有名どころのサイトに行って、曲ページの<title>
を確認してみたら、タイトルとアーティスト名の順番や区切り文字について意外とバリエーションがあった。
サイト | 表記 |
---|---|
Spotify | Title · Artist (再生中のタイミングだけ) |
Genius Lyrics | Artist – Title (ちょっと長いハイフン) |
Musixmatch | Artist - Title |
AZLyrics | Artist - Title |
Shazam | Title - Artist |
Last.fm | Title — Artist (かなり長いハイフン) |
プチリリ | Title / Artist |
Artist - Title
が一番多そうなので、コミットメッセージに曲情報載せるときもそれに従った。
これで、間違えて曲を削除しちゃって「今何消したっけ!!」ってなることもないので安心。
*1:Zapierにintegrationはあるけど、トラックの削除はたぶん検出できなさそうだった