fc2ブログ

本を読む

読書やコンピュータなどに関するメモ

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でメディアプレイヤーを操作する方法の基礎を試しました。パラメータは少し複雑ですが、まあそんなものと思えば、やりかた自体は簡単です。

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly