Как в conky отобразить полосу прогресса для трека, воспроизводимого в Deadbeef?

Как в conky отобразить полосу прогресса для трека, воспроизводимого в Deadbeef?

У меня был простой скрипт Conky для аудиоплеера Deadbeef:

введите описание изображения здесь

Часть, которая касается строк выше, такова:

TEXT
${color 3399FF}${alignr}db audio is playing: 
#${alignr}
${color FFFFFF}${alignr} ${exec deadbeef --nowplaying "%a"} 
${color FFFFFF} ${alignr}${exec deadbeef --nowplaying "%t"}
${color FFFFFF}${alignr}${exec deadbeef --nowplaying "%b"} 
${color FFFFFF}
${alignr}${color 3399FF}${exec deadbeef --nowplaying "%e"}${offset 2}${alignr} / ${exec deadbeef --nowplaying "%l"} 
${alignr}${image ./logo.png -p 0,-1 -s 25x25}${color 3399FF}

Как добавить полосу прогресса, показывающую ход воспроизведения песни?

решение1

Я тоже искал способ сделать это, и поскольку я уже использовал скрипт lua для своего файла conky, я решил создать функцию lua для этого, чтобы мне не пришлось полагаться на внешние скрипты bash.

Если кто-то заинтересован в этом, вам необходимо включить свой lua-файл в conkyrc в раздел conky.config:

conky.config = {
   ...other config options...,    
   lua_load         = '/path/to/file.lua'
}

затем в вашем lua-файле вам нужна следующая функция (обратите внимание, что она использует новый синтаксис форматирования foobar от deadbeef, который появился в deadbeef 0.7.0, и который не только более надежен в будущем, поскольку старый синтаксис устарел, но и упрощает вычисления) [исправил глупую опечатку, которую только что заметил]:

function conky_song_progress()
   local song_progress = "deadbeef --nowplaying-tf '(100*%playback_time_seconds%)//%length_seconds_fp%' 2>/dev/null"
   local get_progress = assert(io.popen(song_progress))
   local progress     = math.tointeger(assert(loadstring("return " .. get_progress:read('*all')))())
   get_progress:close()
   return progress
end

Затем добавьте в раздел conky.text:

${lua_bar song_progress}

Обратите внимание, что здесь используется новый синтаксис conky 1.10, а для кода lua требуется lua 5.3+.

решение2

Вы можете нарисовать полосу размером по умолчанию, используя execbarкоманду, которая должна вернуть число от 0 до 100, указывающее, какой процент полосы заполнен. Например, если у вас есть следующий скрипт оболочки myscriptв вашем PATH:

#!/bin/bash
deadbeef --nowplaying "%e %l" |
awk '
{ n = split("::" $1,t,":")
  elapsed = (t[n-2]*60+t[n-1])*60+t[n]
  n = split("::" $2,t,":")
  total = (t[n-2]*60+t[n-1])*60+t[n]
  printf "%d\n",elapsed*100/total
}'

то вы можете использовать строку conky:

${execbar myscript}

Скрипт просто преобразует прошедшее и общее время, выведенное deadbeef, в секунды и, наконец, в проценты.

Результат выглядит так:

введите описание изображения здесь

Связанный контент