监控窗口标题变化的脚本

监控窗口标题变化的脚本

情况是这样的:我使用 lastfm 包来收听我的 Last.FM(呃)...并且我想在开始播放新音乐时显示一些 notify-osd 通知。

只要程序不支持它,我想创建一个 shell 脚本来监视 lastfm 播放器的窗口标题并在其更改时发送通知。

您觉得如何?我该如何开始?

答案1

您可以使用以下方式检查打开窗口的标题控制端

$ wmctrl -lx | grep "last.fm.Last.fm" | grep -Po "(?<=$HOSTNAME ).*$"
Insomnium – Death Walked the Earth

但是,使用此方法观看标题需要脚本定期轮询更改,这会很混乱且效率低下。

更明智的方法是等待 Last.fm 播放器生成的某种事件。D-Bus 接口或类似的 API 是理想的选择,但我没有看到任何文档表明存在这样的接口。作为次优选择,您可以尝试观察终端输出以获取有关播放器正在执行的操作的信息:

#!/bin/bash

grabnextline=0
albumart="$(mktemp)"

while read line; do
    if [ $grabnextline = 1 ]; then
        title="$(echo "$line" | cut -d\" -f2)"
        wget -O "$albumart" "$(grep -A 10 "<title>$(echo "$title" | awk -F ' – ' '{print $2}')" ~/.local/share/Last.fm/Last.fm.log | grep -Eo "http://.*\.(jpg|png)" | sed 's/174s/64s/' | sed 's/jpg/png/')"
        notify-send "$title" --icon "$albumart"
        grabnextline=0
    fi
    if [[ "$line" = *ScrobblerManager::nowPlaying* ]]; then
        grabnextline=1
    fi
done < <( /usr/bin/lastfm 2>&1 )

rm "$albumart"

exit

这仍然是一个丑陋的黑客,但它完成了工作。

答案2

您使用哪个播放器播放 list.fm 。许多应用程序使用 dbus 来通知事件。您需要在脚本中捕获它们。

如下页有一个关于如何使用捕捉 Rhythmbox 歌曲变化的示例。

使用 dbus 跟踪 Rhythmbox 音轨变化

相关内容