Skip to content

Instantly share code, notes, and snippets.

@m-ueno
Created October 16, 2014 14:15
Show Gist options
  • Save m-ueno/8c11c27a79ebc655ee8b to your computer and use it in GitHub Desktop.
Save m-ueno/8c11c27a79ebc655ee8b to your computer and use it in GitHub Desktop.
#!/bin/bash
set -xeu
LOGDIR=/masaru/logs
exec > >(tee ${LOGDIR}/radiko_$(date +%Y-%m-%d_%H%M).log)
exec 2>&1
if [ $# -lt 3 ]; then
echo "usage : $0 station RECTIMEMIN title"
exit 1
fi
CHANNEL=$1
RECTIMEMIN=$2
OUTFILEPREFIX=$3
OUTFILEBASEPATH=${4:-/home/share/podcast/radiko}
RTMPDUMP=/usr/bin/rtmpdump
FFMPEG=/usr/bin/ffmpeg
OUTFILENAME=${OUTFILEBASEPATH}/${OUTFILEPREFIX}_`date +%Y-%m-%d_%H%M`
FLVFILEEXT=".flv"
AACFILEEXT=".aac"
MP3FILEEXT=".mp3"
# 1->AAC, 2->MP3
OUTFILETYPE=1
RECTIME=`expr ${RECTIMEMIN} \* 60`
mkdir -p ${OUTFILEBASEPATH}
cd ${OUTFILEBASEPATH}
#playerurl=http://radiko.jp/player/swf/player_3.0.0.01.swf
playerurl=http://radiko.jp/player/swf/player_4.1.0.00.swf
playerfile=./player.swf
keyfile=./authkey.png
#
# get player
#
if [ ! -f $playerfile ]; then
wget -q --tries 5 -O $playerfile $playerurl
if [ $? -ne 0 ]; then
echo "failed get player"
exit 1
fi
fi
#
# get keydata (need swftools)
#
if [ ! -f $keyfile ]; then
swfextract -b 14 $playerfile -o $keyfile
if [ ! -f $keyfile ]; then
echo "failed get keydata"
exit 1
fi
fi
if [ -f auth1_fms_${OUTFILEPREFIX}_${CHANNEL} ]; then
rm -f auth1_fms_${OUTFILEPREFIX}_${CHANNEL}
fi
#
# access auth1_fms
#
wget -q \
--header="pragma: no-cache" \
--header="X-Radiko-App: pc_1" \
--header="X-Radiko-App-Version: 2.0.1" \
--header="X-Radiko-User: test-stream" \
--header="X-Radiko-Device: pc" \
--post-data='\r\n' \
--no-check-certificate \
--save-headers \
--tries=5 \
--timeout=5 \
-O auth1_fms_${OUTFILEPREFIX}_${CHANNEL} \
https://radiko.jp/v2/api/auth1_fms
if [ $? -ne 0 ]; then
echo "failed auth1 process"
exit 1
fi
#
# get partial key
#
authtoken=`cat auth1_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/x-radiko-authtoken: ([\w-]+)/i)'`
offset=`cat auth1_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/x-radiko-keyoffset: (\d+)/i)'`
length=`cat auth1_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/x-radiko-keylength: (\d+)/i)'`
partialkey=`dd if=$keyfile bs=1 skip=${offset} count=${length} 2> /dev/null | base64`
echo "authtoken: ${authtoken} \noffset: ${offset} length: ${length} \npartialkey: $partialkey"
rm -f auth1_fms_${OUTFILEPREFIX}_${CHANNEL}
if [ -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL} ]; then
rm -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL}
fi
#
# access auth2_fms
#
wget -q \
--header="pragma: no-cache" \
--header="X-Radiko-App: pc_1" \
--header="X-Radiko-App-Version: 2.0.1" \
--header="X-Radiko-User: test-stream" \
--header="X-Radiko-Device: pc" \
--header="X-Radiko-Authtoken: ${authtoken}" \
--header="X-Radiko-Partialkey: ${partialkey}" \
--post-data='\r\n' \
--no-check-certificate \
--tries=5 \
--timeout=5 \
-O auth2_fms_${OUTFILEPREFIX}_${CHANNEL} \
https://radiko.jp/v2/api/auth2_fms
if [ $? -ne 0 -o ! -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL} ]; then
echo "failed auth2 process"
exit 1
fi
echo "authentication success"
areaid=`cat auth2_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/^([^,]+),/i)'`
echo "areaid: $areaid"
rm -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL}
#
# get stream-url
#
if [ -f ${CHANNEL}.xml ]; then
rm -f ${CHANNEL}.xml
fi
wget -q "http://radiko.jp/v2/station/stream/${CHANNEL}.xml"
stream_url=`echo "cat /url/item[1]/text()" | xmllint --shell ${CHANNEL}.xml | tail -2 | head -1`
url_parts=(`echo ${stream_url} | perl -pe 's!^(.*)://(.*?)/(.*)/(.*?)$/!$1://$2 $3 $4!'`)
rm -f ${CHANNEL}.xml
#
# rtmpdump
#
RETRYCOUNT=0
while :
do
# ${RTMPDUMP} -v \
# -r "rtmpe://w-radiko.smartstream.ne.jp" \
# --playpath "simul-stream.stream" \
# --app "${CHANNEL}/_definst_" \
# -W $playerurl \
# -C S:"" -C S:"" -C S:"" -C S:$authtoken \
# --live \
# --flv ${OUTFILENAME}${FLVFILEEXT} \
# --hashes \
# --stop ${RECTIME}
rtmpdump \
-r ${url_parts[0]} \
--app ${url_parts[1]} \
--playpath ${url_parts[2]} \
-W $playerurl \
-C S:"" -C S:"" -C S:"" -C S:$authtoken \
--live \
--flv ${OUTFILENAME}${FLVFILEEXT} \
--hashes \
--stop ${RECTIME}
if [ $? -ne 1 -o `wc -c ${OUTFILENAME}${FLVFILEEXT} | awk '{print $1}'` -ge 10240 ]; then
break
elif [ ${RETRYCOUNT} -ge 5 ]; then
echo "failed rtmpdump"
exit 1
else
RETRYCOUNT=`expr ${RETRYCOUNT} + 1`
sleep 1
fi
done
if [ ${OUTFILETYPE} -ne 2 ]; then
#AAC
${FFMPEG} -y -i "${OUTFILENAME}${FLVFILEEXT}" -vn -acodec copy "${OUTFILENAME}${AACFILEEXT}"
else
#MP3
${FFMPEG} -y -i "${OUTFILENAME}${FLVFILEEXT}" -vn -ab 96k "${OUTFILENAME}${MP3FILEEXT}"
fi
rm -f ${OUTFILENAME}${FLVFILEEXT}
sleep 30
MP4Box -noprog -ipod -add "$OUTFILENAME.aac" -new "$OUTFILENAME.m4a"
#eyeD3 -2 --to-v2.4 --set-encoding=utf8 --title="${OUTFILEPREFIX}_$(date +%m%d)" --year=$(date +%Y) "$OUTFILENAME.m4a"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment