動機
インターネットラジオを自動で取得する方法は幾つか提供されています。
音泉ダウンロード支援ツールは便利ですが、
週に一回、Windows PCを起動するのも面倒だなー、と思っていて、
常時起動しているNASとかラズパイで何とかしたいな、が発端です。
crontabからスクリプトを定期で呼び出すだけにしたいのです。
自動取得スクリプト
#!/bin/bash
KEYWORD=("かもさん" "内田彩の")
LINE_TOKEN=""
WORK_DIR="./"
function onsen_download(){
TARGET=$1
### ワード検索(タイトル)
target_title=`cat ./index.html | jq -r '.[].title' | grep ${TARGET}`
if [ "${target_title}" = "" ] ; then
echo "no title."
return 0
fi
### 最新話パラメータ取得
title=`cat ./index.html | jq -r --arg a "${target_title}" '.[] | select(.title == $a) | .contents[0].title'`
poster_image_url=`cat ./index.html | jq -r --arg a "${target_title}" '.[] | select(.title == $a) | .contents[0].poster_image_url'`
streaming_url=`cat ./index.html | jq -r --arg a "${target_title}" '.[] | select(.title == $a) | .contents[0].streaming_url'`
guests=`cat ./index.html | jq -r --arg a "${target_title}" '.[] | select(.title == $a) | .contents[0].guests[]'`
performers=`cat ./index.html | jq -r --arg a "${target_title}" '.[] | select(.title == $a) | .performers[].name'`
delivery_date=`date "+%Y"`
delivery_date+="年"
delivery_date+=`cat ./index.html | jq -r --arg a "${target_title}" '.[] | select(.title == $a) | .contents[0].delivery_date' | sed -e 's/\//月/g'`
delivery_date+="日"
track_no=`echo ${title} | sed -e 's/[^0-9]//g'`
if [ "${guests}" != "" ] ; then
guest_title=" ゲスト:${guests}"
guest_option="ゲスト:${guests}"
else
guest_title=""
guest_option=""
fi
filename="${target_title} ${title} ${delivery_date}放送${guest_title}.m4a"
### ダウンロード済確認
downloded=`grep -s "${filename}" ./downloaded.txt`
if [ "${downloded}" != "" ] ; then
echo "Already downloaded."
return 0
fi
### カバーアート取得
wget -O "${target_title} ${title} ${delivery_date}放送${guest_title}.jpg" ${poster_image_url}
### ストリーム取得
ffmpeg -headers "Referer: https://www.onsen.ag/" -i ${streaming_url} ${codec_option} -acodec copy -bsf:a aac_adtstoasc "${filename}"
mv ./"${filename}" ./"${filename}.org"
ffmpeg -i "${filename}.org" -i "${target_title} ${title} ${delivery_date}放送${guest_title}.jpg" -map 0:a -map 1:v -disposition:1 attached_pic -metadata "title=${target_title} ${title}" -metadata "artist=${performers}" -metadata "comment=${guest_option}" -metadata "album=${target_title}" -metadata "track=${track_no}" -metadata "date=${delivery_date}" -c copy "${filename}"
rm ./*.org ./*.jpg
echo "${filename}" >> ./downloaded.txt
### LINE通知
if [ "${LINE_TOKEN}" != "" ] ; then
curl -X POST -H "Authorization: Bearer ${LINE_TOKEN}" -F "message=録音完了:${filename//;/;}" https://notify-api.line.me/api/notify
fi
}
### jsonデータ取得
cd ${WORK_DIR}
rm -f ./index.html ./title_list.txt
wget https://www.onsen.ag/web_api/programs/
cat ./index.html | jq -r '.' > ./index.json
cat ./index.html | jq -r '.[].title' > ./title_list.txt
for item in ${KEYWORD[@]}; do
onsen_download "${item}"
done
サンプルのダウンロード対象は、長寿番組の動画有/無 から適当にチョイスしています。
仕様説明
- 番組タイトルからキーワードを検索してダウンロードします
- 各番組の最新話を対象としてダウンロードします
- 動画番組の場合も決め打ちでm4aとしてダウンロードします
- downloaded.txt にダウンロード済ファイル一覧を記録し、重複してダウンロードしない様にしています
- LINE Tokenを登録する事で、ダウンロード完了時に通知を行います
変数説明
変数 | 説明 |
---|---|
KEYWORD | テキスト配列でダウンロード対象を指定 |
LINE_TOKEN | 完了通知用LINE Token |
WORK_DIR | 一時ファイル用ディレクトリ |
一時ファイル
ファイル | 説明 |
---|---|
index.html | https://www.onsen.ag/ から取得した生データ |
index.json | 上のデータをjqに通して読みやすくしたもの |
title_list.txt | 番組タイトル一覧 |
downloaded.txt | ダウンロード済ファイル一覧 |
index.json と title_list.txt は特に使っていませんが、
番組を探すのに役に立つので、ファイルを作成する様にしています。
感想
取り敢えず、自分が録音したい番組についてのニーズは満たせたので、満足です。
Jisonの勉強にもなりました。
出演者情報からの検索や、他のインターネットラジオについても考えてみたいですが、
つづきはgithubにスクリプトを置いて、育ててみようと思います。
https://github.com/yoheike/Radio-Rec/releases/tag/v0.1
追記
- 出演者とゲストのサーチに対応しました
- 響も対応しました (rec-hibiki.sh)
追記2
2021/12/15に音泉の仕様変更が有り、
-headers "Referer: https://www.onsen.ag/" を付与する必要が出た様です。
付けなければ、"Server returned 403 Forbidden (access denied)"が発生します。