初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

Twitterで選曲リクエストを受け付けるSpotify対応ジュークボックスを作った。

Spotify対応ジュークボックスを作ろうと思った初老、途中で選曲画面を作るのが面倒くさいことに気づいてしまう。画面を作らずに実現しようと初老が考えた手抜きの実現方法とは…。

実現イメージ

前回、思いついた方法は以下。

  1. 利用者(User)は、かけたい楽曲をSpotifyアプリで検索してシェアで「楽曲のリンク」をTwitterでツイート
  2. ジュークボックス(Jukebox)は、ツイートを受信してツイート内の「楽曲のリンク」からSpotifyのプレイリストに楽曲を追加
  3. プレイリストに登録された順番でSpotifyの楽曲を再生(Spotify)

ほうほう、いいじゃないの。でも実現するには次の問題を解決しないいけませんのう。

"どうやって"Spotifyの楽曲を再生するのか

Spotifyの楽曲を再生するには、SpotifyアプリがインストールしてあるPC/スマホ/タブレットもしくは「Spotify Connect」に対応したオーディオ機器が必要だ。また、今回のようにユーザの選曲に応じて楽曲を再生する場合、事前に楽曲をダウンロードしておくことはできないので、再生中はインターネットにアクセスできる必要がある。ジュークボックスの利用場所でWiFiや電源が利用できるとは限らないので、それらが必要となるオーディオ機器よりも、バッテリー稼働かつ単独でインターネットにアクセス可能なスマホ/タブレットを持ち込むのが手っ取り早い。

"どこで"ジュークボックスを動作させるのか

ジュークボックス自体はアプリケーションとして作るのだが、今回の方法はTwitterやSpotifyのAPIを利用するためにインターネットにアクセスできる必要がある。クラウドのサーバ上でジュークボックスを動作させることも考えたのだが、サーバの利用に費用がかかる点と、どうせ会場にスマホかタブレットを持ち込むのであればと一体化しておいたほうが楽じゃね?とまたもや閃いてしまい、ジュークボックスをスマホアプリとして作ることにした。決して、丁度業務で久しぶりにAndroidアプリを作っていたので忘れないうちに同じAndroid アプリで作ろうと思った訳ではない。

実現構成

ということで、次のような構成でジュークボックスを実現することにした。

なお、実際このジュークボックスを動作させるにはアプリ以外にbotとして楽曲リクエストを受け付ける"Twitter アカウント"と、Spotifyの楽曲を再生するための"SpotifyのPremiumアカウント"が必要だ。でもってそのアカウントでそれぞれのサービスでDeleloper登録も必須。

ちなみにジュークボックスのSPotifyアカウントは、個人利用のSpotifyアカウントと独立させておかないと選曲リクエストしたつもりでジュークボックス側の再生キューを吹っ飛ばす可能性が高い、というか実際にそれで開発中に意味わからん動作してそれはもう大変だったので別にすべし。

技術情報

最後に、久しぶりに技術よりの話も書いておこう。今回作成したジュークボックスでは次の各種サービスのAPIを利用している。

Twitter API

メンションの受信やツイートするだけならV2で充分だが、ユーザプロフィール更新等は現時点はV1.1じゃないとできないらしい。しかも、V1.1のアクセスにはTwitter APIの「Elevated」の利用申請も必要(普通の申請だと「Essential」なのでV2しか使えない)。

今回はAndroidアプリということで、次のTwitter APIライブラリを利用させてもらった。

ちなみに、なんで2個使ってるのは当初V2だけしか使うつもりがなかったからだ。

Spotify Web API

プレイリストの作成や曲の追加で利用。ただし、それらユーザコンテンツを更新するにはOAuth2.0の認証が必須なのでそこが少々面倒。

今回はAndroidアプリでKotlinを使っていたので、次のSpotify Web API向けライブラリを利用させてもらった。

なお、Spotify Web APIは注意点がふたつあって、

認証フローによってはトークンが更新できない

Spotify Web APIの認証については公式 に詳細があるが、「Implicit Grant Flow」だとトークンが更新できないので、長時間使う場合は「Client Credentials Flow」が必須。1時間動作させて初めて気づいてハマったのでちゃんとドキュメントを読もうな。

上記ライブラリのAndroid向けサンプルに各種認証フローのデモがあるので、それを参考に実装すれば認証フローさえ間違えなければ問題ないはず。

「Player」はまだ早いかも

Spotify Web APIには、遠隔でSpotifyアプリの再生操作を行うことができるエンドポイント「Player」というのがあるのだが、現時点ではAPIリファレンス通りに動作しない。具体的には、プレイリスト再生を指示すると1分位応答を待たされたあげく次のエラー応答を返してくるのだが、エラーにもかかわらずそのタイミングで普通に再生が開始される。

[Received Status Code 403. Error cause: Player command failed: Restriction violated. Reason: UNKNOWN]

ちなみに、この時に再生に指定したプレイリストに楽曲が存在している場合、リクエストを投げてエラー応答が戻ってくる迄の間に「ドゥドゥドゥドゥ」と謎の音が聞こえてきてあれ?ひょっとしてスクラッチ入れてくれてるのかなと勘違いするかもしれない。

Spotify Android SDK(Spotify App Remote Library)

SpotifyアプリをAndroid内の別アプリからIPCで操作できるSDK。

前述のPlayer APIが不安定なので急遽こちらを使うことにしたが、プレイリストを指定しての再生、停止は正常動作している。なお、プレイリスト作成等はできないのでそこはWeb APIと併用しないといけないのが残念。あと、同じくAndroid SDKに「Spotify Authentication Library」があるが、それはトークン更新できないから気をつけてくれ。

今回開発したジュークボックス、Android開発がKitKat以来の浦島状態でさっぱり過去のノウハウが通じない上にkotlinも今回はじめてなのでaync/awaitとかで色々と悪戦苦闘したこともあって糞コードです。それ以前にPixel 6a(Android 13)以外で動作確認してませんしな、Playストア公開はまるで考えてないのだけれども、いつかコードを綺麗にしてギッハブで公開でもしてみたいもんですな…。