使用 dbus 獲取目前播放的媒體播放器的名稱
編輯:我刪除並重寫了大部分文章,以使問題更直接,並使文章更短。您當然可以查看編輯歷史以獲取以前的版本。
在 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