2 # mpc-notify: sends notification of currently playing MPD music accompanied
5 # exit early if we're in tty
6 if [ -z "$WAYLAND_DISPLAY" ] && [ -z "$DISPLAY" ]; then
15 # FEATURE: make defaults configurable through flags
16 preview_dir="${XDG_CONFIG_HOME:-$HOME/.config}/mpc/previews"
19 default_song_icon="media-playback-start"
21 # issue an mpc command based on arguments and assemble notification message
25 song_head="Now Playing"
30 song_head="Stopped Playing"
31 song_icon="media-playback-stop"
35 state="$(mpc status %state%)"
38 song_head="Now Playing"
43 song_icon="media-playback-pause"
49 song_head="Shuffled Playlist"
50 song_icon="media-playlist-shuffle"
54 state="$(mpc status %single%)"
57 song_head="Single Mode: On";;
59 song_head="Single Mode: Once";;
61 song_head="Single Mode: Off";;
63 # TODO: consider a more appropriate icon
64 song_icon="multimedia-player"
68 state="$(mpc status %random%)"
71 song_head="Random Mode: On";;
73 song_head="Random Mode: Off";;
75 # TODO: consider a more appropriate icon
76 song_icon="media-eject"
80 state="$(mpc status %repeat%)"
83 song_head="Repeat Mode: On";;
85 song_head="Repeat Mode: Off";;
87 song_icon="media-playlist-repeat"
91 # don't notify if mpc changed song because ncmpcpp would notify on
93 [ "$command" = "next" ] || [ "$command" = "prev" ] && exit
97 # use album preview for song icon
98 if [ "$use_preview" -eq 1 ]; then
99 [ -d "$preview_dir" ] || mkdir -p "$preview_dir"
101 # find xdg music directory
102 # user-dirs.dirs is not guaranteed to exist
103 # shellcheck disable=SC1091
104 . "${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs" 2>/dev/null || true
105 xdg_music_dir="${XDG_MUSIC_DIR:-$HOME/Music}"
107 # get preview filename
108 song_filename="$(mpc --format "${xdg_music_dir}/%file%" current)"
109 song_album_name="$(mpc --format %album% current)"
110 if [ -z "$song_album_name" ]; then
111 # fallback to the default icon for an empty album name
112 song_icon="$default_song_icon"
114 preview_path="${preview_dir}/$(echo "$song_album_name" | base64).png"
115 if [ -f "$preview_path" ]; then
117 song_icon="$preview_path"
118 elif ffmpeg -y -i "$song_filename" -an -vf \
119 scale="${preview_width}:${preview_height}" \
120 "$preview_path" >/dev/null 2>&1;
122 # or use generated preview
123 song_icon="$preview_path"
125 song_dirname=$(dirname "$song_filename")
126 if art_filename="$(find "$song_dirname" -type f |
127 grep -Esm 1 '.*\.(jpg|png)')"
129 # or use scaled cover art from directory
130 ffmpeg -y -i "$art_filename" -an -vf \
131 scale="${preview_width}:${preview_height}" \
132 "$preview_path" >/dev/null 2>&1;
133 song_icon="$preview_path"
135 # or fallback to default icon
136 song_icon="$default_song_icon"
142 # now send the actual notification
143 song_body="$(mpc --format '[%title%[ \n%artist% - %album%]]|[%file%]' current)"
144 notify-replace 'mpc-notify' "$song_head" "$song_body" -i "$song_icon" -u low