質問: **やりたいこと:** インターネットラジオ局「Digitally Imported」が提供するオーディオストリーミングに含まれているはずのメタデータ(曲名等)を表示するコマンドラインプログラムを作りたいです。 現在VLCを使ってこのラジオを聴いていますが、唯一の不満としてこのメタデータを保存できないという点があるためです。そのためラジオの試聴中に自動的に曲のデータを収集し、標準出力に出して、それを好きなように別のコマンドでフィルタしたり、リダイレクトできたらと思いました。 視聴しながらメタデータを取得できるのが最高ですが、メタデータのみを取得する方法でも構わないと考えています。 プログラミング言語としては`C/C++`, `ruby`が使えます。シェルスクリプトも分かる方になってきたと思います。`Linux`のシステムコールに詳しくないため、できればC系の実装は避けたい気持ちはあります。 **現状:** 環境は`ubuntu 15.04`です。 一番手軽なのは、すでにあるコマンドラインツールで、この種のメタデータを取得できる機能を持つものを利用することであると考えましたので、cvlcを使って試しました。しかしそのようなオプションが用意されているようには理解できず、コマンドラインでのVLCは諦めました。 次にVLCのAPIがあることをウィキペディアで見つけたため、それを検討してみました。 しかしながら私にはオーディオストリーミングについてほとんど知識がなく、`D-Bus`も「それ何?」というレベルでして、正直どこから手を付けていいのか分かりませんでした。 他のコマンドラインツールも数種類(cmus, pyradio)試しましたが、それらはターミナル上でGUI的な操作を提供するのが目的で、オプションも目的に適さなかったため、今のところ上手く探せておりません。 こういう状態なので、全部まるごと教えてくれとはいいません。取っ掛かりのヒントで良いので教えてください。よろしくお願いします。
回答: こちらの環境は Ubuntu 15.10 です。また、VLC ではなく mplayer を使っています。 例えば、JAZZRADIO.com のストリーミング放送では SHOUTcast プロトコルのメタデータ形式を使用しています。 > > SHOUTcast > > SHOUTcast's streaming protocol uses metadata tags and responses that **all start with ICY**, which stands for "I Can Yell." > > > なので、mplayer を使うと以下の様にしてタイトルやアーティスト名を取得できます。 ``` $ mplayer -playlist http://listen.jazzradio.com/public5/smoothjazz.pls 2>/dev/null | grep -E '^ICY Info:' ICY Info: StreamTitle='Bennett B - In My Mind'; ``` ただ、これでは使いにくいと思いますので `FIFO(named pipe)` などを使うと良いかと思います。 ``` $ mkfifo fifo $ mplayer -slave -playlist http://listen.jazzradio.com/public5/smoothjazz.pls >fifo 2>/dev/null & $ grep -E '^ICY Info:' fifo ICY Info: StreamTitle='David Lanz - The Good Life'; ICY Info: StreamTitle='Chuck Loeb - Silver Lining'; ``` ※ named pipe は Ruby でも使えるかと思います。 この SHOUTcast プロトコルが一般的なのかどうかは不明ですので、それぞれのストリーミング放送で使われているメタデータの送信プロトコルを調べる必要があるかと思います。