summaryrefslogtreecommitdiff
path: root/mpc-notify
blob: ce41fa3ea55cc49d5f7ce74c95fb0678d9a5fd72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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