#!/usr/bin/env bash
# source: https://gitlab.com/xPMo/dotfiles.cli/-/blob/dots/.local/lib/waybar/playerctl.sh
exec 2>"$XDG_RUNTIME_DIR/waybar-playerctl.log"
IFS=$'\n\t'
while true; do
while read -r playing position length name artist title arturl hpos hlen; do
# remove leaders
playing=${playing:1} position=${position:1} length=${length:1} name=${name:1}
artist=${artist:1} title=${title:1} arturl=${arturl:1} hpos=${hpos:1} hlen=${hlen:1}
# build line
line="${artist:+$artist ${title:+- }}${title:+$title }${hpos:+$hpos${hlen:+|}}$hlen"
# json escaping
line="${line//\"/\\\"}"
((percentage = length ? (100 * (position % length)) / length : 0))
case $playing in
⏸️ | Paused) text=''"$line"'' ;;
▶️ | Playing) text="$line" ;;
*) text='⏹' ;;
esac
# integrations for other services (nwg-wrapper)
if [[ $title != "$ptitle" || $artist != "$partist" || $parturl != "$arturl" ]]; then
typeset -p playing length name artist title arturl >"$XDG_RUNTIME_DIR/waybar-playerctl.info"
pkill -8 nwg-wrapper
ptitle=$title partist=$artist parturl=$arturl
fi
# exit if print fails
printf '{"text":"%s","tooltip":"%s","class":"%s","percentage":%s}\n' \
"$text" "$playing $name | $line" "$percentage" "$percentage" || break 2
done < <(
# requires playerctl>=2.0
# Add non-space character ":" before each parameter to prevent 'read' from skipping over them
playerctl --follow metadata --player playerctld --format \
$':{{emoji(status)}}\t:{{position}}\t:{{mpris:length}}\t:{{playerName}}\t:{{markup_escape(artist)}}\t:{{markup_escape(title)}}\t:{{mpris:artUrl}}\t:{{duration(position)}}\t:{{duration(mpris:length)}}' &
echo $! >"$XDG_RUNTIME_DIR/waybar-playerctl.pid"
)
# no current players
# exit if print fails
echo '⏹' || break
sleep 15
done
kill "$(<"$XDG_RUNTIME_DIR/waybar-playerctl.pid")"