Category: Linux

Viruses and Spyware Drive Mom to Consider Alternate OS

My Mom called me tonight with a question: how much does it cost to get a legal copy of Windows on my computer? She bought a computer from a guy who builds them for people out of his house. He apparently didn’t inform her that part of the cost-savings in this PC was due to the unpaid Windows Tax.

She is not eligible for an upgrade version and she does not have money to spend on software. I have used Slackware Linux for about three years on all of my machines. She trusts my judgement, and so she asked me what she needed to do to try Linux. I sent her a torrent to download the latest Ubuntu Live CD and told her how she can “test drive” Linux without having to lose any of her settings she’s got now.

She hasn’t had a chance to try it out yet, but she sounds interested. Assessing her needs, Ubuntu seems like a nice fit. I may have to customize it a bit for her so she can watch divx movies and listen to MP3s, but I think she will be happy with her new OS. I’ll update with more information as to how she likes it and what the shortcomings might be.

Record Streaming Audio with Linux: Part II

I said I was looking into getting FIFOs working so that the filesize requirements would be reduced. It’s also more efficient this way. I was heavily influenced by the two scripts created by Daniel Howard.

So here’s how it works. You get to create two scripts. The first one is for recording. It’s an all-purpose script that I called record.sh. Here is the code:
[bash]#!/bin/bash
#
# record.sh
#
# Use mplayer to capture the stream
# at $STREAM to the file $FILE
#
# example: record.sh my_radio_show 60 mms://someserver.com/stream

DIR=/home/shawn/PodCasts #directory where to save the file
TEMPDIR=/tmp

# Don’t edit anything below this line
#######################################################
DATE=`date +%d-%b-%Y` # Save the date as DD-Mmm-YYYY
YEAR=`date +%Y` # Save just the year as YYYY
NAME=$1
DURATION=$2 # enough to catch the show, plus a bit
STREAM=$3
TEMPFILE=$TEMPDIR/$NAME-$DATE
FILE=$DIR/$NAME-$DATE # Where to save it

# Capture Stream
mkfifo $TEMPFILE.wav
mkfifo $TEMPFILE-silenced.wav

# The lame settings below are optimized for voice encoding
# The sox command below strips out any silent portions
lame -S -a -m m –ty “$YEAR” –vbr-new -V 9 –lowpass 13.4 –athaa-sensitivity 1 \
–resample 32 $TEMPFILE-silenced.wav $FILE.mp3 >/dev/null &
sox $TEMPFILE.wav -c 1 $TEMPFILE-silenced.wav \
silence 1 0.2 0.5% -1 0.2 0.5% >/dev/null&
/usr/bin/mplayer -quiet -cache 500 \
-ao pcm:file=”$TEMPFILE.wav” -vc dummy -vo null \
-noframedrop $STREAM >/dev/null&

sleep 5
# get the pid of all processes started in this script.
PIDS=`ps auxww | grep $TEMPFILE | awk ‘{print $2}’`

# the & turns the capture into a background job
sleep `echo ${DURATION}*60 | bc` # wait for the show to be over
kill $PIDS # kill the stream capture
rm $TEMPFILE.wav
rm $TEMPFILE-silenced.wav[/bash]
This script takes three args:

  1. the name of the show you’re recording. This will be used in the final filename with the current date appended.
  2. the length of the show in minutes
  3. the URI of the stream (often mms:// or http://)

This integrates very well with another script that will hold all the data for the shows we want to record and automatically set the start times for us. Here is my script that I called today.sh
[bash]#!/bin/sh
#
# today.sh — schedule what programs you want to rip today using the
# recorder script.

# Non-obvious paths
RECORDER=$HOME/bin/record.sh
RECORDER_HI=$HOME/bin/record-hi.sh

# Set up stations
KFI=”http://a814.l1977144512.c19771.g.lm.akamaistream.net/D/814/19771/v0001/reflector:44512?MSWMExt=.asf”
WXNT=mms://wmc1.liquidviewer.net/WXNT
WPGB=”http://84.53.144.36:80/D/1046/20063/v0001/reflector:43803?MSWMExt=.asf”
KOZZ=mms://lotusradio-kozz.wm.llnwd.net/lotusradio_kozz

# What day is it?
TODAY=`date +%a`

# EVERY DAY
#everyday() {}

# WEEKDAYS
weekday() {
# “Record John_Ziegler for three hours, starting at 7:00pm.”
echo $RECORDER John_Ziegler 180 $KFI | at 7:00pm
echo $RECORDER Glenn_Beck 180 $WPGB | at 6:00am
}

# MONDAY
if [ $TODAY = "Mon" ]; then
# everyday
weekday
fi

# TUESDAY
if [ $TODAY = "Tue" ]; then
# everyday
weekday
fi

# WEDNESDAY
if [ $TODAY = "Wed" ]; then
# everyday
weekday
fi

# THURSDAY
if [ $TODAY = "Thu" ]; then
# everyday
weekday
fi

# FRIDAY
if [ $TODAY = "Fri" ]; then
# everyday
weekday
fi

# SATURDAY
if [ $TODAY = "Sat" ]; then
# everyday
echo $RECORDER Handel_On_The_Law 300 $KFI | at 6:00am
echo $RECORDER Dr_Dean_Edell 60 $KFI | at 2:00pm
fi

# SUNDAY
if [ $TODAY = "Sun" ]; then
# everyday
echo $RECORDER Jesus_Christ_Show 180 $KFI | at 6:00am
echo $RECORDER Glenn_Beck 180 $WPGB | at 10:00am
echo $RECORDER_HI Dr_Demento 120 $KOZZ | at 10:00pm
fi[/bash]
Using this as a template you might notice another script being referred to. record.sh has audio processing optimized for talk radio. For higher quality and stereo, you need to change a few things. You can download all of the scripts mentioned here at the bottom of this post.

To finish off this solution you need to run today.sh at some point after 12:00am and before the start of the earliest program you wish to record. I set mine to run daily at 1:00am.
[code]# Schedule recordings for today from radio streams
0 1 * * * /home/shawn/bin/today.sh >& /dev/null[/code]

Downloads:

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.

links for 2006-02-27

Dell BIOS Updates

I find it increasingly preposterous that the BIOS updates I want to install are distributed in the form of executables with floppy disc images buried within them. I really would find it a lot more useful if they would allow you to download just the image files. Then I’d be able to use dd on *NIX machines to write floppies.

Of course, this is all rather interesting considering that the laptop I wish to flash to BIOS on doesn’t even have a floppy drive, but that’s another point altogether.