【net】VPSでRadikoを自動録音の巻@ラジオ難民
さまざまな方が挑戦しているので、かなりの後出しなのですが、なんとか成功しました。結構、メンドかったです。ラジコ側の仕様変更もあるらしい。
とりあえず、ここでは2011/7/20段階での成功例です。すでに、数本の録音に成功してます。
環境は、Saases Osukini-LT VPS(CentOS/32bit/512MB)です。
wget http://rtmpdump.mplayerhq.hu/download/rtmpdump-2.3.tgz
tar -xzf rtmpdump-2.3.tgz
cd rtmpdump-2.3
make SYS=posix
yum install openssl-devel
make SYS=posix
cp -p rtmpdump rtmpgw rtmpsrv rtmpsuck /usr/local/bin
※メモして無かったので、historyをそのまま記載。
rtmpdumpをwgetしてきて、そのまま/usr/local/binにコピー。なんで、openssl-develが出てくるんだ?多分、必要だったに違いない(;´Д`)
最終的に利用させていただくスクリプトで必要になってくるswftoolsを導入しないといけません(radikoストリームから情報を解析するためのようです)
このswftoolsが鬼門です。何度もコンパイルしてはエラーの繰り返し、その記録。
以下のものが現時点での最新のようです。もちろんCentOS用のパッケージなんてありません。
wget http://www.swftools.org/swftools-0.9.1.tar.gz
INSTALLに書かれてる手順で進むと、jpeglib ungif freetype gif_lib.hなんやらと注意されコンパイルが正常にいきません。
jpeglibが足りないようですので以下からゲットし、install.txtにある手順に従います。
./configure –enable-shared
lv install.txt
make
make test
make install
ですが、swftoolsでjpeglib.soが見えていない(後述)
giflibは、SourceForgeのこちらでした。
通常手順にて問題無し。./configure,make,make install
だが、駄目でした(;・∀・)
./configure –enable-sharedと引数を付けないと駄目だったみたいでした。
再度、SWFTOOLSの構築をし直します。・・・でも、うまくいかない。
ヤケになって、yumでパッケージを探したら、在るじゃないですか!
yum install giflib
freeypeは既にインストール済みでした。必要なのは開発用コードのものです。
yum install freetype-devel
コードの問題でエラーが出てます。SIZEOF辺りを手で直しました(もう~こういうのヤメて)
configureでうまく環境の解析に失敗してしまっているようでした。
#define SIZEOF_SIGNED_CHAR 0
#define SIZEOF_SIGNED_SHORT 0
#define SIZEOF_SIGNED 0
#define SIZEOF_SIGNED_LONG_LONG 0
#define SIZEOF_VOIDP 0
/* Define if you have the ANSI C header files. */
/* #undef STDC_HEADERS */
/* Define if your <sys/time.h> declares struct tm. */
/* #undef TM_IN_SYS_TIME */
/* Define if you have the time() function */
#define HAVE_TIME 1
※ちゃんとメモしてなかったので、この画像とコードで判断してください。すいません。
再度makeしますが、今度は、G++がねぇぞと怒られます。
なぜ、ここでG++が必要になるのか、まったく不可解なのですが、これもインストールします。
yum install gcc-c++
これでSWFTOOLSで、makeすると、エラー無くコンパイル終了。
make installで、なにやらsimple_viewerなんちゃらでエラーが出たが、一通りコピーできてるようなのでスルーする。すげー時間掛けちゃったので、もう勘弁して。
んで、続けて変換のためのffmpegが必要になります(FLVのままでOKなら不必要)
具具ってみると、ジョブチェンジしたらしくLibavという名称に変更したらしいです。現在の最新はこれだった。更新は激しいので注意が必要のようです。
wget http://www.ffmpeg.org/releases/ffmpeg-0.8.tar.gz
しかしながら、libgif/libjpeg.soが見えていないようで、実行時にエラーになってしまう。
/usr/libには存在してるのに、なんでだろ、と思ったら/usr/local/libに気付く。
確かに、configureではlibjpeg.so.8を認識してるのに、/usr/libにはlibjpeg.so.6が入ってた。
/etc/ld.so.confに以下を追加し、/sbin/ldconfigを実行して更新。
/usr/local/lib
ここまでで前作業(必要なコマンドインストール)は完了です。
ネット上にあるスクリプトを試してみるが、これがどうにもうまく動かない。
どこかのブログに記載されたコードで成功しました。まずいアドレスメモるの忘れてた!ごめんなさい。
一応以下に掲載します(なんかffmpegが動かないのでFLVで保存)
#!/bin/bash
PATH=${PATH}:/usr/local/bin
RECTIMEMIN=$1
CHANNEL=$2RTMPDUMP=/usr/local/bin/rtmpdump
RTMPDUMPOPT="-# -s http://radiko-dl.ssdl1.smartstream.ne.jp/radiko-dl/1.1/player/player_0.1.2.swf -vr rtmpe://radiko.smartstream.ne.jp/$CHANNEL/_defInst_/simul-stream"
FFMPEG=/usr/bin/ffmpeg
FFMPEGOPT="-acodec libmp3lame -ar 22050 -ab 32k"OUTFILEBASEPATH=(出力先、FLVの他にファイルが出来ます)
FLVFILEEXT=".flv"
MP3FILEEXT=".mp3"MARGINTIMEMIN=1
OUTFLVFILENAME=$OUTFILEBASEPATH/$CHANNEL-`date +%Y%m%d_%H%M`
OUTMP3FILENAME=$OUTFILEBASEPATH/$CHANNEL-`date +%Y%m%d_%H%M`
RECTIME=`expr $RECTIMEMIN * 60 + $MARGINTIMEMIN * 2 * 60`nowtime=`date +%s`
endtime=$((nowtime + RECTIME))playerurl=http://radiko.jp/player/swf/player_2.0.1.00.swf
playerfile=./player.swf
keyfile=./authkey.pngcd $OUTFILEBASEPATH
filecount=0
while [ $nowtime -lt $endtime ]
do
flv=$OUTFLVFILENAME’_’$filecount$FLVFILEEXT
rec=$((endtime – nowtime))
#
# 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 swftool)
#
if [ ! -f $keyfile ]; then
swfextract -b 5 $playerfile -o $keyfile
if [ ! -f $keyfile ]; then
echo "failed get keydata"
exit 1
fi
fi
if [ -f auth1_fms ]; then
rm -f auth1_fms
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=’rn’
–no-check-certificate
–save-headers
https://radiko.jp/v2/api/auth1_fms
if [ $? -ne 0 ]; then
echo "failed auth1 process"
exit 1
fi
#
# get partial key
#
authtoken=`perl -ne 'print $1 if(/x-radiko-authtoken: ([w-]+)/i)’ auth1_fms `
offset=`perl -ne 'print $1 if(/x-radiko-keyoffset: (d+)/i)’ auth1_fms`
length=`perl -ne 'print $1 if(/x-radiko-keylength: (d+)/i)’ auth1_fms`
partialkey=`dd if=$keyfile bs=1 skip=${offset} count=${length} 2> /dev/null | base64`
echo "authtoken: ${authtoken} offset: ${offset} length: ${length} partialkey: $partialkey"
rm -f auth1_fms
if [ -f auth2_fms ]; then
rm -f auth2_fms
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=’rn’
–no-check-certificate
https://radiko.jp/v2/api/auth2_fms
if [ $? -ne 0 -o ! -f auth2_fms ]; then
echo "failed auth2 process"
exit 1
fi
echo "authentication success"
areaid=`perl -ne 'print $1 if(/^([^,]+),/i)’ auth2_fms`
echo "areaid: $areaid"
rm -f auth2_fms
#
# rtmpdump
#
rtmpdump -v
-r "rtmpe://radiko.smartstream.ne.jp"
–playpath "simul-stream"
–app "${CHANNEL}/_defInst_"
-W $playerurl
-C S:"" -C S:"" -C S:"" -C S:$authtoken
–live
-B $rec -o $flv -#
# $RTMPDUMP $RTMPDUMPOPT -B $rec -o $flv
filecount=$((filecount + 1))
nowtime=`date +%s`
donelc=0
while [ $lc -lt $filecount ]
do
flv=$OUTFLVFILENAME’_’$lc$FLVFILEEXT
mp3=$OUTMP3FILENAME’_’$lc$MP3FILEEXT
#$FFMPEG -i $flv $FFMPEGOPT $mp3 2> /dev/null なぜか動かないのでコメント
#cat $mp3 >> $OUTMP3FILENAME$MP3FILEEXT
chmod 555 $flv 誰でもいじれるようにモード変更
lc=$((lc + 1))
done
これを設置したら(/usr/local/bin)、あとはこれをcronで自動起動するようにします。
crontab -e
#crontab
59 0 * * 2-7 /usr/local/bin/radiko_rec.sh 120 TBS
詳しい書き方は他のサイトを見てもらう事にして、上記は、平日深夜1:00から3:00までの2時間を、TBSラジオ(ラジオJUNK)を、自動録音します(実際は、前後に1分余裕をつけてるので、12:59からとなってる)
sambaサーバを入れておけば、簡単にアクセスできるので便利(VPN経由)
考察、CentOSへは結構大変な手順でした。もっと簡単に実現したいなら、VPSにProxyサーバになってもらって、Windowsから自動録音した方(録音ソフトが沢山ある)が楽かもしれない。まぁ、節電対策に逆行してますけど。