Record Streaming Audio with Linux: Part I

Update: For a better solution check out this newer post

I happen to enjoy listening to Glenn Beck. The problem is that I can’t receive his weekday shows where I live. Even if I could receive his weekday show over the air, I wouldn’t hear most of it because I am busy working all day.

The solution: cron and mplayer with a little help from sox.

Here’s a sample script:

#!/bin/bash
# Use mplayer to capture the stream
# at $STREAM to the file $FILE

DATE=`date +%d-%b-%Y` # Save the date as DD-Mmm-YYYY
YEAR=`date +%Y` # Save just the year as YYYY

# Where you want the file saved. Leave off file extension
FILE=/home/shawn/PodCasts/Glenn_Beck_Show_$DATE

# The following file should be a playlist file such as .asf or .asx
# You can also create your own file with a URI and put it here
STREAM=/home/shawn/bin/glenn_beck_show-6-9am
DURATION=3.1h # enough to catch the show, plus a bit
#DURATION=200s # a quick run, just for testing

# For the id3v2 Tags
AUTHOR="Glenn Beck"
ALBUM="104.7 WPGB-FM Pittsburgh"
TITLE="Glenn Beck Show - $DATE"

# Capture Stream
/usr/bin/mplayer -really-quiet -cache 500 \
-ao pcm:file="$FILE.wav" -vc dummy -vo null \
-playlist $STREAM &
# the & turns the capture into a background job
sleep $DURATION # wait for the show to be over
kill $! # kill the stream capture

# remove gaps and convert to mono
sox $FILE.wav -c 1 $FILE-silenced.wav \
silence 1 -0.9 2% -1 -0.9 2% ;
rm $FILE.wav ; #remove original capture

# Encode to .mp3, mono 32kHz 32kb/s, and tag the file
lame -a -m m --tt "$TITLE" --ta "$AUTHOR" \
--tl "$ALBUM" --ty "$YEAR" --vbr-new -V 9 \
--resample 32 $FILE-silenced.wav $FILE.mp3 ;
rm $FILE-silenced.wav # Remove the raw audio data file

Once all of the variables have been set, make this executable and make a cron job for it.
crontab -e

Here’s an example for starting at 6am every weekday:
0 6 * * 1-5 /home/shawn/bin/glenn_beck.sh >& /dev/null

Notes

  • The basis for this script is the one found at this Linux Journal article.
  • You need at least SoX version 12.17.9 for the silence filter to work properly.
  • MPlayer should be fairly recent. Older versions have a different syntax for pcm (wav) audio output
  • This solution still requires huge amounts of disk space (~500MB/hour). I am still experimenting with using named pipes (fifos) to do all of the file processing in RAM and only output the final encoded file to the disk.