radiko録音(ダウンロード) スクリプト配布

お勉強兼ねてpart1~3+αでスクリプト作ったので配布します

書き方が汚いのは許してください…

(追記 2018/11/04)
このままだとATDSなAACが出来上がっちゃって、プレイヤーによっては再生できないので、
ffmpegのオプションに”-bsf:a aac_adtstoasc”を追加しました

【使い方】

./radiko.sh '[番組URL]'

[番組URL]部分は、radikoの番組表のリンクです

http://radiko.jp/#!/ts/TBS/2019010109000000 形式のURLです。

実行すると、放送局ID(TBSとかLFRとか)_放送開始時刻(yyyymmddhhss).aacでダウンロードされます。

※プレミアム会員の方は、mail/passを指定しておくと、エリアフリーでダウンロードできます。

#!/bin/sh
mail=""
pass=""
app="pc_html5"
version="0.0.1"
user="dummy_user"
device="pc"
key="bcd151073c03b352e1ef2fd66c32209da9ca0afa"

if [ $# -ne 1 ] ; then
  echo "Usage: ./radiko.sh 'URL'"
  echo "example ./radiko.sh 'http://radiko.jp/#!/ts/TBS/20180101090000'"
  exit 1
fi

if [ ${mail} ] && [ ${pass} ] ; then
  code=`curl -s -c cookie.txt -o /dev/null -w '%{http_code}' -d "mail=${mail}" -d "pass=${pass}" https://radiko.jp/ap/member/login/login`
  if [ ${code} -ne "302" ] ; then
    echo "Invalid E-mail or Password"
    rm -f cookie.txt
    exit 1
  fi
fi

param=(`curl -s -b cookie.txt -H "X-Radiko-App: ${app}" -H "X-Radiko-App-Version: ${version}" -H "X-Radiko-User: ${user}" -H "X-Radiko-Device: ${device}" -I -L https://r
adiko.jp/v2/api/auth1 | egrep -i 'X-Radiko-AuthToken:|X-Radiko-KeyLength:|X-Radiko-KeyOffset:' | sed -e 's/^.*: \([0-9a-zA-Z]\)/\1/ig'`)

authtoken=`echo -n ${param[0]} | sed -e "s/[\r\n]\+//g"`
keylength=`echo -n ${param[1]} | sed -e "s/[\r\n]\+//g"`
keyoffset=`echo -n ${param[2]} | sed -e "s/[\r\n]\+//g"`
partialkey=`echo -n ${key:${keyoffset}:${keylength}} | base64`

code=`curl -s -b cookie.txt -o /dev/null -w '%{http_code}' -H "X-Radiko-AuthToken: ${authtoken}" -H "X-Radiko-PartialKey: ${partialkey}" -H "X-Radiko-Device: ${device}"
-H "X-Radiko-User: ${user}" -s -L https://radiko.jp/v2/api/auth2`

echo "AuthToken : ${authtoken}"
echo "KeyLehgth : ${keylength}"
echo "KeyOffset : ${keyoffset}"
echo "PartialKey: ${partialkey}"
echo "HTTP code : ${code}"

if [ ${code} -ne "200" ] ; then
  echo 'Invalid AutoToken'
  exit
fi

station=`echo $1 | sed -e 's/http:\/\/radiko.jp\/#!\/ts\/\(.\+\)\/.*/\1/ig'`
date=`echo $1 | sed -e 's/http:\/\/radiko.jp\/#!\/ts\/\(.\+\)\/\([0-9]\{8\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\2/ig'`
hour=`echo $1 | sed -e 's/http:\/\/radiko.jp\/#!\/ts\/\(.\+\)\/\([0-9]\{8\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\3/ig' | sed -e 's/^0//g'`
ft=`echo $1 | sed -e 's/http:\/\/radiko.jp\/#!\/ts\/\(.\+\)\/\([0-9]\{14\}\)/\2/ig'`
if [ ${hour} -lt 5 ] ; then
  date=`date --date "${date} 1 days ago" +%Y%m%d`
fi
to=`curl -s "http://radiko.jp/v3/program/station/date/${date}/${station}.xml" | egrep -i "ft=\"${ft}" | sed -e 's/.*to="\([0-9]\{14\}\).*/\1/ig'`
url="https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=${station}&l=15&ft=${ft}&to=${to}"
echo "Station   : ${station}"
echo "From      : ${ft}"
echo "To        : ${to}"
echo "URL       : ${url}"

ffmpeg -headers "X-Radiko-AuthToken: ${authtoken}" -y -i "${url}" -bsf:a aac_adtstoasc -acodec copy "${station}_${ft}.m4a"

curl -s -b cookie.txt -o /dev/null https://radiko.jp/ap/member/webapi/member/logout

rm -f cookie.txt

exit 0