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 |