#えむけーろぐ

間違った事を書いていたらやさしく教えてください

ミスドの店内BGM情報を返すWeb APIを作った

RailsによるWeb API開発、SwaggerによるAPIドキュメンテーション作成の練習として、ミスタードーナツの店内BGM情報を返すAPIを作った。

Misdo BGM API

ミスドの店内BGM

ミスタードーナツの店内で流れているBGMは、USENなんかの音楽番組を流しているのではなく、独自に選曲しているようだ。

月ごとのプレイリストの内容は、以下のWebページから確認することが出来る。

店内BGM情報|ショップ情報|ミスタードーナツ

1時間毎に組まれたプレイリストには、それぞれテーマがある。例えば10時、14時、18時からの時間帯には、「ALL-TIME HITS(1)」という様々な時代のヒット曲のプレイリストが流れていたり、11時、15時、19時には「Now Hit Parade」というタイトルで最新ヒット曲が流れている。

f:id:mktakuyax:20181204130718j:plain

ドーナツを食べながら無限コーヒーを楽しむだけで、懐かしの洋楽から最新ヒット曲まで様々な曲に触れる事ができるのだ。

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でググると上司の書いた記事が上位に出てきて吹いた。

qiita.com

API開発

APIの開発には、RailsとGrape、Grape::Entityを使用した。仕事で使ってる技術を趣味アプリでも使おうマインド。

RailsとGrape、Grape::EntityによるAPI開発の詳しい手順は先日Qiitaに書いたので自分も何か作ってみようという人は参照してほしい。

qiita.com

Misdo BGM APIでは、上記の記事で行った手順に加えて、APIドキュメントの生成のためgrape-swaggergrape-swagger-entityを利用している。これについても後々Qiitaに書いておきたい。

運用

デプロイ先としてConoHa VPS上に、ConoHa公式のDookuアプリケーションイメージを展開して利用している。

Dokkuとは、自分のサーバ上にHeroku的なモノを作ることが出来るOSSだ。業務として人からお金をもらってマジメに作るアプリケーションならHerokuやAWSを使うけど、趣味レベルなら十分戦える。

詳しくは、さっき書いたアドベントカレンダーの記事をどうぞ。

qiita.com

おわりに

そこそこの量のデータがあり、また止まっても別に困らないけど自分でも欲しいなと思える練習用の題材として、なかなか良いテーマだったと思う。

また、このAPIを作るにあたって、スクレイピングと著作権についても調べてみた。

it-bengosi.com

上の記事を読んだ感じだと、以下の項目を満たす限りは大丈夫そうだ。(法律に関する知識のない自分の解釈なので正確性は保証できず。)

  • 利用規約への同意を経た会員登録・ログイン等をせずに見られるコンテンツで、クローラに対する制限(robots.txtとか)が無いこと。
  • 情報の複製が情報解析目的であること。
  • 取得した情報をそのまま配信するのではなく、自分で分析して再構成したものを提供していること。

今後も楽しく便利な趣味アプリを作っていきたい。