raspberry pi 3でラジオ録音～Podcast配信～LINE通知まで実装してみた

#はじめに
深夜ラジオが大好きでよく聞くのですが、公式のradikoアプリに不満があります。
・１週間以上前の放送が聞けない
・アプリ起動に時間がかかり、他音楽アプリなどと比べ聴取体験がよくない

音源を自分で管理保存し、Podcastで番組毎にアーカイブ出来るような環境を目指しました。
#構築環境
・Raspberry Pi 3 Model b+上に実装
　①radiko録音
　②外部でも音源にアクセスできる様VPN接続にtailscaleを使用
　③録音した音源はrss feed作成しPodcast配信
　④録音結果のステータスをIFTTTを用いてLINE通知

![スクリーンショット 2021-02-23 11.24.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483293/a75068fe-6880-a061-204b-8114c2dac934.png)



#①radiko録音
　radikoの録音はrec_radiko_tsを利用しました。
　参考文献1:https://github.com/uru2/rec_radiko_ts
　各種コンポーネントのインストールを行います。

```
sudo apt-get install curl
sudo apt-get install ffmpeg
sudo apt-get install libxml2-utils
git clone https://github.com/uru2/rec_radiko_ts
```

次にスクリプトに実行権限を与えます

```
chmod 755　rec_radiko_ts.sh
```

・メールとパスワードはプレミアムアカウントで、別地域の放送局の録音が必要な場合に必要
・放送局IDは、各放送局を示す一意のコードです。
参考文献2 放送局ID一覧:https://www.norikistudio.com/station-id-list

```
sh rec_radiko_ts.sh -s 放送局コード -f 日付 -d 時間 -m "mail" -p "password"
```

試しにオードリーのオールナイトニッポンを録音してみます

```
sh rec_radiko_ts/rec_radiko_ts.sh -s LFR -f 202102210100 -d 120 -m "mail" -p "password"
ls
LFR_202102210100_202102210300.m4a 
```
録音が出来たことを確認しました。
#②tailscaleでVPN接続
ラジオ音源には著作権があり、誰もが閲覧出来る状態でインターネット上に保存することは著作隣接権者の「複製権」や「送信可能化権」に抵触します。
今回は録音した音源をpodcast化して配信を外部で受け取りたかったので、ラズパイとiphone間にVPN接続を通しました。
#tailscaleとは
UDPベースのVPNプロトコルで同一のアカウントでログインしたクライアント同士を直接接続するメッシュ型のVPNを簡単に構築してくれるサービス
URL:https://tailscale.com/
#ラズパイへのインストール
```
sudo apt-get install apt-transport-https
curl -fsSL https://pkgs.tailscale.com/stable/raspbian/buster.gpg | sudo apt-key add -
curl -fsSL https://pkgs.tailscale.com/stable/raspbian/buster.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt-get update
sudo apt-get install tailscale
sudo tailscale up
ip addr show tailscale0
```
tailscale0のipアドレスが付与されていればokです。


なお、iphoneはAppStoreでtailscaleをラズパイと同じアカウントでログインするだけで簡単にインストール出来ます。
ラズパイからiphoneのipアドレスへpingを通してVPN接続が確立したことを確認してください。
#③音源のPodcast化
録音した音源を配信するには、webサーバーを立てRSSで配信を行う必要があります。
#webサーバーを立てる
nginxをインストールします

```
sudo apt install nginx
```
ラジオの音源を録音しているディレクトリーを公開するようnginxのフォルダーを設定します。

```
sudo nano /etc/nginx/nginx.conf
```

```
server {
    location / {
        root /録音しているフォルダに書き換え
```
なお、録音しているフォルダ名は全角の日本語を含むと失敗しますので英語で命名してください。

nginxのサービスを立ち上げてください

```
sudo /etc/init.d/nginx start
```

別のクライアントから接続http://<ラズパイのIPアドレス>　以下画面が表示されれば成功です
![nginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483293/3f7bcde5-a793-bfbc-f81a-cc2147366f76.png)
#配信RSSの生成
録音された音源をPodcastで受け取るにはRSSの配信が必要です。以下参考にしました。
参考文献3 指定ディレクトリ内のmp3ファイルから必要最低限のPodcast用RSSを生成する:https://gist.github.com/matchy2/5552631

podcastのサムネイルを入れたかったので、art.jpgで指定で追加しました。

```
arturl = "#{location}art.jpg"
```
また、録音された音源の拡張子が.m4aだったので処理できるよう変更しました。

```ruby
files.each do |item|
  url = location + item['fname']

  if (/\.mp3$/ =~ item['fname']) then
    mime = 'audio/mp3'
  elsif (/\.m4a$/ =~ item['fname']) then
    mime = 'audio/m4a'
  else
    mime = 'audio/mp4'
  end
```
#配信テスト
録音した音源が配信出来るかテストをしてみます。
さきほど作成したnginx公開ディレクトリ配下に"test"を作成。録音したオードリーのオールナイトニッポンとart.jpgというサムネイルを1200x1200ピクセルで保存します。
rssの生成は以下コマンドで実行出来ます。

