我想在每首歌播放时更改 Clementine 专辑封面。本质上,我试图在 Conky 中插入每隔几秒更改一次的图像路径。
我有一个在 Conky 中每 5 秒运行一次的脚本,clementine.sh
使用以下行:
${execi 5 sh ~/.config/openbox/conky/clementine.sh}
该脚本运行以下命令:
qdbus org.mpris.clementine /Player org.freedesktop.MediaPlayer.GetMetadata | grep arturl | cut -c16- > ~/.config/openbox/conky/image
它的作用是找到arturl
来自 Clementine 的 ,修剪它,并将其放置在文件中image
。该行每次都会覆盖。写入的行如下所示:
/tmp/clementine-art-ED9078.jpg
我想要做的是找到一种方法来/tmp/clementine-art-ED9078.jpg
从文件中复制该行image
并将其放在我的 .conkyrc 文件中的以下行中:
${image "xxxx" -p 0,620 -s 75x75}
xxxx
我想要将文本写入的位置,因此该行:
${image "xxxx" -p 0,620 -s 75x75}
实际上看起来像:
${image /tmp/clementine-art-ED9078.jpg -p 0,620 -s 75x75}
显然,台词会随着每首歌曲而改变。
我想用脚本(或直接在 Conky 等中)来执行此操作,而不必安装任何程序或任何东西来完成此操作。我相信这是“可行的”,我只是不知道该怎么做。我搜索了互联网,但找不到任何可用的方法。任何人能给我的任何帮助不仅会让我感激,还会让我的头痛消失。
注意:我能够(从 Conky)使用 .conkyrc 中的以下几行列出艺术家、标题和专辑:
${font sans-serif:normal:size=8}${execi 5 qdbus org.mpris.clementine /Player org.freedesktop.MediaPlayer.GetMetadata | grep artist}
${font sans-serif:normal:size=8}${execi 5 qdbus org.mpris.clementine /Player org.freedesktop.MediaPlayer.GetMetadata | grep title}
${font sans-serif:normal:size=8}${execi 5 qdbus org.mpris.clementine /Player org.freedesktop.MediaPlayer.GetMetadata | grep album}
答案1
使用软链接
在您的~/.conkyrc
文件中,添加以下行:
${image /tmp/conky.jpg -p 0,620 -s 75x75}
qdbus
在脚本中的该行后面添加以下行:
ln -sf "$(cat ~/.config/openbox/conky/image)" /tmp/conky.jpg
此ln
命令更新链接文件/tmp/conky.jpg
以指向~/.config/openbox/conky/image
文件中的任何图像文件名。
为了获得您想要的行为,您可能需要在 conky 行上尝试两个标志image
:-n
告诉 conky 不要缓存图像,同时-f interval
指定 conky 对该图像的缓存刷新间隔。
使用awk
总而言之,您的图像文件的名称已存在~/.config/openbox/conky/image
,并且您想将其传输到您的~/.conkyrc
文件中。因此,qdbus
在脚本中的行后,添加以下行:
awk -v "img=$(cat ~/.config/openbox/conky/image)" '/image/{sub("xxxx", img)} 1' ~/.conkyrc.in >~/.conkyrc
您的原型 conkyrc 文件在哪里~/.conkyrc.in
,其中包含以下行:
${image xxxx -p 0,620 -s 75x75}
awk 命令将 xxxx 替换为您的图像文件的名称。awk
运行该命令后,~/.conkyrc
将创建一个具有正确图像名称的新文件。
怎么运行的:
-v "img=$(cat ~/.config/openbox/conky/image)"
这将创建一个
awk
变量img
并将的内容分配给它~/.config/openbox/conky/image
。/image/{sub("xxxx", img)}
这将查找包含单词 的行
image
。对于包含该单词的任何行,第一次出现的xxxx
将被替换为变量 的值img
。1
这个神秘的命令只是告诉 awk 打印它从输入文件中收到的每一行。
~/.conkyrc.in
这是输入文件,包含虚拟
${image xxxx ....
线。>~/.conkyrc
这告诉 shell 将输出重定向
awk
到 conkyrc 文件,并覆盖先前的副本。
使用m4
(高级)
创建的文件~/.conkyrc.m4
与普通的 conky 文件非常相似,只是它包含以下行:
${image translit(include(/home/user/.config/openbox/conky/image), [
])) -p 0,620 -s 75x75}
然后运行:
m4 ~/.conkyrc.m4 >~/.conkyrc
m4
会将translit
和识别include
为它应该遵守的命令。当它看到该include
命令时,它会读取~/.config/openbox/conky/image
并包含内容。该文件可能有一个尾随换行符。该translit
命令用于删除该换行符。
m4
是一种非常强大的宏语言,您可以使用它来管理 conkyrc 文件的许多部分。如果您不想花时间学习一门新语言,那么坚持使用解决方案可能更简单awk
。