编辑:我删除并重写了大部分帖子,以使问题更直接并使帖子更短。您当然可以查看编辑历史记录以获取以前的版本。
在 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.*
但那不起作用。
有任何想法吗?
答案1
答案2
我是这样做的:
这是一个始终运行以检查哪个玩家当前处于活动状态/上次处于活动状态的脚本,并将该玩家存储在文件中:
#!/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