dotfiles/.config/Scripts/rofi-mpd

248 lines
6.8 KiB
Bash
Executable File

#!/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
ROFI="rofi -dmenu -p 'Search : '"
addaftercurrent(){
#playlist is empty, just add the song
if [ "$(mpc -p 6600 playlist | wc -l)" == "0" ]; then
mpc -p 6600 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 -p 6600 current)" ]; then
mpc -p 6600 play
CUR_POS=$(mpc -p 6600 | tail -2 | head -1 | awk '{print $2}' | sed 's/#//' | awk -F/ '{print $1}')
END_POS=$(mpc -p 6600 playlist | wc -l)
mpc -p 6600 add "$1"
mpc -p 6600 move $(($END_POS+1)) $(($CUR_POS+1))
mpc -p 6600 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 -p 6600 | tail -2 | head -1 | awk '{print $2}' | sed 's/#//' | awk -F/ '{print $1}')
END_POS=$(mpc -p 6600 playlist | wc -l)
mpc -p 6600 add "$1"
mpc -p 6600 move $(($END_POS+1)) $(($CUR_POS+1))
fi
}
addaftercurrentandplay(){
#playlist is empty, just add the song
if [ "$(mpc -p 6600 playlist | wc -l)" == "0" ]; then
mpc -p 6600 add "$1"
mpc -p 6600 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 -p 6600 current)" ]; then
mpc -p 6600play
CUR_POS=$(mpc -p 6600 | tail -2 | head -1 | awk '{print $2}' | sed 's/#//' | awk -F/ '{print $1}')
END_POS=$(mpc -p 6600 playlist | wc -l)
mpc -p 6600 add "$1"
mpc -p 6600 move $(($END_POS+1)) $(($CUR_POS+1))
mpc -p 6600 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 -p 6600 | tail -2 | head -1 | awk '{print $2}' | sed 's/#//' | awk -F/ '{print $1}')
END_POS=$(mpc -p 6600 playlist | wc -l)
mpc -p 6600 add "$1"
mpc -p 6600 move $(($END_POS+1)) $(($CUR_POS+1))
mpc -p 6600 play $(($CUR_POS+1))
fi
}
case $1 in
-a|--artist)
while true; do
ARTIST="$(mpc -p 6600 list artist | sort -f | $ROFI)";
if [ "$ARTIST" = "" ]; then $ESC_ACTION; fi
while true; do
ALBUMS=$(mpc -p 6600 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 -p 6600 current)
mpc -p 6600 clear
mpc -p 6600 find artist "$ARTIST" | mpc -p 6600 add
if [ -n "$CUR_SONG" ]; then mpc -p 6600 play; fi
$ESC_ACTION
elif [ "$ALBUM" = "add all" ]; then
mpc -p 6600 find artist "$ARTIST" | mpc -p 6600 add
$ESC_ACTION
fi
while true; do
TITLES=$(mpc -p 6600 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 -p 6600 current)
mpc -p 6600 clear;
mpc -p 6600 find artist "$ARTIST" album "$ALBUM" | mpc -p 6600 add
if [ -n "$CUR_SONG" ]; then mpc -p 6600 play; fi
$ESC_ACTION
elif [ "$TITLE" = "add all" ]; then
mpc -p 6600 find artist "$ARTIST" album "$ALBUM" | mpc -p 6600 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")
addaftercurrentandplay "$(mpc -p 6600 find artist "$ARTIST" album "$ALBUM" title "$TITLE" | head -1 )"
;;
"add after current")
addaftercurrent "$(mpc -p 6600 find artist "$ARTIST" album "$ALBUM" title "$TITLE" | head -1 )"
;;
"replace")
CUR_SONG=$(mpc -p 6600 current)
mpc -p 6600 clear
mpc -p 6600 find artist "$ARTIST" album "$ALBUM" title "$TITLE" | head -1 | mpc -p 6600 add
if [ -n "$CUR_SONG" ]; then mpc -p 6600 play; fi
;;
"add at the end")
mpc -p 6600 find artist "$ARTIST" album "$ALBUM" title "$TITLE" | head -1 | mpc -p 6600 add
;;
esac
$ESC_ACTION
done
done
done
done
;;
-t|--track)
TITLE=$(mpc -p 6600 list title | sort -f | $ROFI)
if [ "$TITLE" = "" ]; then exit; fi
SONG=$(mpc -p 6600 find title "$TITLE" | head -1)
addaftercurrentandplay "$SONG"
;;
-p|--playlist)
PLAYLIST=$(mpc -p 6600 lsplaylists | $ROFI);
if [ "$PLAYLIST" = "" ]; then exit; fi
CUR_SONG=$(mpc -p 6600 current)
mpc -p 6600 clear
mpc -p 6600 load "$PLAYLIST";
if [ -n "$CUR_SONG" ]; then mpc -p 6600 play; fi
;;
-j|--jump)
TITLE=$(mpc -p 6600 playlist | $ROFI);
if [ "$TITLE" = "" ]; then exit; fi
POS=$(mpc -p 6600 playlist | grep -n "$TITLE" | awk -F: '{print $1}')
mpc -p 6600 play $POS;
;;
-l|--longplayer)
while true; do
ALBUM=$(mpc -p 6600 list album | sort -f | $ROFI);
if [ "$ALBUM" = "" ]; then $ESC_ACTION;
fi
while true; do
TITLES=$(mpc -p 6600 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 -p 6600 current)
mpc -p 6600 clear;
mpc -p 6600 find album "$ALBUM" | mpc -p 6600 add
if [ -n "$CUR_SONG" ]; then mpc -p 6600 play; fi
$ESC_ACTION
elif [ "$TITLE" = "add all" ]; then
mpc -p 6600 find album "$ALBUM" | mpc -p 6600 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")
addaftercurrentandplay "$(mpc -p 6600 find album "$ALBUM" title "$TITLE" | head -1 )"
;;
"add after current")
addaftercurrent "$(mpc -p 6600 find album "$ALBUM" title "$TITLE" | head -1 )"
;;
"replace")
CUR_SONG=$(mpc -p 6600 current)
mpc -p 6600 clear
mpc -p 6600 find album "$ALBUM" title "$TITLE" | head -1 | mpc -p 6600 add
if [ -n "$CUR_SONG" ]; then mpc -p 6600 play; fi
;;
"add at the end")
mpc -p 6600 find album "$ALBUM" title "$TITLE" | head -1 | mpc -p 6600 add
;;
esac
$ESC_ACTION
done
done
done
;;
-h|--help)
echo "-a, --artist search for artist, then album, then title"
echo "-t, --track search for a single track in the whole database"
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 "Usage: rofi-mpd [OPTION]"
echo "Try 'rofi-mpd --help' for more information."
;;
esac