DJのプレイリスト構築を助けるWebアプリ Nexxtrack を公開しました

DJミックスをやる中で、使いたい曲があるがその次に合わせる曲をどうしようと考えるのに、プロのDJがどうしているのか見るのが一番参考になるのでは?と思い、こんなサイトを作った。楽曲を入れると次の楽曲をおすすめしてくれるもの。

nexxtrack.club

目的

前述の通り、プレイリストを作るときにプロはどんな曲をこの曲の次に使っているのか知りたいという需要が個人的にあったのだが、1001tracklistsやlivetracklistというプレイリスト公開サイトはそういった需要に応える検索機能を持っていない。

だったら作ってしまえということで、1001tracklistsのデータを分析して、View数1000以上のプレイリストを対象に曲の隣接関係を求め、人気順にソートしてベースとなる曲の次に繋げる曲をおすすめするというものである。

テキストボックスに曲名を入れると候補が出てくるので、それを選ぶとおすすめが出てくるので興味があればどうぞ。

アーキテクチャについて

当初、このアプリは固定費を減らす(個人でやっているもので、、)ために時間課金のあるサービスを使わずサーバレスで構成することを目指していた。

フロントエンドはNuxt.jsで静的サイトを作ってS3+CloudFrontで配信する。これはまぁそこまで大変ではない。強いて挙げるとすると、nuxt generateでは /_dist/<subdir>/index.html というふうにファイルが出てくるが、アクセスは /<subdir というパスでアクセスするようになる。CloudFrontは愚直にS3に同名ファイルがないかみにいくようになっているが、それを index.htmlをみに行くようにLamdda@Edgeを噛ませる点、Pythonのboto3を使いS3に出力されたファイルをアップロードすることでデプロイとしていたが、デフォルトではmimetypeを指定してくれないのでWebページとして配信できない点くらい。

問題はAPI側である。

この当初描いていたサーバレスアーキテクチャは、結局やめた。

楽曲のインクリメンタル検索を実現する必要があり、ここに元々はCloudsearchを使おうと思っていたのだが、 AWS CloudsearchがDynamoのように使った分だけにしかお金がかからず時間課金がないものと思い込んでいたため、上記で時間課金要素がなくなると思い込んでいた。 しかし、改めて調べると決して安くはない時間料金がかかる。

他の選択肢としてはAlgoliaも考えたが、所詮は個人のサイドプロジェクトということで公開後はあまりこちらにリソースを避けなくなる。ということでアカウントが増えるのは避けたく採用はやめた。

そこで、固定費がかかってしまうのは多少諦めながらもなるべく安上がりにするためEC2のインスタンスを一つ借りてElasticsearchを動かすことで検索を実現することにした。

しかし、また新たな問題が発生。曲の隣接関係をDynamo DBにインポートしようとしていたのだが、数百万レコードをアップロードしなくてはならない。これがまー時間がかかり、全然終わらない。 これを待っている間に気づいてしまったのだが、どうせEC2インスタンスを借りてしまったのだから、全部そっちに寄せたほうが安いのでは、、?

ということでせっかく、テーブル設計を頑張ったのだが、早く公開したい気持ちがまさってしまい、Elasticsearch用に立てたインスタンスの上でAPIをたて、分析用に使ったSQLiteのデータベースをそのまま使うことにした。 検索も、単にインクリメンタル検索をするだけなのでElasticsearchを使う必要もなくなった。

というわけで、最終的にはAPI側はEC2の上でFlaskサーバーが動いているだけという、シンプルなものになった。

今後やっていきたいこと

人々の検索の履歴を取っておいて、今検索されている曲、みたいな動的に変化する要素を入れたい。