井土です。
約一年前に部室で稼働を始めたRapberry Piで作ったミュージックサーバー ですが、
構成を変えたりケースを作ったりして進化をしてます。
部室BGMサーバーということでロ技研部室にBGMを流す役割を担っています。
Raspberry Pi 2が発表されましたが、B+でもないRaspberry Pi Bです。
その部室BGMサーバーに新たに再生している曲名をつぶやく機能を追加しました。
こんな感じで曲が変わると新しい曲の曲名とアーティストをどんどんつぶやきます。
案の定おたくソングbotになってしまいました。
◯なぜ作ったのか
部室で何か曲が流れている時、「これなんて曲だっけ」とか「誰の曲?」みたいな会話をよく聞きます。
そこで曲名をどっかに表示しようと考えました。
そんなとき、偶然友人が携帯で再生している曲を
「曲名/アーティスト #nowplaying」
の形式でツイートするアプリを使っているのを目にしました。
これはいいなと思い、部室BGMサーバーにも曲名をツイートする機能をつけようと思ったわけです。
◯ツイート機能の実装
基本的にPythonで
曲名を取得する
ミュージックサーバーとしての機能はMPDを使っていて、
外部からの再生制御は全てTCPでコマンドなどを文字列として送ってやればいろいろできます。
詳しくはここに書いてあります。 http://www.musicpd.org/doc/protocol/index.html
デフォルトではポート6600を使用しているので、ポート6600にtelnetなどで接続をすると
「play」や「stop」など、わかりやすい文字列のコマンドを打つだけで再生制御ができます。
実は一般的なMPDクライアントはこの機能を利用してみたいです。
なのでソケット通信ができたらオリジナルなMPDクライアントは案外簡単に作れそうです。
話を戻しますが、コマンドの中には再生中の曲を取得するようなコマンドもあるのでそれを使いました。
ソケットを使ってそのあたりの通信をしてくれるライブラリ(python-mpd2)が
偶然見つかったので今回はそれを使いました。
数秒に一回再生中の曲名を取得し、変化があったらつぶやく
やるべきことはそれだけです。
ツイートする
pythonで簡単にtwitterを扱うライブラリはいくらかあります。
その中でも今回はtweepyを使いました。
リプライを受けたりTLの文字列を拾ったりは一切せず、つぶやくだけなのでとても簡単です。
デーモン化する
勝手に裏で起動して、ずっと走っててくれて欲しいのでデーモン化します。
本来はforkして片方をexitしてforkして...などとしないといけないのですが、pythonにはそのあたりをよく知らなくてもデーモン化してくれる便利ライブラリがあります。
python-daemon です。
ちょっと書き加えるだけで簡単にdaemonとして動くものが作れます。
また、raspberry piを起動した時にこのデーモンも自動で起動して欲しいのでinit.dにスクリプトを追加します。
pythonのデーモンとinitの設定についてはここがとても参考になりました。
http://divide-et-impera.org/archives/1454
◯次は
現状だと再生などの制御がスマホやPCのクライアントからしかできないので、
ハードウェア的なスイッチなどをつける予定です。
約一年前に部室で稼働を始めたRapberry Piで作ったミュージックサーバー ですが、
構成を変えたりケースを作ったりして進化をしてます。
部室BGMサーバーということでロ技研部室にBGMを流す役割を担っています。
Raspberry Pi 2が発表されましたが、B+でもないRaspberry Pi Bです。
その部室BGMサーバーに新たに再生している曲名をつぶやく機能を追加しました。
こんな感じで曲が変わると新しい曲の曲名とアーティストをどんどんつぶやきます。
◯なぜ作ったのか
部室で何か曲が流れている時、「これなんて曲だっけ」とか「誰の曲?」みたいな会話をよく聞きます。
そこで曲名をどっかに表示しようと考えました。
そんなとき、偶然友人が携帯で再生している曲を
「曲名/アーティスト #nowplaying」
の形式でツイートするアプリを使っているのを目にしました。
これはいいなと思い、部室BGMサーバーにも曲名をツイートする機能をつけようと思ったわけです。
◯ツイート機能の実装
基本的にPythonで
曲名を取得する
ミュージックサーバーとしての機能はMPDを使っていて、
外部からの再生制御は全てTCPでコマンドなどを文字列として送ってやればいろいろできます。
詳しくはここに書いてあります。 http://www.musicpd.org/doc/protocol/index.html
デフォルトではポート6600を使用しているので、ポート6600にtelnetなどで接続をすると
「play」や「stop」など、わかりやすい文字列のコマンドを打つだけで再生制御ができます。
実は一般的なMPDクライアントはこの機能を利用してみたいです。
なのでソケット通信ができたらオリジナルなMPDクライアントは案外簡単に作れそうです。
話を戻しますが、コマンドの中には再生中の曲を取得するようなコマンドもあるのでそれを使いました。
ソケットを使ってそのあたりの通信をしてくれるライブラリ(python-mpd2)が
偶然見つかったので今回はそれを使いました。
数秒に一回再生中の曲名を取得し、変化があったらつぶやく
やるべきことはそれだけです。
ツイートする
pythonで簡単にtwitterを扱うライブラリはいくらかあります。
その中でも今回はtweepyを使いました。
リプライを受けたりTLの文字列を拾ったりは一切せず、つぶやくだけなのでとても簡単です。
デーモン化する
勝手に裏で起動して、ずっと走っててくれて欲しいのでデーモン化します。
本来はforkして片方をexitしてforkして...などとしないといけないのですが、pythonにはそのあたりをよく知らなくてもデーモン化してくれる便利ライブラリがあります。
python-daemon です。
ちょっと書き加えるだけで簡単にdaemonとして動くものが作れます。
また、raspberry piを起動した時にこのデーモンも自動で起動して欲しいのでinit.dにスクリプトを追加します。
pythonのデーモンとinitの設定についてはここがとても参考になりました。
http://divide-et-impera.org/archives/1454
◯次は
現状だと再生などの制御がスマホやPCのクライアントからしかできないので、
ハードウェア的なスイッチなどをつける予定です。