2012年2月12日日曜日

radiko録音サーバ構築(debian6.0)

せっかく常時起動しているサーバがあるんだから、
ラジオサーバとしても使いたいよねってことでradiko録音サーバを
構築しました。電波状況に左右されないのが素敵。
まあ若干グレー感な気はしないでもないけど(´・ω・`)

ともかく作業をはじめる。
ビルドの前に、依存関係のあるパッケージ

  • zlib1g-dev
  • libgnutls-dev
  • libjpeg62-dev

を予めインストールしておく。
debian-sv# apt-get install zlib1g-dev libgnutls-dev libjpeg62-dev
・RTMPDumpのインストール
debian-sv# git clone git://git.ffmpeg.org/rtmpdump
debian-sv# cd rtmpdump
debian-sv# make
debian-sv# make install
起動確認。OKっぽい。
debian-sv# rtmpdump
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
ERROR: You must specify a hostname (--host) or url (-r "rtmp://host[:port]/playpath") containing a hostname
・swftoolsのインストール
debian-sv# wget http://www.swftools.org/swftools-0.9.1.tar.gz
debian-sv# tar -xzvf swftools-0.9.1.tar.gz
debian-sv# cd swftools-0.9.1
debian-sv# ./configure
debian-sv# make
debian-sv# make install
swfextract で起動確認してみる。OK!
debian-sv# swfextract
Usage: swfextract [-v] [-n name] [-ijf ids] file.swf
 -v , --verbose    Be more verbose
 -o , --output filename   set output filename
 -V , --version    Print program version and exit

SWF Subelement extraction:
 -n , --name name   instance name of the object (SWF Define) to extract
 -i , --id ID    ID of the object, shape or movieclip to extract
 -f , --frame frames   frame numbers to extract
 -w , --hollow    hollow mode: don't remove empty frames
                  (use with -f)
 -P , --placeobject    Insert original placeobject into output file
                  (use with -i)
SWF Font/Text extraction:
 -F , --font ID    Extract font(s)
Picture extraction:
 -j , --jpeg ID    Extract JPEG picture(s)
 -p , --pngs ID    Extract PNG picture(s)

Sound extraction:
 -m , --mp3    Extract main mp3 stream
 -s , --sound ID    Extract Sound(s)
次は、スクリプトの作成にとりかかる。
スクリプトは、参考サイト→YAMA'S MEMORANDUM:RTMPDUMPによるradikoの録音
で公開されていたシェルスクリプトを元にして作成することにした。
で、出来上がったのがこれ。
#!/bin/bash

#date=`date '+%Y-%m-%d-%H:%M'`
date=`date '+%Y-%m-%d'`
cachedir=/var/cache/radiko/
mp3dir=/mnt/share/radio/
playerurl=http://radiko.jp/player/swf/player_3.0.0.01.swf
playerfile="./player.swf"
keyfile="./authkey.png"
tmpfile="./${1}_${date}"

if [ $# -ge 2 ]; then
  station=$1
  DURATION=`expr $2 \* 60`
  mp3file="${station}_${3}_${date}.mp3"
  if [ $# -eq 4 ]; then
    delaysec=$4
  else
    delaysec=0
  fi
else
  echo "usage : radiorec station_name duration(minuites) title [offset(sec)]"
  exit 1
fi

cd $cachedir

#
# 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 14 $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='\r\n' \
     --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} \noffset: ${offset} length: ${length} \npartialkey: 

$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='\r\n' \
     --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

# offset time
echo "Sleep ${delaysec} sec."
sleep $delaysec

#
# rtmpdump
#
xml_channel=``

/usr/local/bin/rtmpdump -v \
         -r "rtmpe://w-radiko.smartstream.ne.jp" \
         --playpath "simul-stream.stream" \
         --app "${station}/_definst_" \
         -W $playerurl \
         -C S:"" -C S:"" -C S:"" -C S:$authtoken \
         --live \
         --stop $DURATION \
         -o $tmpfile

/usr/bin/avconv -y -i $tmpfile -acodec libmp3lame -ab 64k $mp3file
cp $mp3file $mp3dir

rm $tmpfile
rm $mp3file
ほとんどパクリですすいません(´・ω・`)
で、こいつを /usr/local/share/radiko に突っ込んで、
debian-sv# mkdir /usr/local/share/radiko
debian-sv# cp radiorec.sh /usr/local/share/radiko
さらに /user/local/bin にシンボリックリンクを作成。
debian-sv# ln -s /usr/local/share/radiko/radiorec.sh /usr/local/bin/radiorec
そんで作業フォルダを /var/cache/radiko で作成、
パーミッションを全ユーザから読み書きできるよう変更した。
debian-sv# mkdir /var/cache/radiko
debian-sv# chmod 777 /var/cache/radiko
あとはこのスクリプトをcrontabに登録してやれば、
ラジオを自動的に録音できるようになる。
crontabの設定例はこんな感じ。
# 月曜JUNK 深夜の馬鹿力
59 0 * * 2 /usr/local/bin/radiorec hbc 120 30
作業終了! あとは月曜の夜を楽しみに待つだけだ( ^ω^)

0 件のコメント:

コメントを投稿