Linux

使用 dbus 獲取目前播放的媒體播放器的名稱

  • February 2, 2020

編輯:我刪除並重寫了大部分文章,以使問題更直接,並使文章更短。您當然可以查看編輯歷史以獲取以前的版本。

在 Arch Linux 上使用 bspwm。playerctl控制媒體,sxhkd將媒體鍵綁定到 playerctl 命令。

我正在嘗試找到一種方法來獲取最新的活動媒體播放器,因此當我使用媒體鍵播放/暫停歌曲/電影/.. 時,我的電腦會自動控制最新的活動媒體播放器。

例如,當 Spotify 恰好在後台打開並且我正在 VLC 上觀看某些內容時,當我按下媒體鍵時,它知道控制 VLC 而不是 Spotify。現在,如果兩者都打開,VLC 總是從 playerctl 獲得優先權。

我需要的是一種詢問 dbus 哪個媒體播放器目前正在播放歌曲的方法,這樣我就可以將它保存在一個文件中。


編輯:我找到了一種方法來詢問每個 spotify 和 vlc 使用:

qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlaybackStatus

qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlaybackStatus

但我想自動詢問所有媒體播放器,而不是每個人的名字。我試圖用它來做,org.mpris.MediaPlayer2.*但這不起作用。

有任何想法嗎?

我是這樣做的:

這是一個始終執行以檢查哪個播放器目前處於活動狀態/上次處於活動狀態的腳本,並將該播放器儲存在一個文件中:

#!/bin/sh

while true ; do
   for m in `qdbus | egrep -i 'org.mpris.MediaPlayer2|plasma-browser-integration'` ; do
       if [[ `qdbus $m /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlaybackStatus` == 'Playing' ]]; then
           echo $m > ~/.config/activePlayer/currentPlaying.txt
       fi
   done
   sleep 1
done

這是一個向目前活動的播放器(基於該文件)發送 dbus 命令(如 play/pause/etc/)的腳本。該腳本被 sxhkd 呼叫,它監聽我的按鍵。

#!/bin/sh

#Get command
case $1 in
   'play-pause')
       cmd='/org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause';;
   'next')
       cmd='/org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next';;
   'previous')
       cmd='/org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous';;
   'stop')
       cmd='/org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Stop';;
   'skipForward')
       cmd='/org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Seek 5000000';;
   'skipBackward')
       cmd='/org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Seek -5000000';;
   *)
esac

#Send command to qdbus
if [[ `qdbus | egrep -i 'org.mpris.MediaPlayer2|plasma-browser-integration' | wc -l` -eq 1 ]]; then
   qdbus `qdbus | egrep -i 'org.mpris.MediaPlayer2|plasma-browser-integration'` $cmd
else
   qdbus `cat ~/.config/activePlayer/currentPlaying.txt` $cmd
fi

unset cmd

引用自:https://unix.stackexchange.com/questions/477823