Skip to content

Instantly share code, notes, and snippets.

@rdschmidt
Last active February 22, 2024 09:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rdschmidt/8c04aaf7050b493d239a7c040d41f7c6 to your computer and use it in GitHub Desktop.
Save rdschmidt/8c04aaf7050b493d239a7c040d41f7c6 to your computer and use it in GitHub Desktop.
Now Playing Conky, written in LUA
--[[
2024 Bleys
All scripts in the same directory!
Start the player via the player.sh script
]]
conky.config = {
-- — Conky settings
background = false,
update_interval = 1,
total_run_times = 0,
no_buffers = true,
imlib_cache_size = 0,
draw_graph_borders = true,
draw_outline = false,
-- — Window specifications
own_window = true,
own_window_transparent = true,
own_window_hints = 'undecorated,sticky,skip_taskbar,skip_pager,below',
double_buffer = true,
-- minimum_width = 155, minimum_height = 205, --kompakt
minimum_width = 400, minimum_height = 116, --lang
-- — Position on Desktop / Lage auf dem Desktop festlegen
alignment = 'bottom_middle',
gap_x = 20,
gap_y = 60,
border_inner_margin = 10,
-- Lua Load
lua_load = './now.lua',
lua_draw_hook_post = 'main',
};
conky.text = [[
]];
#!/bin/bash
#
# Bleys 2023
# dependencies: urlencode, qdbus
# sudo apt install gridsite-client qdbus
#
#
Player=$1
if [ $(ps -C $Player -o pid=) ]; then
convertsec()
{
x=`expr $1 / 1000000`
s=`expr $x % 60`
x=`expr $x / 60`
m=`expr $x % 60`
printf "%02d:%02d\n" $m $s
}
POS=$(qdbus org.mpris.MediaPlayer2.$Player /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Position)
TOTAL=$(qdbus org.mpris.MediaPlayer2.$Player /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata | grep "^mpris:length" | awk '{print $2}')
if [ -z $TOTAL ]
then
positionTime="00:00"
lengthTime="00:00"
length="stopped"
position=1
else
positionTime=$(convertsec $POS)
lengthTime=$(convertsec $TOTAL)
length=$(($TOTAL/1000000))
position=$(($POS/1000000))
fi
TEMP=$(qdbus org.mpris.MediaPlayer2.$Player /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata | grep "artist:")
artist=${TEMP##*:}
TEMP=$(qdbus org.mpris.MediaPlayer2.$Player /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata | grep "title:")
title=${TEMP##*:}
COVER=$(qdbus org.mpris.MediaPlayer2.$Player /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata | grep "artUrl:")
str="'"
if [ -n "$COVER" -a $position -ge 1 ]; then
if [ "$Player" == "vlc" ]; then
uri=$(urlencode -d "$COVER")
COVER=${uri#*//}
convert "$COVER" '/tmp/tmp.png'
else
convert "${COVER#*//}" '/tmp/tmp.png'
fi
fi
vol=$(qdbus org.mpris.MediaPlayer2.$Player /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Volume)
echo $length";"$position";"$artist";"$title";"$positionTime";"$lengthTime";"$vol
fi
exit 0
require 'cairo'
require "imlib2"
home_path = os.getenv ('HOME')
pt={}
pt['bg_color']=0xffffff
pt['bg_alpha']=0.3
pt['fg_color']=0xffffff
pt['fg_alpha']=1.0
pt['width']=194
pt['height']=6
pt['x']=180
pt['y']=15
vl={}
vl['bg_color']=0xffffff
vl['bg_alpha']=0.3
vl['fg_color']=0xffffff
vl['fg_alpha']=1.0
vl['width']=210
vl['height']=6
vl['x']=158
vl['y']=17
function rgb_to_rgba(color,alpha)
return ((color / 0x10000) % 0x100) / 255., ((color / 0x100) % 0x100) / 255., (color % 0x100) / 255., alpha
end
function mysplit (inputstr, sep)
if sep == nil then
sep = ";"
end
local t={}
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
table.insert(t, str)
end
return t
end
function draw_bg(cr,color,alpha,typ) -- zeichne Hintergrund Conky Fenster / draw Conky Area Background
local corner_r=0
local bg_color=color
local bg_alpha=alpha
local w=conky_window.width
local h=conky_window.height
cairo_set_source_rgba(cr,rgb_to_rgba(bg_color,bg_alpha))
cairo_move_to(cr,corner_r,0)
cairo_line_to(cr,w-corner_r,0)
cairo_curve_to(cr,w,0,w,0,w,corner_r)
cairo_line_to(cr,w,h-corner_r)
cairo_curve_to(cr,w,h,w,h,w-corner_r,h)
cairo_line_to(cr,corner_r,h)
cairo_curve_to(cr,0,h,0,h,0,h-corner_r)
cairo_line_to(cr,0,corner_r)
cairo_curve_to(cr,0,0,0,0,corner_r,0)
cairo_close_path(cr)
if typ==1 then
cairo_fill(cr)
else
cairo_stroke(cr)
end
end
function fDrawImage(cr,path,x,y,w,h)
cairo_save (cr)
local img = cairo_image_surface_create_from_png(path)
local w_img, h_img = cairo_image_surface_get_width(img), cairo_image_surface_get_height(img)
cairo_translate (cr, x, y)
cairo_scale (cr, w/w_img, h/h_img)
cairo_set_source_surface (cr, img, -w_img/2, -h_img/2)
cairo_paint (cr)
cairo_surface_destroy (img)
collectgarbage ()
cairo_restore (cr)
end
function draw_bar(cr,pct,pt)
local bgc, bga, fgc, fga=pt['bg_color'], pt['bg_alpha'], pt['fg_color'], pt['fg_alpha']
local w=pct*pt['width']
local x=pt['x']
local y=pt['y']
-- Background
cairo_rectangle(cr, x, y, pt['width'], pt['height'])
cairo_set_source_rgba(cr,rgb_to_rgba(bgc,bga))
cairo_fill(cr)
-- Indicator
cairo_rectangle(cr, x, y, w, pt['height'])
cairo_set_source_rgba(cr,rgb_to_rgba(fgc,fga))
cairo_fill(cr)
cairo_stroke (cr)
end
function write_text(cr, x, y, text, f)
--write_text(cr, x, y, text, {})
--font attributes (Schriftattribute zuweisen oder default Werte annehmen)
local font=f.font or "Noto Sans"
local size=f.size or 10
local align=f.align or 'l'
local bold=f.bold or false
local ital=f.italic or false
local color=f.color or "0xffffff"
local slant=CAIRO_FONT_SLANT_NORMAL
if ital then slant=CAIRO_FONT_SLANT_ITALIC end
local weight=CAIRO_FONT_WEIGHT_NORMAL
if bold then weight=CAIRO_FONT_WEIGHT_BOLD end
--Text Size (Textgröße für die Plazierung bestimmen.)
local x_a=0
local y_a=0
local te = cairo_text_extents_t:create()
tolua.takeownership(te)
cairo_select_font_face (cr, font, slant, weight)
cairo_set_font_size (cr, size)
cairo_text_extents (cr, text, te)
--Text Position
if align=='c' then
x_a = -(te.width/2+te.x_bearing)
y_a = -(te.height/2+te.y_bearing)
end
if align=='r' then
x_a = -(te.width+te.x_bearing)
--y_a = -(te.height+te.y_bearing)
end
--Schadow 1 Pixel (Schatten für den Text um 1 Pixel versetzt)
cairo_set_source_rgba(cr, rgb_to_rgba(0x000000,1))
cairo_move_to (cr, x+1+x_a, y+1+y_a)
cairo_show_text (cr, text)
cairo_stroke(cr)
-- Now Text on Top (nun den Text oben drauf)
cairo_set_source_rgba(cr, rgb_to_rgba(color,1))
cairo_move_to (cr, x+x_a, y+y_a)
cairo_show_text (cr, text)
cairo_stroke(cr)
end
function conky_main()
function running(cr,player) -- is Player running? / läuft der Player?
local handle = io.popen("ps -U root -u root -N | awk '/"..player.."/{print $4}'")
local result = handle:read()
handle:close()
if result == player then
daten = mysplit (conky_parse('${exec bash ./mpris.sh '..player..'}')) -- length pos artist titel postime lengthtime vol album
if (daten[1]~="stopped") then
color=0xffffff alpha=0.1 typ=1
draw_bg(cr,color,alpha,typ) -- Funktion Hintergrund Conky Bereich / Function Backgrounds Conky Area
color=0xffffff alpha=0.8 typ=2
draw_bg(cr,color,alpha,typ) --zeichne Linie um den Bereich / Draw line around Conky Area
if daten[4] == daten [8] then
daten[8]=" Single"
end
write_text(cr, 130,84,daten[3], {font="Dyuthi", size=22, align="l"}) --artist
write_text(cr, 134,110,daten[8], {font="Dyuthi", size=16, align="l"}) --album
write_text(cr, 134,126,daten[4], {font="Dyuthi", size=16, align="l"}) --titel
write_text(cr, 145,22,daten[5], {font="Dyuthi", size=12, align="l"}) --position
write_text(cr, 410,22,daten[6], {font="Dyuthi", size=12, align="r"}) --length
value=tonumber(daten[2])
total=tonumber(daten[1])
if (value == nil or total == nil) then
pct=1
else
pct=value/total
draw_bar(cr,pct,pt)
fDrawImage(cr,'/tmp/tmp.png',70,70,120,120)
end
-- write_text(cr, 130,55," "..player, {font="Dyuthi", size=22, align="l", color="0xff0000"}) --Player
end
else
stop=conky_parse('${exec bash stop.sh}')
end
end
if conky_window==nil then return end
local cs=cairo_xlib_surface_create(conky_window.display,conky_window.drawable,conky_window.visual, conky_window.width,conky_window.height)
local cr=cairo_create(cs)
local updates=conky_parse('${updates}')
update_num=tonumber(updates)
if update_num>5 then
-- Player Auswahl. Jeder mpris unterstützende Player ist möglich. / Player selection. Any mpris supporting player is possible.
player="clementine"
-- player="audacious"
-- player="vlc"
-- player="qmmp"
-- player="celluloid"
running(cr,player)
end
cairo_surface_destroy(cs)
cairo_destroy(cr)
end
#!/bin/bash
#
clementine &
# audacious &
# qmmp &
# vlc '/home/ralf/.conky/NowPlaying/favs.m3u'&
# celluloid '/home/ralf/.conky/NowPlaying/favs.m3u' &
sleep 1
cd $HOME/.conky/NowPlaying
conky -c conkyrc &
echo $! > /tmp/pid
exit 0
#!/bin/bash
f=$(</tmp/pid)
kill -15 $f
@rdschmidt
Copy link
Author

NowPlayingConky

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment