Random Song Player

I have hundreds of CDs, and having ripped most of them to my hard drive, I have thousands of tracks available. It's an eclectic collection, including 80s, Jazz, Classical, Baroque, Romantic, Nuevo Flamenco, Guitar, Punk, Metal ... You get the general idea.

I had the idea one day to write a script that would continuously pick random songs and play them. So we have the Random Song Player. I'll get to the code in a moment. With a line in my window manager menu that looks like this: rxvt -bg black -fg white -fn 10x20 +sb -geometry 101x12 -e randSongForever I get a window that looks like this:

Or this:

Notice the incredible juxtapositions of musical style - not to everyone's taste.

Here's the code:


#!/bin/bash
#
#   randSongForever - Play random songs forever
#   created 20020202

clear

#   the following means we skip a song on CTRL-C
trap " killall mpg123 " INT
#   It also means you have to send a "kill" to fully kill it -
#   but if it's running in an xterm, killing the xterm will do the job

ResetColours="$(tput sgr0)"
#   15 usable colours:
DarkGrey="$(tput bold ; tput setaf 0)"
LightGrey="$(tput setaf 7)"
White="$(tput bold ; tput setaf 7)"
Red="$(tput setaf 1)"
LightRed="$(tput bold ; tput setaf 1)"
Green="$(tput setaf 2)"
LightGreen="$(tput bold ; tput setaf 2)"
Brown="$(tput setaf 3)"
Yellow="$(tput bold ; tput setaf 3)"
Blue="$(tput setaf 4)"
BrightBlue="$(tput bold ; tput setaf 4)"
Purple="$(tput setaf 5)"
Pink="$(tput bold ; tput setaf 5)"
Cyan="$(tput setaf 6)"
BrightCyan="$(tput bold ; tput setaf 6)"
numColours=15

function SelectColour {
	randColour="$(echo -e "scale=0 \n15*${RANDOM}/32767 \nquit" | bc)"
	Colour=$(echo -e "${DarkGrey}\n${LightGrey}\n${White}\n${Red}\n${LightRed}\n${Green}\n${LightGreen}\n${Brown}\n${Yellow}\n${Blue}\n${BrightBlue}\n${Purple}\n${Pink}\n${Cyan}\n${BrightCyan}" | awk 'NR=='${randColour}' {print $0}')
	echo -n ${Colour}
}

while $TRUE
do
	song=$(randsong)
	SelectColour
	echo ${Colour}$(eval basename ${song})${ResetColours}
	eval mpg321 "${song}" 2> /dev/null
	#sleep 3
done

The above calls "randsong," which is a script unto itself:

#!/bin/bash
#
#   randsong - Choose and play a random song or songs from my mp3s
#
#   Couldn't get awk to accept a variable (messing with those input
#   single quotes was causing problems), so I used head and tail
#
#   The current arrangement requires that you use:
#      eval mpg123 "$(randsong 3)"
#   for mpg123 to accept the output of this.
#
mp3dir="/home/giles/music/"
numMp3s="$(find ${mp3dir} -name "*.mp3" -print | wc -l)"
if [ "x${1}" = "x" ]
then
	numOfPlays="1"
else
	numOfPlays="${1}"
fi

function SelectSong {
	randMp3="$(echo -e "scale=0 \n${numMp3s}*${RANDOM}/32767 \nquit" | bc)"
	mp3Name="$(echo "$(find ${mp3dir} -name "*.mp3" -print | awk 'NR=='${randMp3}' {print $0}')")"
	echo -n "\"${mp3Name}\" "
}

while [ "${numOfPlays}" -gt "0" ]
do
	SelectSong
	numOfPlays="$((${numOfPlays}-1))"
done


https://gilesorr.com/code/randsong.html 
by giles