#!/bin/bash # when set to exit, mpd_control will exit if you press escape # when set to break, mpd_control will go the upper level if possible ESC_ACTION="break" # source configuration file for rofi if exists PORT=6600 ROFI="rofi -dmenu -i -p Search" MPC="mpc -q -p ${PORT}" # check if mpc is in PATH if [ ! -x "$(command -v mpc)" ]; then echo "ERROR: mpc is not installed or not in PATH" exit fi add_after_current_song(){ # playlist is empty, just add the song if [ "$($MPC playlist | wc -l)" == "0" ]; then $MPC add "$1" # there is no current song so mpd is stopped # it seems to be impossible to determine the current songs' position when # mpd is stopped, so just add to the end elif [ -z "$($MPC current)" ]; then $MPC play CUR_POS=$($MPC | tail -2 | head -1 | awk '{print $2}' | sed 's/#//' | awk -F/ '{print $1}') END_POS=$($MPC playlist | wc -l) $MPC add "$1" $MPC move $(($END_POS+1)) $(($CUR_POS+1)) $MPC stop # at least 1 song is in the playlist, determine the position of the # currently played song and add $1 after it else CUR_POS=$($MPC | tail -2 | head -1 | awk '{print $2}' | sed 's/#//' | awk -F/ '{print $1}') END_POS=$($MPC playlist | wc -l) $MPC add "$1" $MPC move $(($END_POS+1)) $(($CUR_POS+1)) fi } add_after_current_song_and_play(){ #playlist is empty, just add the song if [ "$($MPC playlist | wc -l)" == "0" ]; then $MPC add "$1" $MPC play #there is no current song so mpd is stopped #it seems to be impossible to determine the current songs' position when #mpd is stopped, so just add to the end elif [ -z "$($MPC current)" ]; then $MPCplay CUR_POS=$($MPC | tail -2 | head -1 | awk '{print $2}' | sed 's/#//' | awk -F/ '{print $1}') END_POS=$($MPC playlist | wc -l) $MPC add "$1" $MPC move $(($END_POS+1)) $(($CUR_POS+1)) $MPC play $(($CUR_POS+1)) #at least 1 song is in the playlist, determine the position of the #currently played song and add $1 after it else CUR_POS=$($MPC | tail -2 | head -1 | awk '{print $2}' | sed 's/#//' | awk -F/ '{print $1}') END_POS=$($MPC playlist | wc -l) $MPC add "$1" $MPC move $(($END_POS+1)) $(($CUR_POS+1)) $MPC play $(($CUR_POS+1)) fi } search_by_artist () { while true; do ARTIST="$($MPC list artist | sort -f | $ROFI)"; if [ "$ARTIST" = "" ]; then $ESC_ACTION; fi while true; do ALBUMS=$($MPC list album artist "$ARTIST" | sort -f); ALBUM=$(echo -e "replace all\nadd all\n--------------------------\n$ALBUMS" | $ROFI); if [ "$ALBUM" = "" ]; then $ESC_ACTION; elif [ "$ALBUM" = "replace all" ]; then CUR_SONG=$($MPC current) $MPC clear $MPC find artist "$ARTIST" | $MPC add if [ -n "$CUR_SONG" ]; then $MPC play; fi $ESC_ACTION elif [ "$ALBUM" = "add all" ]; then $MPC find artist "$ARTIST" | $MPC add $ESC_ACTION fi while true; do TITLES=$($MPC list title artist "$ARTIST" album "$ALBUM") TITLE=$(echo -e "replace all\nadd all\n--------------------------\n$TITLES" | $ROFI); if [ "$TITLE" = "" ]; then $ESC_ACTION elif [ "$TITLE" = "replace all" ]; then CUR_SONG=$($MPC current) $MPC clear; $MPC find artist "$ARTIST" album "$ALBUM" | $MPC add if [ -n "$CUR_SONG" ]; then $MPC play; fi $ESC_ACTION elif [ "$TITLE" = "add all" ]; then $MPC find artist "$ARTIST" album "$ALBUM" | $MPC add $ESC_ACTION fi while true; do DEC=$(echo -e "add after current and play\nadd after current\nreplace\nadd at the end" | $ROFI); case $DEC in "") $ESC_ACTION ;; "add after current and play") add_after_current_song_and_play "$($MPC find artist "$ARTIST" album "$ALBUM" title "$TITLE" | head -1 )" ;; "add after current") add_after_current_song "$($MPC find artist "$ARTIST" album "$ALBUM" title "$TITLE" | head -1 )" ;; "replace") CUR_SONG=$($MPC current) $MPC clear $MPC find artist "$ARTIST" album "$ALBUM" title "$TITLE" | head -1 | $MPC add if [ -n "$CUR_SONG" ]; then $MPC play; fi ;; "add at the end") $MPC find artist "$ARTIST" album "$ALBUM" title "$TITLE" | head -1 | $MPC add ;; esac $ESC_ACTION done done done done } search_by_track () { TITLE=$($MPC list title | sort -f | $ROFI) if [ "$TITLE" = "" ]; then exit; fi SONG=$($MPC find title "$TITLE" | head -1) add_after_current_song "$SONG" } search_by_track_play_now () { TITLE=$($MPC list title | sort -f | $ROFI) if [ "$TITLE" = "" ]; then exit; fi SONG=$($MPC find title "$TITLE" | head -1) add_after_current_song_and_play "$SONG" } play_playlist () { AVAIL_PLAYLISTS=$($MPC lsplaylists) PLAYLIST=$($MPC lsplaylists | $ROFI); if [ "$PLAYLIST" = "" ]; then exit; fi # Check if answer is in available playlists; otherwise exit # Prevents non-existant playlist from being added for PL in $AVAIL_PLAYLISTS do if [ "$PL" = "$PLAYLIST" ]; then CUR_SONG=$($MPC current) $MPC clear $MPC load "$PLAYLIST"; if [ -n "$CUR_SONG" ]; then $MPC play; fi fi done exit } jump_to_song () { TITLE=$($MPC playlist | $ROFI); if [ "$TITLE" = "" ]; then exit; fi POS=$($MPC playlist | grep -in "$TITLE" | awk -F: '{print $1}'| head -n 1) $MPC play $POS; } search_by_album () { while true; do ALBUM=$($MPC list album | sort -f | $ROFI); if [ "$ALBUM" = "" ]; then $ESC_ACTION; fi while true; do TITLES=$($MPC list title album "$ALBUM") TITLE=$(echo -e "replace all\nadd all\n--------------------------\n$TITLES" | $ROFI); if [ "$TITLE" = "" ]; then $ESC_ACTION elif [ "$TITLE" = "replace all" ]; then CUR_SONG=$($MPC current) $MPC clear; $MPC find album "$ALBUM" | $MPC add if [ -n "$CUR_SONG" ]; then $MPC play; fi $ESC_ACTION elif [ "$TITLE" = "add all" ]; then $MPC find album "$ALBUM" | $MPC add $ESC_ACTION fi while true; do DEC=$(echo -e "add after current and play\nadd after current\nreplace\nadd at the end" | $ROFI); case $DEC in "") $ESC_ACTION ;; "add after current and play") add_after_current_song_and_play "$($MPC find album "$ALBUM" title "$TITLE" | head -1 )" ;; "add after current") add_after_current_song "$($MPC find album "$ALBUM" title "$TITLE" | head -1 )" ;; "replace") CUR_SONG=$($MPC current) $MPC clear $MPC find album "$ALBUM" title "$TITLE" | head -1 | $MPC add if [ -n "$CUR_SONG" ]; then $MPC play; fi ;; "add at the end") $MPC find album "$ALBUM" title "$TITLE" | head -1 | $MPC add ;; esac $ESC_ACTION done done done } shuffle() { $MPC shuffle } control() { CHOICE=$(echo -e "Toggle Play\nNext\nPrevious\n"| $ROFI); if [ "$CHOICE" = "Toggle Play" ]; then $($MPC toggle); fi if [ "$CHOICE" = "Next" ]; then $($MPC next); fi if [ "$CHOICE" = "Previous" ]; then $($MPC prev); fi } display_help () { echo "-a, --artist search for artist, then album, then title" echo "-t, --track search for a single track in the whole database" echo "-n, --now search for a single track in the whole database and play it now" echo "-p, --playlist search for a playlist load it" echo "-j, --jump jump to another song in the current playlist" echo "-l, --longplayer search for album, then title" echo "-s, --shuffle shuffle songs" echo "-c, --control control the mpd daemon" echo "--auto choose option in rofi" } case $1 in -a|--artist) search_by_artist ;; -t|--track) search_by_track ;; -n|--now) search_by_track_play_now ;; -p|--playlist) play_playlist ;; -j|--jump) jump_to_song ;; -l|--longplayer) search_by_album ;; -s|--shuffle) shuffle ;; --auto) CHOICE=$(echo -e "By Artist\nBy Album\nBy Track\nBy Now\nJump\nShuffle\nControl"| $ROFI); if [ "$CHOICE" = "By Artist" ]; then search_by_artist; fi if [ "$CHOICE" = "By Album" ]; then search_by_album; fi if [ "$CHOICE" = "By Track" ]; then search_by_track; fi if [ "$CHOICE" = "By Now" ]; then search_by_track_play_now; fi if [ "$CHOICE" = "Jump" ]; then jump_to_song; fi if [ "$CHOICE" = "Shuffle" ]; then shuffle; fi if [ "$CHOICE" = "Control" ]; then control; fi exit ;; -c|--control) control ;; -h|--help) display_help ;; *) ## Apply auto option by default CHOICE=$(echo -e "By Artist\nBy Album\nBy Track\nBy Now\nJump\nShuffle\nControl"| $ROFI); if [ "$CHOICE" = "By Artist" ]; then search_by_artist; fi if [ "$CHOICE" = "By Album" ]; then search_by_album; fi if [ "$CHOICE" = "By Track" ]; then search_by_track; fi if [ "$CHOICE" = "By Now" ]; then search_by_track_play_now; fi if [ "$CHOICE" = "Jump" ]; then jump_to_song; fi if [ "$CHOICE" = "Shuffle" ]; then shuffle; fi if [ "$CHOICE" = "Control" ]; then control; fi exit ;; esac