On Oct 27 07:56:51, Pawel S. Veselov wrote:
> >*Usually* (I know) it finishes OK, and the *ogg is a valid ogg stream.
> >In this failing case, it *also* is a valid ogg stream, but much
> >shorter than usual.
> >
> >So I suppose the background nc dies before I try to kill it myself
> >(that is, after sleeping for $LENGTH seconds).
> Since only happens infrequently, I'd start 'nc' under trace, and
> preserve the trace file in the case when 'kill' has nothing to kill.
> Trace file should show what 'nc' encountered on the network...
Thanks for the advice, Pawel - I did run nc(1) under ktrace(1), and
found that after (many) sucessfull calls of read(2), the next read(2)
call returns 0, upon which nc(1) exits.
As this is reading a streamed ogg, there are always more bytes
to be read - what are the possible reasons for read(2)ing on a socket
to return 0 (except EOF being read)? Can a network timeout cause this?
Thanks
Jan
#!/bin/sh
# A simple recorder of streaming internet radio.
# $1 is the station, $2 is length in seconds, $3 is the output file.
# If $3 is not given, it is invented from the station name and date.
# We suppose it's an ogg/mp3 FILE, reachable at a given PORT of a given HOST,
# which we HTTP GET. The response's HTTP header needs to be trimmed off.
# (FIXME: test for HTTP errors)
# Supported stations: add yours here
praha="http://amp1.cesnet.cz:8000/cro2.ogg"
vltava="http://amp1.cesnet.cz:8000/cro3.ogg"
#testfm="host.org:8000/some/path/script.cgi?stream:yes;file=name.ogg"
#testfm="http://stream.rozhlas.cz:8000/cro2_low.mp3"
usage() {
echo "usage : $0 station length [outfile]" 2>&1
echo "stations: praha vltava" 2>&1
}
eval URL=\$$1
test -n "$URL" || { usage ; exit 1 ; }
test $# -ge 2 || { usage ; exit 1 ; }
NC=`which nc 2>/dev/null`
test -x $NC || exit 1
STATION=${1}
SECONDS=${2}
OUTFILE=${3}
AUXFIFO="/tmp/radio.$$"
NCTRACE="/tmp/radio.$$.nc"
NCERROR=0
eval `echo $URL | sed \
-e "s,^http://,HOST='," \
-e "s,:,' ; PORT='," \
-e "s,/,' ; FILE='," \
-e "s,$,',"`
test -n "$OUTFILE" || OUTFILE="$STATION-`date +%Y%m%d%H%M%S`.${FILE##*.}"
test -e "$OUTFILE" && { echo "$OUTFILE already exists" >&2 ; exit 1 ; }
mkfifo $AUXFIFO || { echo "Cannot create output stream $AUXFIFO" >&2; exit 1; }
sed -n -e '1,/^
/!p' < $AUXFIFO > $OUTFILE &
{ echo "GET /$FILE HTTP/1.0" ; echo ; } \
| $NC $HOST $PORT > $AUXFIFO &
PID=$!
ktrace -p $PID -f $NCTRACE || {
echo "Cannot ktrace $PID ($NC)" >&2
NCERROR=1;
}
sleep $SECONDS
if ps -p $PID >/dev/null 2>&1 ; then
kill -9 $PID >/dev/null 2>&1
else
echo "$NC ($PID) is already dead (see $NCTRACE)" >&2
NCERROR=1
fi
test $NCERROR -eq 0 && rm -f $NCTRACE
rm -f $AUXFIFO
exit $NCERROR