summaryrefslogtreecommitdiff
path: root/ar/.local/bin/mpdmenu
diff options
context:
space:
mode:
Diffstat (limited to 'ar/.local/bin/mpdmenu')
-rwxr-xr-xar/.local/bin/mpdmenu111
1 files changed, 111 insertions, 0 deletions
diff --git a/ar/.local/bin/mpdmenu b/ar/.local/bin/mpdmenu
new file mode 100755
index 0000000..4febe9d
--- /dev/null
+++ b/ar/.local/bin/mpdmenu
@@ -0,0 +1,111 @@
+#!/bin/bash
+
+all_name='[ALL]'
+PLAYLIST_DIR="${XDG_CONFIG_HOME:-${HOME}/.config}/mpd/playlists"
+
+# Functions
+d_artist() {
+ mpc list artist | sort -f | dmenu -p artist "${dmenu_args[@]}" || exit
+}
+
+d_album() {
+ local artist="$1"
+ local albums
+
+ mapfile -t albums < <(mpc list album artist "$artist")
+ if ((${#albums[@]} > 1)); then
+ {
+ printf '%s\n' "$all_name"
+ printf '%s\n' "${albums[@]}" | sort -f
+ } | dmenu -p album "${dmenu_args[@]}" || exit
+ else
+ # We only have one album, so just use that.
+ printf '%s\n' "${albums[0]}"
+ fi
+}
+
+d_title() {
+ titles=$(mpc list title | sort -f)
+ [[ -z "$titles" ]] && exit
+ echo "$titles" | dmenu -p "Select title:" "${dmenu_args[@]}"
+}
+
+d_playlist() {
+ playlists=$(find "$PLAYLIST_DIR" \( -type f -o -type l \) -name "*.m3u" -exec basename {} .m3u \;)
+
+ selected_playlist=$(echo "$playlists" | sort | dmenu -i -p "Select Playlist:" "${dmenu_args[@]}")
+
+ printf '%s' "$selected_playlist"
+}
+
+d_queue() {
+ format="%position% %title%"
+ extra_format="(%artist% - %album%)"
+
+ # If all tracks are from the same artist and album, no need to display that
+ num_extras=$(mpc playlist -f "$extra_format" | sort | uniq | wc -l)
+ ((num_extras == 1)) || format+=" $extra_format"
+
+ track=$(mpc playlist -f "$format" | dmenu -p track "${dmenu_args[@]}")
+ printf '%s' "${track%% *}"
+}
+
+# Parse arguments (if any)
+i=2
+for arg in "$@"; do
+ if [[ $arg == :: ]]; then
+ dmenu_args=("${@:$i}")
+ break
+ fi
+
+ case "$arg" in
+ -l) mode="library" ;;
+ -p) mode="playlist" ;;
+ -q) mode="queue" ;;
+ esac
+
+ ((i + 1))
+done
+
+# Main Menu
+[[ -z "$mode" ]] && mode=$(echo -e "library\nplaylist\nqueue" | dmenu -p "Choose mode:" "${dmenu_args[@]}")
+
+# Mode Handling
+case "$mode" in
+"library")
+ search_type=$(echo -e "artist\ntitle" | dmenu -p "Search by:" "${dmenu_args[@]}")
+ case "$search_type" in
+ "artist")
+ artist=$(d_artist)
+ album=$(d_album "$artist")
+ mpc clear
+ if [[ $album == "$all_name" ]]; then
+ mpc find artist "$artist" | sort | mpc add
+ else
+ mpc find artist "$artist" album "$album" | sort | mpc add
+ fi
+ ;;
+ "title")
+ title=$(d_title)
+ mpc clear
+ mpc find title "$title" | sort | mpc add
+ ;;
+ *) exit ;;
+ esac
+ mpc random on
+ mpc play 2>/dev/null
+ ;;
+"playlist")
+ mpc clear
+ mpc load "$(d_playlist)" 2>/dev/null || exit
+ mpc random on
+ mpc play 2>/dev/null
+ ;;
+"queue")
+ ! mpc playlist | grep -q '.' && exit
+ mpc play "$(d_queue)" 2>/dev/null || exit
+ ;;
+*) exit ;;
+esac
+
+sleep 0.5 && mpc volume 50