summaryrefslogtreecommitdiff
path: root/ar/.local/bin/statusbar/sb-music
diff options
context:
space:
mode:
Diffstat (limited to 'ar/.local/bin/statusbar/sb-music')
-rwxr-xr-xar/.local/bin/statusbar/sb-music86
1 files changed, 78 insertions, 8 deletions
diff --git a/ar/.local/bin/statusbar/sb-music b/ar/.local/bin/statusbar/sb-music
index 5bcc209..36f9101 100755
--- a/ar/.local/bin/statusbar/sb-music
+++ b/ar/.local/bin/statusbar/sb-music
@@ -1,13 +1,16 @@
#!/bin/bash
+shopt -s extglob
+
MPD_HOST="${MPD_HOST:-/tmp/mpd_socket}"
export MPD_HOST
truncate_string() {
- input="$1"
- max_length="$2"
+ local input="$1"
+ local max_length="$2"
if [ "${#input}" -gt "$max_length" ]; then
- echo "${input:0:$((max_length - 2))}.."
+ local truncated="${input:0:$((max_length - 2))}"
+ echo "${truncated%%+( )}.."
else
echo "$input"
fi
@@ -17,18 +20,23 @@ signal="$(awk -F', *' -v name="${0##*/}" '$2 ~ name {print $3+0}' "${XDG_SOURCES
[ "$signal" -eq 0 ] && {
pidof -x sb-mpdup >/dev/null 2>&1 || sb-mpdup >/dev/null 2>&1 &
+ pidof -x sb-playerctlup >/dev/null 2>&1 || sb-playerctlup >/dev/null 2>&1 &
}
+screen_width=$(xrandr | awk '/\*/ {split($1, res, "x"); print res[1]; exit}')
+if [ "$screen_width" -le 2048 ]; then
+ length="$(grep 'MAX_BLOCK_OUTPUT_LENGTH' ~/.local/src/suckless/dwmblocks/config.def.h | awk '{print $3}')"
+ max_length="${length:+$((length / 3))}"
+ max_length="${max_length:-15}"
+fi
+
status() {
if ps -C mpd >/dev/null 2>&1; then
- screen_width=$(xrandr | awk '/\*/ {split($1, res, "x"); print res[1]; exit}')
+ local artist title prefix indicators current_time total_time
artist=$(mpc current -f %artist%)
title=$(mpc current -f %title%)
if [ "$screen_width" -le 2048 ]; then
- length="$(grep 'MAX_BLOCK_OUTPUT_LENGTH' ~/.local/src/suckless/dwmblocks/config.def.h | awk '{print $3}')"
- max_length="${length:+$((length / 3))}"
- max_length="${max_length:-15}"
artist=$(truncate_string "$artist" "$max_length")
title=$(truncate_string "$title" "$max_length")
fi
@@ -58,7 +66,69 @@ status() {
fi
}
-mpc status %state% | grep -q "stopped" || status
+playerctl_status() {
+ command -v playerctl >/dev/null 2>&1 || return
+
+ local output="" player
+ while IFS= read -r player; do
+ local player_status
+ player_status=$(playerctl --player="$player" status 2>/dev/null) || continue
+
+ local play_icon
+ case "${player%%.*}" in
+ spotify | rhythmbox | audacious | clementine | strawberry) play_icon="🎵" ;;
+ vlc | mpv | totem | celluloid) play_icon="🎬" ;;
+ firefox | chromium | chrome) play_icon="📺" ;;
+ *) play_icon="▶️" ;;
+ esac
+
+ local prefix
+ case "$player_status" in
+ "Playing") prefix="$play_icon" ;;
+ "Paused") prefix="⏸" ;;
+ *) continue ;;
+ esac
+
+ if [[ "$player" == chromium.instance* ]]; then
+ local pid proc_name
+ pid="${player#chromium.instance}"
+ proc_name=$(ps -p "$pid" -o comm= 2>/dev/null)
+ [ "$proc_name" = "youtube-music" ] || continue
+ else
+ continue
+ fi
+
+ local artist title
+ artist=$(playerctl --player="$player" metadata artist 2>/dev/null)
+ title=$(playerctl --player="$player" metadata title 2>/dev/null)
+
+ [ -z "$artist" ] && [ -z "$title" ] && continue
+
+ if [ -n "$max_length" ]; then
+ artist=$(truncate_string "$artist" "$max_length")
+ title=$(truncate_string "$title" "$max_length")
+ fi
+
+ output="${output:+$output | }${prefix}${artist:+$artist - }${title}"
+ done < <(playerctl -l 2>/dev/null)
+
+ echo "$output"
+}
+
+mpd_output=""
+if ps -C mpd >/dev/null 2>&1 && ! mpc status %state% 2>/dev/null | grep -q "stopped"; then
+ mpd_output=$(status)
+fi
+
+playerctl_output=$(playerctl_status)
+
+if [ -n "$mpd_output" ] && [ -n "$playerctl_output" ]; then
+ echo "$mpd_output $playerctl_output"
+elif [ -n "$mpd_output" ]; then
+ echo "$mpd_output"
+elif [ -n "$playerctl_output" ]; then
+ echo "$playerctl_output"
+fi
case $BLOCK_BUTTON in
1) setsid -f "$TERMINAL" -e ncmpcpp ;; # left click, opens ncmpcpp