【net】VPSでRadikoを自動録音の巻@ラジオ難民

サーバ構築cron,radiko,rtmpdump,swftools,ラジコ,自動録音

さまざまな方が挑戦しているので、かなりの後出しなのですが、なんとか成功しました。結構、メンドかったです。ラジコ側の仕様変更もあるらしい。

とりあえず、ここでは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=$2

RTMPDUMP=/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.png

cd $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`
done

lc=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から自動録音した方(録音ソフトが沢山ある)が楽かもしれない。まぁ、節電対策に逆行してますけど。

サーバ構築cron,radiko,rtmpdump,swftools,ラジコ,自動録音

Posted by nabe