```
ruby makepodcast.rb Podcastのタイトル tailscaleのディレクトリURL オーディオ保存ディレクトリ > オーディオ保存ディレクトリ/タイトル.rss
```
注意点としては、ラズパイのen0のIPアドレスではなく、tailscaleで与えられたipアドレスをディレクトリURLに指定してあげることです。ローカルのIPを指定してしまうと、家庭内LANでしかRSSを受け取れません。

```shell
ruby makepodcast.rb オードリーのオールナイトニッポン http://192.168.x.x/radiko/test/ /home/pi/www/radiko/test/ > /home/pi/www/radiko/test/test.rss
```

#podcastでの登録
ライブラリ>番組をURLで追加を選択
<img width="400" alt="IMG_2288 3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483293/2bf291df-120a-a0d4-7e15-798936d8cadc.png">
`http://tailscaleのIP/録音ディレクトリ/タイトル.rss`で追加
例)`http://192.168.x.x/radio/test/test.rss`
<img width="400" alt="IMG_2289 3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483293/45c638e7-46f0-3f56-4e09-9cd955863604.png">
サムネイルも反映し、iphoneからラジオが聞けることが確認出来ました。
#④録音結果をLINE通知
LINE通知にはIFTTTを使用しました。
参考文献4 Raspberry PiからLINEへのプッシュ通知をIFTTTで実現:https://mimimopu.com/raspberry-pi_line/

参考文献と同様に3つのvalueを作成しレシピを作成しました。
value1:録音日時
value2:タイトル
value3:録音結果のステータス

録音、rss配信、リネームそしてLINE通知を１つのシェルスクリプトにまとめます

```shell
#!/bin/bash

#LINE通知のためのURL指定
URL="https://maker.ifttt.com/trigger"
EVENTNAME="raspberry_pi"
YOUR_KEY="your keyを入力"
WEBHOOKSURL="${URL}/${EVENTNAME}/with/key/${YOUR_KEY}"

#録音するディレクトリの指定
DOC_ROUTE="/home/pi/www/radiko/"
WORK_DIR="/root/radio"
TITLE=$1
RSS=$2
STATION=$3
DURATION=$4
TIME=$5
TITLE_HOME="${WORK_DIR}/${RSS}"
TITLE_DIR="${DOC_ROUTE}/${RSS}"
TODAY=$(date +%Y%m%d)

# mkdir
[ ! -e $TITLE_HOME ] && mkdir -p $TITLE_HOME
[ ! -e $TITLE_DIR ] && mkdir -p $TITLE_DIR

# rec
try=0
EXIST="${TITLE_DIR}/${TODAY}${TITLE}.m4a"
STATUS="録音失敗しています"

while [ $try -lt 5 ]
do
if [ ! -e $EXIST ]; then
cd $TITLE_HOME
sh /root/rec_radiko_ts/rec_radiko_ts.sh -s $STATION -f $TODAY${DURATION} -d $TIME -m "radikoメールアドレス" -p "radikoパスワード"
cd $TITLE_HOME
FINDAAC=$(find *.m4a)
DAY=${DURATION:0:8}
mv $FINDAAC $TODAY$TITLE.m4a
mv $TITLE_HOME/*.m4a $TITLE_DIR

# make rss file
ruby $WORK_DIR/makepodcast.rb $TITLE http://tailscaleのIP/radiko/$RSS/ $TITLE_DIR > $TITLE_DIR/$RSS.rss

let try++
sleep 1m
else
STATUS="録音成功しました"
break
fi
done

curl -X POST -H "Content-Type: application/json" -d \
    '{"value1":"'"$TODAY"'","value2":"'"$TITLE"'","value3":"'"$STATUS"'"}'  \
    ${WEBHOOKSURL}

```
radikoサーバーへのアクセスがたまに失敗することがあるので、録音失敗した場合は1分スリープ後に5回リトライする仕様です。録音データが生成されたら成功、５回トライしても録音出来ない場合は失敗としてLINE通知が来る様にしています。
<img width="400" alt="IMG_2290 3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483293/38ea1538-97ab-3af5-41ed-56569defff8b.png">
#毎週録音のためのcron
最後に、使用したスクリプトが番組終了直後に開始されるようcrontabに記述します。

自分が録音している番組以外におすすめがあれば教えてください！

```
crontab -e
```
```
構文
分　時間　日　月　曜日（日曜日が0で土曜日が6）　〜以下実行したいコマンド
```

