MPlayerがうまく動かない

MPlayerを使ってBGMを流すコマンドを作ろうとしたときに困ったことがいくつかあったので誰か解決して下さい。

スクリプトは3年前で更新がとまってるmplayer-rubyを使ってRubyでmplayerを叩く方針。

案の定バグに当りました。スペースの入ってるファイルをうまく処理できない。これは内部的にシェルを呼んでるのですが、そのときにシェルエスケープをしてないためです。require 'shellwords'しとけばString#shellescapeメソッドが追加されるのでmplayer-rubyの何箇所かにあるfilefile.shellescapeすれば解決しました。

さらにDirty Hack。複数ファイルをload_fileで渡してると詰まるようなので思いきってMPlayer::Slave#initializeを改造して引数に再生ファイルの配列(元々はファイル名の文字列)を渡すようにしました。

これで

#!/usr/bin/env ruby -Ku

* coding:UTF-8 *

require ‘mplayer-ruby’ require ‘libnotify’

class MPlayer::Slave def now_playing summary = “” summary += get(:meta_title).chomp summary += “ – ” + get(:meta_artist).chomp body = “NowPlaying” Libnotify.show(body: body, summary: summary) end end

music = “/your/path/to/music/directory/” playlist = File.read( music + “BGM.list”).split(”\n”).map{|f| music + f }.shuffle player = MPlayer::Slave.new playlist player.loop Signal.trap(:INT) {player.quit;exit} Signal.trap(:KILL) {player.quit;exit} player.now_playing while line = player.stdout.gets player.now_playing if line =~ /playback/ end

が動くようになりました。

しかし一つ問題がありまして、再生が1曲目で止まっちゃいます。loopを指定してるのにです。mplayerを直接叩いてみるに、mplayerのバグっぽい…複数ファイル指定したときは本来なら全曲1回は再生してくれるはずなのに再生しませんし-loop 0オプションガン無視。今回入れたのはUbuntuのapt-getで入るやつで、バージョン(?)は「MPlayer2 UNKNOWN © 2000-2012 MPlayer Team」だそうです。

Ubuntuはパッケージが古いことが往々にしてあるので冷静に自分でビルドしようとしてもfridibiがないとかで怒られる。

どなたか解決方法御存じないですか???

追記

-loop -1を渡すとループしてくれました。それドキュメントと逆…

Written by κeen