ラジコの録音、東京の放送を取得する一案(8 録音スクリプト

サーバー接続してトークンを取得して録音するスクリプトを作ります。

大部分はネットから拾ってきたコードです。色々手を入れています。
とくに「get torken from server」の部分です。
ここで、クライアントを使って、サーバーにトークンを取りに行っています。

クライアントはこちら↓
サーバークライアントを試す

あと一部「mp3」と書いてありますが、aacのママとしています。
この方が音質もよくファイルサイズも小さいからです。これは知った時驚きました。
ファイルサイズは約3分の1で、しかもエンコードする時間も不要です。

また出力先を別で指定しているのは、
webアプリで簡単に視聴できるようにするためです。

#!/bin/sh

# TBS:TBSラジオ
# QRR:文化放送
# LFR:ニッポン放送
# NSB:ラジオNIKKEI
# INT:INTER FM
# FMT:TOKYO FM
# FMJ:J-WAVE
# JORF:ラジオ日本
# BAYFM78:bayfm78
# NACK5:NACK5
# YFM:FMヨコハマ

if [ $# -eq 3 ]; then
  OUTFILEPREFIX=$1
  RECTIMEMIN=$2
  CHANNEL=$3
else
  echo "usage : $0 OUTFILEPREFIX RECTIMEMIN CHANNEL"
  exit 1
fi

OUTFILEPREFIX=$1
RECTIMEMIN=$2
CHANNEL=$3

RTMPDUMP=/usr/local/bin/rtmpdump
FFMPEG=/usr/bin/ffmpeg
MP3PATH=[mp3を吐き出したいディレクトリ]

OUTFILEBASEPATH=[処理を実行するディレクトリ]
OUTFILENAME=${OUTFILEBASEPATH}/${OUTFILEPREFIX}_`date +%Y-%m-%d`
FLVFILEEXT=".flv"
AACFILEEXT=".aac"
MP3FILEEXT=".mp3"

MARGINTIMEMIN=1
RECTIME=`expr ${RECTIMEMIN} \* 60 + ${MARGINTIMEMIN} \* 2 \* 30`

# 30sec wait
echo "===== `date` Wait 30sec. ====="
for f1 in 2 1 0
do
  for f2 in 9 8 7 6 5 4 3 2 1 0
  do
    echo -n "$f1$f2\r"
    sleep 1
  done
done
echo `date` Start.

#開始時刻
START=`date +%s` 

cd ${OUTFILEBASEPATH}

playerurl=http://radiko.jp/player/swf/player_3.0.0.01.swf
playerfile=./player.swf
keyfile=./authkey.png

#
# get player
#
if [ ! -f $playerfile ]; then
  wget -q -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

#
# get torken from server
#
CRIENT=`./client.pl $CHANNEL`
echo $CRIENT
authtoken=`echo $CRIENT| cut -d ' ' -f2`

#
# rtmpdump
#
RETRYCOUNT=0
while :
do
  ${RTMPDUMP} -v \
              -r "rtmpe://f-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} \
              --stop ${RECTIME}
  RET=$?
  #録音終了
  END=`date +%s`
  SS=`expr ${END} - ${START}`
  if [ $SS -gt `expr $RECTIME - 30` ] ; then
      echo "OK... " $SS " > " $RECTIME "(-30)"
      
  else
      echo "NG... " $SS " <= " $RECTIME "(-30)" NOKORI=`expr $RECTIME - $SS` echo ./simple_rec_radiko.sh $OUTFILEPREFIX $NOKORI $CHANNEL # ------- echo *------------------- RECOVERY START ------------------------* echo *------------------- RECOVERY START -----`date`-------------* >> err.log 2>&1
      ./mail_err.sh
      ./simple_rec_radiko.sh $OUTFILEPREFIX $NOKORI $CHANNEL >> err.log 2>&1 &
      echo *------------------- RECOVERY E N D -----`date`-------------*
  fi

  if [ $RET -ne 1 -o `wc -c ${OUTFILENAME}${FLVFILEEXT} | awk '{print $1}'` -ge 10240 ]; then
    echo RETURN ... $RET 
    echo `wc -c ${OUTFILENAME}${FLVFILEEXT} | awk '{print $1}'`
    break
  elif [ ${RETRYCOUNT} -ge 5 ]; then
    echo "failed rtmpdump"
    exit 1
  else
    RETRYCOUNT=`expr ${RETRYCOUNT} + 1`
  fi
done

echo `date` MP3 Encode Start.

${FFMPEG} -y -i "${OUTFILENAME}${FLVFILEEXT}" -vn -acodec copy "${OUTFILENAME}${AACFILEEXT}"
# ${FFMPEG} -y -i "${OUTFILENAME}${FLVFILEEXT}" -acodec libmp3lame -ab 128k "${OUTFILENAME}${MP3FILEEXT}"

echo `date` MP3 Encode E n d.

# mv ${OUTFILENAME}${MP3FILEEXT}   ${MP3PATH}
mv ${OUTFILENAME}${AACFILEEXT}   ${MP3PATH}

rm -f ${OUTFILENAME}${FLVFILEEXT}

echo "===== `date` E n d. ====="