```
# オードリーのオールナイトニッポン
30 3 * * 0 /bin/bash -lc "/root/radio/reckai.sh オードリーのオールナイトニッポン audrey LFR 0100 120"

# アルコアンドピースのDCガレージ
30 1 * * 3 /bin/bash -lc "/root/radio/reckai.sh アルコアンドピースのDCガレージ dcgarage TBS 0000 60"

# みちょパラ
45 23 * * 0 /bin/bash -lc "/root/radio/reckai.sh みちょパラ micho LFR 2300 30"

#霜降り明星のオールナイトニッポンZERO
20 5 * * 6 /bin/bash -lc "/root/radio/reckai.sh 霜降り明星のオールナイトニッポンZERO shimozero LFR 0300 120"

#ファーストサマーウイカのオールナイトニッポン0
20 5 * * 2 /bin/bash -lc "/root/radio/reckai.sh ファーストサマーウイカのオールナイトニッポン0 summer LFR 0300 90"

#霜降り明星のだましうち
0 3 * * 0 /bin/bash -lc "/root/radio/reckai.sh 霜降り明星のだましうち shimodama ABC 0130 60"

#ミルクボーイの煩悩の塊
0 2 * * 2 /bin/bash -lc "/root/radio/reckai.sh ミルクボーイの煩悩の塊 milk ABC 0030 30"

#かまいたちのヘイタクシー
20 22 * * 1 /bin/bash -lc "/root/radio/reckai.sh かまいたちのヘイタクシー kamataku TBS 2130 30"

#有吉弘行のSUNDAY NIGHT DREAMER
30 22 * * 0 /bin/bash -lc "/root/radio/reckai.sh 有吉弘行のSUNDAYNIGHTDREAMER sundori RADIOBERRY 2000 115"

#佐久間宣行のオールナイトニッポンZERO
20 5 * * 4 /bin/bash -lc "/root/radio/reckai.sh 佐久間宣行のオールナイトニッポンZERO sakuma TBC 0300 90"

#和牛のモーモーラジオ
30 2 * * 6 /bin/bash -lc "/root/radio/reckai.sh 和牛のモーモーラジオ moumou QRR 0130 30"

#アインシュタイン山崎紘菜HeatHeart
30 19 * * 0 /bin/bash -lc "/root/radio/reckai.sh アインシュタイン山崎紘菜HeatHeart ain QRR 1600 55"

#宮下草薙の15分
30 3 * * 6 /bin/bash -lc "/root/radio/reckai.sh 宮下草薙の15分 miya QRR 0245 15"

#チョコレートプラネットの東京遊泳
0 3 * * 6 /bin/bash -lc "/root/radio/reckai.sh チョコレートプラネットの東京遊泳 choco QRR 0230 15"

#三四郎のオールナイトニッポン
30 4 * * 6 /bin/bash -lc "/root/radio/reckai.sh 三四郎のオールナイトニッポン san LFR 0100 120"

#ミキの深夜でんぱ！
0 3 * * 6 /bin/bash -lc "/root/radio/reckai.sh ミキの深夜でんぱ miki QRR 0200 30"

#爆笑問題カーボーイ
30 3 * * 3 /bin/bash -lc "/root/radio/reckai.sh 爆笑問題カーボーイ cowboy TBS 0100 120"

#Creepy Nutsのオールナイトニッポン0
15 5 * * 3 /bin/bash -lc "/root/radio/reckai.sh CreepyNutsのオールナイトニッポン0 creepy LFR 0300 90"

#ハライチのターン！
30 1 * * 5 /bin/bash -lc "/root/radio/reckai.sh ハライチのターン haraichi TBS 0000 60"

#ミキの兄弟でんぱ！
20 14 * * 0 /bin/bash -lc "/root/radio/reckai.sh ミキの兄弟でんぱ brother KBS 1300 60"

#岡村隆史のオールナイトニッポン
30 3 * * 5 /bin/bash -lc "/root/radio/reckai.sh 岡村隆史のオールナイトニッポン little LFR 0100 120"

#さらば青春の光がTaダ、Baカ、Saワギ
0 4 * * 0 /bin/bash -lc "/root/radio/reckai.sh さらば青春の光がTaダ、Baカ、Saワギ saraba TBS 0300 30"

#ラランドツキの兎
0 23 * * 2 /bin/bash -lc "/root/radio/reckai.sh ラランドツキの兎 laland TBS 2130 30"

#空気階段の踊り場
30 4 * * 0 /bin/bash -lc "/root/radio/reckai.sh 空気階段の踊り場 mogura TBS 0330 30"

#デドコロ
0 19 * * 3 /bin/bash -lc "/root/radio/reckai.sh デドコロ dedocoro FBC 1815 30"
```
#課題と今後の抱負
ラジオ音源の容量が年々大きくなっているので、クラウドに移行したい気持ちが大きくなってきた。
次回はEC2もしくはECSで録音環境を実装しS3に保存するなどして、コストや運用のし易さを比較を行いたい。

#参考文献
radikoとPodcastとラズパイでお手軽ラジオサーバー:https://qiita.com/tinoji/items/5f57239de5772681c64a