1. 背景

いつ音楽を聴いているのかを知りたくなりました。

というのも、最近は録音したラジオ番組やPodcastを聞くことが多く、音楽を聴く機会が大きく減っている気がするためです。

いつ、どんな曲を聴いているのかを統計チックなものを取ろうと考えました。

そこで、まずは再生履歴を貯めていこうと考えました。

2. 仕組み

継続するかが不透明だったので、安価に運用できる仕組みを考えました。

単純なのは、統計をとるためにSpotifyからデータを取得することです。調べると、Spotifyは再生した曲を提供するAPIを用意していることがわかりました。しかし、直近50曲までしか履歴を提供してくれません。

ということで、ある程度のタイミングでSpotifyからデータを取得して、データベースに格納することにしました。

以下は概要図です。

データベースはDynamoDB

クラウドのデータベースを使用することにしました。

また、VPCが必要なRDBは高額になりがちです。なので、使った時に使った分だけ支払うDynamoDBを使用することにしました。

ちなみに、以下がDynamoDBの使用状況です。作成しているときは、動作確認しているのでDynamoDBに書き込んだり、読み込んだりしているので、使用量が多いです。ただ、運用が始まってからはそうでもないですね。

Spotify → DynamoDBへの格納アプリ

Spotifyから曲の情報を取得してDynamoDBに格納するアプリケーションはgolangで作りました。

これは自宅で動かしています。cronで1回/1時間の頻度で動かしています。

Spotifyの認証をファイルに持たせてしまっているので、うまいことやってLambdaで動かすようにしたいと考えています。

Hugoで表示

DynamoDBから情報を取得して、このhugoで表示するようにしました。

統計をとりたいだけだったので、曲を表示する必要はなかったですが、まずはやってみました。

メニューにSpotifyというリンクを挿入してそこからリンクを辿るようにしました。

https://yamada-tech-memo.netlify.app/spotify/

工夫した点

1回/1日は更新したいので、GitHubActionsを1回/1日動かして、DynamoDBからデータを取得してページをデプロイするようにしました。

苦労したこと

GitHubActionsを使用してリポジトリを更新するのには手間取りました。「権限不足しているから、更新させない」というメッセージと1時間ぐらい格闘していました。

盲点だったこと

Podcastは再生履歴にカウントされません。Podcastの情報も取得できるかと思ったのですが、ダメでした。。。

以下のドキュメントに「Currently doesn’t support podcast episodes」と書いているんですよね。

https://developer.spotify.com/documentation/web-api/reference/get-recently-played