皆さん、Raspberry Pi触ってますか? 僕は全然触ってません。でも、毎週時間になると、自動で『天たま』を再生してくれるので、大変助かっています。Raspberry Pi(僕の持ってるのはRaspberry Pi 2 Model Bというそうです)で、radikoの再生や録音をする方法はいろんなサイトに載ってますが、番組のキーワード予約をする方法があんまり載っていないようなので、僕が頑張って書きました。
スポンサーリンク
キーワード予約したい
有志の方々のスクリプトを見ると、どうやら簡単にradikoの番組表を取得できる模様。それなら、その番組表からキーワード検索して、自動で予約してほしい、そう思いますよね。それに、例えば野球中継で延長になったときとか、それに合わせて番組表が更新されれば、またその番組表から自動で予約してくれるわけですから、聞き逃すこともありませんよね。まあ、その点に関しては、半年間運用して、普通に聞き逃しているんですけどね。多分、そういう突発的なときって、番組表更新されてないんだと思います。
そういうわけで、あらかじめ指定したキーワードを使って、radikoからダウンロードした番組表を元に、自動で番組の予約をするスクリプトを書きました。
- cat /proc/version
- Linux version 3.18.7-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 – Linaro GCC 2014.03) ) #755 SMP PREEMPT Thu Feb 12 17:20:48 GMT 2015
- cat /etc/debian_version
- 7.8
data.dat
とりあえずtabで区切ってリストを作ります。放送局、キーワード、やりたいこと、という感じで。
QRR 竹達彩奈 Play
QRR 堀江由衣 PlayRecord
bookByKeywords.sh
このスクリプトの引数に、さっきのdata.datを渡すと良い感じです。
#!/bin/bash
# sort用に
LANG=en_US.UTF-8
reserv_table=$1
# 今の時刻取得
touch executed_time.dat
# 予約表の一行ごとに処理
cat ${reserv_table} | while read fileline
do
set -- ${fileline}
#$1 局
#$2 検索ワード
#$3 実行タイプ(Play | Record | PlayRecord)
stationID=$1
search_word=$2
runtype=$3
weektable=weektable\(${stationID}\).xml
# 一週間分の番組表を取得
# 複数キーワードで同じ局が指定されていた場合、
# 何度もダウンロードするのもアレなので
if [ ! -e ${weektable} -o executed_time.dat -nt ${weektable} ]; then
curl -s http://radiko.jp/v2/api/program/station/weekly?station_id=${stationID} \
> ${weektable}
fi
# 検索する
search_result=`echo "grep ${search_word}" \
| xmllint --shell ${weektable} \
| sed -n -e "s/^.*progs\[\(.*\)\].*prog\[\(.*\)\].*/\1 \2/p" \
| uniq`
# 検索結果に対して処理する
echo "${search_result}" | while read resultline
do
set -- ${resultline}
#$1 progs[x]
#$2 prog[x]
title=`echo "cat /radiko/stations/station/scd/progs[$1]/prog[$2]/title" \
| xmllint --shell ${weektable} \
| sed -n -e "s/^.*>\(.*\)<.*/\1/p" \
| sed -e "y/ \t\//___/" `
# ftはyyyymmddhhmmssで記述されているが
# atコマンドの時刻はhh:mm mmddyyで指定
ft=`echo "cat /radiko/stations/station/scd/progs[$1]/prog[$2]/@ft" \
| xmllint --shell ${weektable} \
| sed -n -e "s/^.*ft=\"..\(..\)\(....\)\(..\)\(..\).*/\3:\4 \2\1/p" `
dur=`echo "cat /radiko/stations/station/scd/progs[$1]/prog[$2]/@dur" \
| xmllint --shell ${weektable} \
| sed -n -e "s/^.*dur=\"\([^\"]*\)\".*/\1/p" `
# atコマンド整形
at_command="/bin/bash /home/pi/bin/rec_radiko.sh \
$stationID $(($dur + 60)) /home/pi/radio $title $runtype > /dev/null 2>&1"
# すでに同じ内容がatに登録されていないか
duplicate_flag=0
if [ `atq | wc -l` -gt 0 ]; then
all_jobs=`atq | cut -f1`
for atqline in ${all_jobs}
do
if [ "`at -c ${atqline} \
| sed -n -e "s%${at_command}%DUPLICATED%p" `" \
== "DUPLICATED" ]
then
duplicate_flag=1
break
fi
done
fi
# フラグ立たなかったらatに追加
if [ "${duplicate_flag}" == "0" ]; then
echo "${at_command}" \
| at "${ft}" - 1 minute
fi
done
done
# 一応けしとく
rm executed_time.dat
使い方
crontab -eで適当な時間に回すようにしましょう。結局、天たま用なので、僕は毎日21:45に実行してます。
45 21 * * * /home/pi/bookByKeywords.sh /home/pi/data.dat > /dev/null 2>&1
いかがでしょう
すでにお分かりかと思いますが、このスクリプトだけではradikoの再生や録音は出来ません。なぜなら、再生・録音するためのスクリプトは、すでにたくさんの方が素晴らしいスクリプトを書いているからです。途中にat_commandという変数がありますが、ここに各人思い思いの再生・録音スクリプトを記載していただければなと思います。おせっかいなことに、1分前に再生・録音スクリプトを開始するように設定してあり(81行目)、それに合わせて再生・録音時間も+60secしてあります(60行目)。
すごくがんばって書いたので、なんかの参考にしていただけると嬉しいです。また、例によって僕はlinux素人ですので、内容に間違いがあった場合は、素人にも分かるように説明していただけると修正できます。難しいことを言われても「はあ……。そうですか……。難しいんですね……」で終わってしまいますので、何卒ご理解とご協力を賜りたく、よろしくお願い申し上げます。
売り上げランキング: 55,078
見ていてとても参考になりました!びっくりするほど高度なスクリプトだと思います。
ひえー(>_<。)