如何将文本文档中不断变化的(动态)字符串作为图像路径插入 .conkyrc

如何将文本文档中不断变化的(动态)字符串作为图像路径插入 .conkyrc

我想在每首歌播放时更改 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

相关内容