stormbot/modules/sing/sing.sh

47 lines
2.1 KiB
Bash
Raw Normal View History

2016-09-03 18:28:43 -04:00
[ -f functions.sh ] && source functions.sh
userNick="$1"
shift
chan="$1"
shift
#get the lyric text into a variable
trackName="${@//:/ - }"
2016-09-27 11:31:25 -04:00
trackName="${@//Ö/o}"
2016-09-08 12:16:59 -04:00
# Try to work around some common tags that will fail to find lyrics.
2016-09-09 22:29:41 -04:00
trackName="${trackName//\//_}"
2016-09-03 18:28:43 -04:00
curl="$(command -v curl)"
2016-09-04 12:43:22 -04:00
trackName="$(echo "$trackName" | sed -e "s/ /_/g" -e 's/([[:print:]]*)//g' -e "s/['\/\.]//g" -e 's/&/and/g' -e 's/ö/o/g')"
2016-09-03 18:28:43 -04:00
artist="$(echo "${trackName,,}" | cut -d "-" -f 1 | sed -e 's/_$//' -e 's/^the_\(.*\)/\1_the/')"
song="$(echo "${trackName,,}" | cut -d "-" -f 2 | sed 's/^_//')"
lyricsUrl="http://www.lyricsmania.com/${song}_lyrics_${artist}.html"
lyricText="$($curl -s "$lyricsUrl" | grep -A 100 '<strong>Lyrics to ' | grep -B 100 '</div> <!-- lyrics-body -->' | tail -n +2 | head -n -2 | sed -e 's/<[^>]*>//g' -e 's/<br \/>/\n/g' -e 's/<\/div>.*//')"
#get the number of lines in the text
lyricMaxLines=$(echo "$lyricText" | wc -l)
#keep track of 10 line chunks of text for your starting point.
x=10
lyricStartLine=$x
while [[ $x -le $(($lyricMaxLines - 10)) ]] ; do
x=$((x + 10))
lyricStartLine="$lyricStartLine $x"
done
#pass the starting options through shuf so we can get our starting line
lyricStartLine=$(shuf -n 1 -e $lyricStartLine)
#we only need to do the head, tail manipulation if there's more than one line.
if [ $lyricMaxLines -gt 10 ] ; then
lyricText="$(echo "$lyricText" | tail -n $lyricStartLine | head -n 10)"
fi
#Make sure all white space is not an enter or vertical space of any kind.
lyricText="$(echo "$lyricText" | tr "[:space:]" " " | tr -s "[:space:]")"
#sometimes lyrics are just one long line with everything. If this happens, cut it down so it's not too long for the 512 character channel limit.
if [ ${#lyricText} -gt 412 ] ; then
lyricText="${lyricText:0:409}... "
2016-09-04 23:14:03 -04:00
lyricText="$(echo "$lyricText" | rev | cut -d " " -f 1- | rev)"
2016-09-03 18:28:43 -04:00
fi
2016-09-04 23:14:03 -04:00
lyricText="$(echo "$lyricText" | sed -e 's/try {.*//g' -e 's/ +_402_Show//g')"
2016-09-03 18:28:43 -04:00
#Display the lyric text
if [ ${#lyricText} -gt 15 ] ; then
2016-09-04 12:43:22 -04:00
act "$chan" "sings, '${lyricText}'"
2016-09-03 18:28:43 -04:00
else
msg "$chan" "Sorry $userNick: I couldn't find any lyrics for $@"
fi