目次
年末に、GoでSlackのボットを作ったという記事を書きましたが、少し改良したので話の続きを。
やってみたいこととして、キーワードを指定して再生する仕組みを上げていました。
- キーワードに関連する曲の再生
- OwnTone自体に検索の仕組みがついているので、キーワードを受け付けてそれに関する曲を流す
コマンドの判別の仕組みの変更
これまでは、単純なコマンドを実行してもらう形で実装していたため、Slackで入力された文字列をそのままコマンド名にマッチするかどうかの判定だけをしていました(レーベンシュタイン距離でタイポ対応はしてましたが)。
この場合、やってみたいことに挙げていた「キーワードを受け付けて」の部分が想定から抜けています。 なので、コマンド名の判別処理を入力文字列そのままではなく、次のような処理にしました(処理切り替え時のPR)。
- 入力された文字列をスペース区切りでSplitして配列に
- 登録済みのコマンド名もスペース区切りでSplitして配列に
- 入力の配列に登録済みコマンドの配列が含まれていればコマンドにマッチした
- 入力の配列の残り(コマンド部分を抜いたもの)をスペースで連結してからコマンドの引数として渡す
また、このタイミングでコマンド名を1つの文字列にするために使っていたハイフンも除去することにしました(コマンドと引数の切れ目をわかりやすくしようと思ってハイフンを入れていたのですが、連結しておく必要もなくなったので)。
キーワードを受け取って検索
コマンドごとに引数をどのように利用するかは異なるので、コマンド側で引数の処理を行います。
Owntoneには単語で簡単に検索できるAPIが用意されています。
とりあえずは、引数の部分の文字列をそのままこのAPIのquery
パラメータに渡すだけの簡単な処理を実装しました。
取得件数(limit
)などもありますが、まずは固定で5
として実装しました
(その時のPRはこちら)。
APIのレスポンスには、アーティスト、アルバム、曲ごとに項目が返ってくるので、それを表示しています。
「検索するだけ(search music
)」のコマンドと「検索した結果を再生するsearch play
」コマンドの2種類を追加しました。
Search Results...
# Artists (1)
Southern All Stars
# Albums (4)
Paint The Sky With Stars: The Best Of Enya / Enya
SOUTHERN ALL STARS / サザンオールスターズ
STARS / Superfly & トータス松本
江ノ島 (SOUTHERN ALL STARS GOLDEN HITS MEDLEY) / Z団
# Tracks (20)
All Of The Stars / Ed Sheeran
...
簡易版のクエリパーサーを追加
ちょっと使ってみると、ほかにもできそうなことが出てきます。
検索結果を見るとわかりますが、情報のタイプごとに結果が返ってきています。 検索のAPIの仕様に、このタイプを絞り込む条件も渡すことができるようになっています。
いろんな曲が混ざるのもいいのですが、アルバム名で指定したかったり、アーティストで指定して曲をかけたくなります。 また、取得件数も指定できるのがいいかも?ということで、引数にちょっとだけパース処理を入れてみました(Parse関数)。
パーサー用のライブラリなども調べてみましたが、そこまで凝った条件を書くわけでもないので、スペース区切りで分割した後に、 「limit:数値」や「type:artist」など特殊なキーが単語の先頭についているかどうかの判断をする処理でお茶を濁しました。。。
search music stars type:artist
と入れた場合は、「stars」を含むアーティストだけが結果としてかえるようになります。
そして新たな課題
とりあえずなんとなく検索して再生できるようになりました。 ただ、OwntoneはSQLiteに入っているデータに対して、入力された単語で部分一致検索をしているだけのようです。 また、曲ごとに異なるアーティスト名になっている場合にアルバムのアーティストがVarious Artistsのようになっており、 いい感じに検索できないこともあります(トラックごとのアーティストにも検索してほしい)。
また、私の問題なのですが、海外の歌手名のつづりを覚えていなかったりもするので、もうちょっといい感じに検索できる仕組みが欲しくなってきています。
ということで、今後は類義語(英語名の歌手のカタカナ名とか)や細かなアーティスト名やコンポーザーなどでも検索できるようになにかしらの検索エンジンにデータをいれて、検索はそちらでやりつつ、音楽を流せるような仕組みを作りたくなってきました。
曲のメタデータを増やしたりどうやってやるのがいいかなぁ?
comments powered by Disqus