#!/bin/sh -e # Based on: # https://wiki.archlinux.org/title/Ncmpcpp#With_album_art # Sends notification for mpd with album cover art. Uses 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