インターネットラジオをズボラに自動録音したい

# 動機

インターネットラジオを自動で取得する方法は幾つか提供されています。

- [音泉ダウンロード支援ツール](http://blog.tkooler.net/Category/13/)
- [PowerShellでHiBiKi Radio Stationと音泉とRadikoタイムフリーを保存してPodcast形式で配る](https://maeda577.github.io/2021/01/10/webradio.html)

音泉ダウンロード支援ツールは便利ですが、
週に一回、Windows PCを起動するのも面倒だなー、と思っていて、
常時起動しているNASとかラズパイで何とかしたいな、が発端です。
crontabからスクリプトを定期で呼び出すだけにしたいのです。

# 自動取得スクリプト
```bash:rec-onsen.sh
#!/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

# 追記
https://github.com/yoheike/Radio-Rec/releases/tag/v0.2
- 出演者とゲストのサーチに対応しました
- 響も対応しました (rec-hibiki.sh)

# 追記2
2021/12/15に音泉の仕様変更が有り、
-headers "Referer: https://www.onsen.ag/" を付与する必要が出た様です。
付けなければ、"Server returned 403 Forbidden (access denied)"が発生します。