Как вставить постоянно изменяющуюся (динамическую) строку из текстового документа в.conkyrc как путь к изображению

Я хочу изменить обложку альбома Clementine с каждой песней. По сути, я пытаюсь вставить путь изображения в Conky, который меняется каждые несколько секунд.

У меня есть сценарий clementine.sh который запускается каждые 5 секунд в Conky, используя эту строку:

${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 от Клементины, обрезает его и помещает в файл 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 to указывает интервал очистки кэша 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.in это ваш прототип файла conkyrc, который содержит строку:

${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

    Это говорит оболочке перенаправить вывод awk в ваш файл conkyrc, перезаписав предыдущую копию.

С помощью m4 (Advanced)

Создать файл ~/.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 решение.

Другие вопросы по тегам