Linuxデスクトップの各種メディアプレイヤーをMPRISで制御するメモ
Linuxデスクトップでは、さまざまなメディアプレイヤーをD-Busで制御するためのMPRIS(Media Player Remote Interfacing Specification)という規格があります。
これを使ってメディアプレイヤーの再生と停止ぐらいを制御する方法を調べ、コマンドラインとEmacsから試してみます。
対象のメディアプレイヤー
私の場合、とりあえずTotemとVLC、そしてFirefox上のメディア再生(YouTubeなど)を対象とします。
Totemの場合は、プラグインの設定から「MPRIS D-BUsインターフェース」を有効にすると、MPRISでの制御に対応します。
D-Busでのインターフェイスとなるバス名は、busctl listで探せます。MPRISのバス名は「org.mpris.MediaPlayer2.」で始まるようです(規格か慣例かは不明)。Totemでは「org.mpris.MediaPlayer2.totem」でした。
$ busctl --user list | grep -i MediaPlayer2
org.mpris.MediaPlayer2.totem 2473780 totem emasaka :1.13566 [email protected] - -
同じことをEmacs Lispでするには、dbusをrequireして、dbus-list-namesを呼びます。なお、以降ではdbusがrequireされているものとします。
(require 'dbus)
(seq-filter (lambda (x) (string-match-p "MediaPlayer2" x))
(dbus-list-names :session) )
;;=> ("org.mpris.MediaPlayer2.totem")
VLCではバス名は基本的には「org.mpris.MediaPlayer2.vlc」です。
$ busctl --user list | grep -i MediaPlayer2
org.mpris.MediaPlayer2.vlc 2475388 vlc emasaka :1.13589 [email protected] - -
ただしVLCでは、設定から「Allow only on instance」のチェックを外すと、複数インスタンスを開けます。その場合、2つめ以降は「org.mpris.MediaPlayer2.vlc.instance(数字)」となります。
$ busctl --user list | grep -i MediaPlayer2
org.mpris.MediaPlayer2.vlc 2475388 vlc emasaka :1.13589 [email protected] - -
org.mpris.MediaPlayer2.vlc.instance2476079 2476079 vlc emasaka :1.13602 [email protected] - -
Firefoxではバス名は「org.mpris.MediaPlayer2.firefox.instance(数字)」となります。ただし、Firefoxで複数の動画を開いていても、1つのバス名だけが表示されるようです。
$ busctl --user list | grep -i MediaPlayer2
org.mpris.MediaPlayer2.firefox.instance2447971 2447971 firefox emasaka :1.13366 [email protected] - -
操作を調べる
調べたバス名に対して呼び出せる操作(メソッド)を、busctl introspectで調べてみます。
$ busctl --user introspect org.mpris.MediaPlayer2.totem /org/mpris/MediaPlayer2
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
org.mpris.MediaPlayer2 interface - - -
.Quit method - - -
.Raise method - - -
org.mpris.MediaPlayer2.Player interface - - -
.Next method - - -
.OpenUri method s - -
.Pause method - - -
.Play method - - -
.PlayPause method - - -
.Previous method - - -
.Seek method x - -
.SetPosition method ox - -
.Stop method - - -
.Seeked signal x - -
org.mpris.MediaPlayer2.PlayerのPlayPauseというメソッドがありました。どうやら再生と停止のトグルのようです。
再生と停止を実行
dbus-sendを使って、TotemのPlayPauseを呼び出してみます。
$ dbus-send --print-reply --dest=org.mpris.MediaPlayer2.totem /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
method return time=1661306794.641280 sender=:1.13624 -> destination=:1.13643 serial=36 reply_serial=2
これを実行するごとに、Totemの再生と停止が切り替わります。
Emacs Lispでは、dbus-call-methodを呼びます。
(dbus-call-method
:session
(car (seq-filter (lambda (x) (string-match-p "MediaPlayer2\\.totem" x))
(dbus-list-names :session) ))
"/org/mpris/MediaPlayer2"
"org.mpris.MediaPlayer2.Player" "PlayPause" )
再生位置を変更
5秒送りや5秒戻しを試してみます。
再生位置を変更できるかどうかは、CanSeekプロパティで調べられます。
Totemではできます。
$ busctl --user get-property org.mpris.MediaPlayer2.totem /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player CanSeek
b true
Firefoxではできません。
$ busctl --user get-property org.mpris.MediaPlayer2.firefox.instance2447971 /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player CanSeek
b false
Seekメソッドに正のオフセット値を指定すると、そのぶん送られます。オフセット時間の単位はマイクロ秒(100万分の1秒)です。
$ dbus-send --print-reply --dest=org.mpris.MediaPlayer2.totem /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Seek int64:5000000
method return time=1661308135.256952 sender=:1.13624 -> destination=:1.13692 serial=98 reply_serial=2
負のオフセット値を指定すると、そのぶん戻されます。
$ dbus-send --print-reply --dest=org.mpris.MediaPlayer2.totem /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Seek int64:-5000000
method return time=1661308271.529941 sender=:1.13624 -> destination=:1.13704 serial=101 reply_serial=2
Emacs Lispだと、こんな感じです。
(dbus-call-method
:session
(car (seq-filter (lambda (x) (string-match-p "MediaPlayer2\\.totem" x))
(dbus-list-names :session) ))
"/org/mpris/MediaPlayer2"
"org.mpris.MediaPlayer2.Player" "Seek" :int64 5000000 )
まとめ
MPRISでメディアプレイヤーを操作する方法の基礎を試しました。パラメータは少し複雑ですが、まあそんなものと思えば、やりかた自体は簡単です。