diff options
Diffstat (limited to 'ar/.local/bin/mpdmenu')
| -rwxr-xr-x | ar/.local/bin/mpdmenu | 111 |
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 |
