RailsによるWeb API開発、SwaggerによるAPIドキュメンテーション作成の練習として、ミスタードーナツの店内BGM情報を返すAPIを作った。
ミスドの店内BGM
ミスタードーナツの店内で流れているBGMは、USENなんかの音楽番組を流しているのではなく、独自に選曲しているようだ。
ショップで流れているBGMをオンエアしているのは「ミスドクラブ・ミュージックステーション」☆新曲やヒット曲を毎月編集してお届けしています♪オンエア中の曲や次の曲もチェックできますよ☆【PC】http://t.co/9juuH3NPbY ※一部実施していない店舗がございます。
— ミスタードーナツ (@misterdonut_jp) January 20, 2015
月ごとのプレイリストの内容は、以下のWebページから確認することが出来る。
1時間毎に組まれたプレイリストには、それぞれテーマがある。例えば10時、14時、18時からの時間帯には、「ALL-TIME HITS(1)」という様々な時代のヒット曲のプレイリストが流れていたり、11時、15時、19時には「Now Hit Parade」というタイトルで最新ヒット曲が流れている。
ドーナツを食べながら無限コーヒーを楽しむだけで、懐かしの洋楽から最新ヒット曲まで様々な曲に触れる事ができるのだ。
Web APIにしてみた
ここ最近はバイトや部活等でずっとWeb APIを開発していて、練習用の趣味アプリとしても何かWeb APIや、それと通信するモバイルアプリケーションを作ってみたいなと思っていた。
題材は何が良いかなぁとミスドでドーナツを食べながら思いついたのが、このミスドBGM APIを開発することだ。
仕様
仕様は以下のURLで公開している。
https://misdo-bgm.apps.m6a.jp/v1/docs/
エンドポイント
https://misdo-bgm.apps.m6a.jp/v1
Playlists API
- GET /playlists - 今月のプレイリスト一覧
- GET /playlists/1 - プレイリストの詳細
- GET /playlists/now - 現在放送中のプレイリスト
Songs API
- GET /songs/now - 現在放送中の曲
現状だとまだまだレスポンスの情報が少なかったり、nullに対する意識が低かったりするけど、今後改善していく。
APIを作っただけで終わりではなく、クライアント側でもっとおもしろい事を出来そうなので試してみているところ。
技術
スクレイピング
BGM情報はPDFで配信されている。PDFは6ページあり、1ページがそのまま1つのプレイリストに対応している。
PDFの解析にはRuby製の pdf-reader というGemを利用している。このGemにPDFを食わせたあとに、テキストを抽出すると一定のルールに従って曲情報が出てくるので、あとは文字列操作を頑張るだけだ。
pdf-reader gemでググると上司の書いた記事が上位に出てきて吹いた。
API開発
APIの開発には、RailsとGrape、Grape::Entityを使用した。仕事で使ってる技術を趣味アプリでも使おうマインド。
RailsとGrape、Grape::EntityによるAPI開発の詳しい手順は先日Qiitaに書いたので自分も何か作ってみようという人は参照してほしい。
Misdo BGM APIでは、上記の記事で行った手順に加えて、APIドキュメントの生成のためgrape-swaggerとgrape-swagger-entityを利用している。これについても後々Qiitaに書いておきたい。
運用
デプロイ先としてConoHa VPS上に、ConoHa公式のDookuアプリケーションイメージを展開して利用している。
Dokkuとは、自分のサーバ上にHeroku的なモノを作ることが出来るOSSだ。業務として人からお金をもらってマジメに作るアプリケーションならHerokuやAWSを使うけど、趣味レベルなら十分戦える。
詳しくは、さっき書いたアドベントカレンダーの記事をどうぞ。
おわりに
そこそこの量のデータがあり、また止まっても別に困らないけど自分でも欲しいなと思える練習用の題材として、なかなか良いテーマだったと思う。
また、このAPIを作るにあたって、スクレイピングと著作権についても調べてみた。
上の記事を読んだ感じだと、以下の項目を満たす限りは大丈夫そうだ。(法律に関する知識のない自分の解釈なので正確性は保証できず。)
- 利用規約への同意を経た会員登録・ログイン等をせずに見られるコンテンツで、クローラに対する制限(robots.txtとか)が無いこと。
- 情報の複製が情報解析目的であること。
- 取得した情報をそのまま配信するのではなく、自分で分析して再構成したものを提供していること。
今後も楽しく便利な趣味アプリを作っていきたい。