Yotazo Lab.

ほぼ自分用。でも誰かの役に立つかもしれない話題

Raspberry Piでインターネットラジオを作る #3

mpcのコマンド操作

mpc+Pythonインターネットラジオのストリーミングを聴くプログラムを書いています。寝る前にチビチビ進めてはいるのですが、ひとつ関数を作っておしまいのような毎日です。先は長いなぁ~。

変なところでハマる

再生は $mpc play 、次の局は、$mpc next、前の局に戻る場合は $mpc prev と・・・あれ? 戻らないぞ!?

プレイリストに放送局を5局登録して再生、$mpc nextで1局目から順に5曲目まで送ることはできるのですが、$mpc nextで1局目に行けません。逆も同じで、1局目から $mpc prev で5局目に戻ろうとしても戻れない・・・

え~~、そうなの!?

仕方ないので、再生中のステータスから局のIDを作成、$mpc nextなら+1、$mpc prevなら-1・・・などとやり、なんとかうまく動いたのですが、実はこれ大きな間違い・・・

というより、大変な遠回りの作業だったのです。

ふと、mpcのヘルプを見ると、$mpc repeat というコマンドがありました。$mpc repeat を一回叩くことで、リピートモードのONとOFFが切り替わるようです。

もしかして・・・と、リピートモードをONにしたところ、5局目後の $mpc next ですんなり1局目の再生が始まりました・・・。

うはぁ、これでいいのか・・・

書き直しです。トホホ・・・。

(2015/3/5追記)
$mpc repeat は、$mpc repeat だとON/OFFのトグルスイッチですが、明示的にON/OFFの指定もできるようです。

$mpc repeat on :ON
$mpc repeat off :OFF

イベント発生を取得する

これとは逆で、どうしようかなと思っていた箇所が案外すんなりいった部分もあります。

再生中の曲が切り替わった時の、曲名表示の切り替えです。

これは、$mpc idle という命令を使えばOKでした。

$mpc idleを実行すると、mpdのイベントを検知するまでアイドル状態になり、イベントが発生すると通知を出力してくれます。また、オプションを使えば受け取りたいイベントの種類も絞り込めるようです。

$mpc idle なら全種類の通知、$mpc idle player ならば、再生開始、停止などのイベントが発生した場合に限って通知が出力されるようです。今回必要だった、ストリーミング局からの曲の切り替わりイベントも、この$mpc idle playerで受け取ることができました。

こんな感じで、簡単に実現できました。

#イベント発生捕獲
idle = subprocess.Popen('mpc idle player', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
idle = idle.communicate()
if idle !='':
    self.getCurrent()

f:id:yotazo:20150304163316p:plain
曲が変わると勝手に情報が更新される様子

$mpc idleで捕獲できるイベントについて、詳しくはこちら
http://www.musicpd.org/doc/protocol/command_reference.html

マニュアルはよく読め

マニュアルは大事ですね・・・というわけで、メモがてらに、今回使いそうなコマンドを載せておきます。

今回使いそうなmpcのコマンド

$mpc ステータス表示
$mpc status ステータス表示($mpcと同じ)
$mpc current 現在再生中の曲を表示
$mpc play [<position>] 再生 <position>で位置指定 (default: 1)
$mpc next 現在再生中の、ひとつ次を再生
$mpc prev 現在再生中の、ひとつ前を再生
$mpc pause 再生を一時停止
$mpc stop 再生を停止
$mpc clear 読み込み済みのプレイリストをクリア
$mpc outputs 現在の出力先を表示
$mpc playlist 読み込み済みのプレイリストの内容を表示
$mpc load <file> <file> をプレイリストとして読み込む
$mpc volume [+-]<num> ボリューム設定
$mpc repeat <on|off> リピートモードON/OFF切り替え
$mpc idle [events] イベント発生までアイドル状態になる