summaryrefslogtreecommitdiff
path: root/mpc-notify
diff options
context:
space:
mode:
authornoodle <shawtynoodle@gmail.com>2023-06-05 05:20:24 +0300
committernoodle <shawtynoodle@gmail.com>2023-06-05 05:20:24 +0300
commit9733f193718b3d5d83f13fda130a7508ac906ded (patch)
tree9765c5e8df56045d5a76a7bcb7c209e9d6037f80 /mpc-notify
Add stuff!
Diffstat (limited to 'mpc-notify')
-rwxr-xr-xmpc-notify126
1 files changed, 126 insertions, 0 deletions
diff --git a/mpc-notify b/mpc-notify
new file mode 100755
index 0000000..ce41fa3
--- /dev/null
+++ b/mpc-notify
@@ -0,0 +1,126 @@
+#!/bin/dash
+# Based on:
+# https://wiki.archlinux.org/title/Ncmpcpp#With_album_art
+
+# Sends notification with album cover art using mpc, ffmpeg, notify-send,
+# and my other script, notify-replace.
+# For notification on song change:
+# Assign execute_on_song_change to this script in ncmpcpp's config file.
+# For notification on media keys:
+# Bind media key to a call to mpc with the approprite command.
+
+# FEATURE: make width and height configurable through flags
+preview_width=64
+preview_height=64
+default_song_icon="media-playback-start"
+xdg_config_home="${XDG_CONFIG_HOME:-$HOME/.config}"
+mpc_config_dir="$xdg_config_home/mpc"
+[ -d "$mpc_config_dir" ] || mkdir -p "$mpc_config_dir"
+
+# issue an mpc command based on arguments and assemble notification message
+use_preview=0
+case "$1" in
+ "")
+ # use defaults
+ song_head="Now Playing"
+ use_preview=1
+ ;;
+ "toggle")
+ mpc -q toggle
+ state="$(mpc status %state%)"
+ if [ "$state" = "playing" ]; then
+ song_head="Now Playing"
+ use_preview=1
+ elif [ "$state" = "paused" ]; then
+ song_head="Paused"
+ song_icon="media-playback-pause"
+ fi
+ ;;
+ "shuffle")
+ mpc -q shuffle
+ song_head="Shuffled Playlist"
+ song_icon="media-playlist-shuffle"
+ ;;
+ "single")
+ mpc -q single
+ state="$(mpc status %single%)"
+ if [ "$state" = "on" ]; then
+ song_head="Single Mode: On"
+ elif [ "$state" = "once" ]; then
+ song_head="Single Mode: Once"
+ elif [ "$state" = "off" ]; then
+ song_head="Single Mode: Off"
+ fi
+ song_icon="multimedia-player"
+ ;;
+ "random")
+ mpc -q random
+ state="$(mpc status %random%)"
+ if [ "$state" = "on" ]; then
+ song_head="Random Mode: On"
+ elif [ "$state" = "off" ]; then
+ song_head="Random Mode: Off"
+ fi
+ song_icon="media-eject"
+ ;;
+ "repeat")
+ mpc -q repeat
+ state="$(mpc status %repeat%)"
+ if [ "$state" = "on" ]; then
+ song_head="Repeat Mode: On"
+ elif [ "$state" = "off" ]; then
+ song_head="Repeat Mode: Off"
+ fi
+ song_icon="media-playlist-repeat"
+ ;;
+ *)
+ mpc -q "$1"
+ # Don't notify if mpc changed song because ncmpcpp would notify on
+ # song change.
+ [ "$1" = "next" ] || [ "$1" = "prev" ] && exit
+ ;;
+esac
+song_body="$(mpc --format '[%title%[ \n%artist% - %album%]]|[%file%]' current)"
+
+# use album preview for song icon
+if [ "$use_preview" -eq 1 ]; then
+ preview_dir="$mpc_config_dir/previews"
+ [ -d "$preview_dir" ] || mkdir -p "$preview_dir"
+ music_dir="$(xdg-user-dir MUSIC)"
+
+ # get preview filename
+ song_filename="$(mpc --format "$music_dir"/%file% current)"
+ song_album="$(mpc --format %album% current)"
+ if [ -z "$song_album" ]; then
+ # fallback to default for empty album name
+ song_icon="$default_song_icon"
+ else
+ preview_path="$preview_dir/$(echo "$song_album" | base64).png"
+ if [ -f "$preview_path" ]; then
+ # use cached preview
+ song_icon="$preview_path"
+ elif ffmpeg -y -i "$song_filename" -an -vf \
+ scale="${preview_width}:${preview_height}" \
+ "$preview_path" >/dev/null 2>&1;
+ then
+ # or use generated preview
+ song_icon="$preview_path"
+ else
+ song_dirname=$(dirname "$song_filename")
+ art_filename="$(find "$song_dirname" -type f |
+ grep -Esm 1 '.*\.(jpg|png)')"
+ if [ $? -eq 0 ]; then
+ # or use scaled cover art from directory
+ ffmpeg -y -i "$art_filename" -an -vf \
+ scale="${preview_width}:${preview_height}" \
+ "$preview_path" >/dev/null 2>&1;
+ song_icon="$preview_path"
+ else
+ # or fallback to default icon
+ song_icon="$default_song_icon"
+ fi
+ fi
+ fi
+fi
+
+notify-replace 'mpc-notify' "$song_head" "$song_body" -i "$song_icon" -u low