AWSのサービスを活用して低コストでradikoをPodcast化するアプリケーションを作った話

# TL;DR

- AWSのサービスを活用してradikoをPodcast化するアプリケーションを作りました
    - [l3msh0/radicaster](https://github.com/l3msh0/radicaster)
- 低コストで運用可能で、番組の連結などヘビーリスナーに嬉しい機能もあります
- 気に入ったらGitHubで star :star2: してね

# この記事のターゲット

ラジオが好きで、ある程度AWSの知識があるエンジニアの方

# 前置き

皆さん、ラジオ :radio: 聴いてますか？

私は10年ほど前にラジオに出会って以来、移動中や家事をしながら、時にはお風呂やお布団の中など、日常のあらゆるシーンでラジオが欠かせない存在になっています。

ラジオの聴取手段と言えばradikoですよね。かく言う私もradikoプレミアムの会員で、タイムフリーやエリアフリーなどの便利な機能のおかげでラジオをより楽しめています。

ただ、ヘビーに利用していくと痒いところも出てくるわけで…。再生開始から24時間以内・合計3時間の聴取時間の制限や、シークのしづらいUI、そしてシークの度に発生するバッファリングなど、どれもラジオ業界が生き残っていく上で必要な制約であろうことは理解できるのですが、5分10分のスキマ時間でさっと聴くような自分のスタイルと相性が悪いのが悩みのタネでした。

そんなわけで、個人的には以前からVPS上にradikoを録音・Podcast化する仕組みを構築して運用していたのですが、費用面や運用の手間からクラウド前提のアーキテクチャで改めて作り直してみた、というのがこの記事の主旨です。

# 作ったもの

[l3msh0/radicaster: radikoを録音してPodcast化するアプリケーション](https://github.com/l3msh0/radicaster)

## 処理の概要

![](https://github.com/l3msh0/radicaster/blob/develop/radicaster.png?raw=true)

1. ユーザは録音したい番組の情報をYAMLで定義してradicasterのCLIに渡します
2. CLIはYAMLに記載された定義に基づいてEventBridgeに録音処理[^1]のスケジュールを登録します
3. スケジュールで設定された日時になると録音用のLambdaが起動してradikoを録音しS3にアップロードします
4. S3に録音した音声ファイルがアップロードされると、フィード生成用のLambdaが起動してPodcastのフィードが生成されます
5. フィードはCloudFrontで配信されているので、好きなPodcastアプリでフィードをsubscribeします

[^1]: 録音処理には[radigo](https://github.com/yyoshiki41/radigo)を使用しています。とても便利で重宝しています。ありがとうございます。

# おすすめポイント

せっかく作ったので、radicasterのおすすめポイントをいくつか紹介しようと思います。

## 簡単なデプロイ

radikoを録音してPodcast化する試みは検索するといくつも出てきますが、基本的には各自が自力で頑張った記録が主で第三者がマネするのは簡単ではないと思います。

一方radicasterは、デプロイにAWS CDKを使用することで比較的簡単にAWS上に環境を構築できます。 
DockerやNode.jsのインストールや最低限の設定の記述は必要ですが、実質的な作業としては `cdk deploy --all` を実行するだけです。[^2]

[^2]: とは言えまだドキュメントも粗く、ある程度の知識を前提としているので、今後ドキュメンテーションや構成の見直しなので改善していきたいところです。


## 低コストな運用

radicasterはLambdaやS3などサーバーレスなサービスを活用するため低コストでの運用が可能です。

参考までに私の6月分の請求額を掲載します。週に16番組の録音データが3ヶ月ほど貯まった状態で費用は約$1でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14347/1af26bd0-befe-b05d-1f0c-1665662753a9.png)

Rasberry Piなど自宅で常時稼働しているマシンがあればそちらの方が安いかもしれませんが、個人的には以前はVPSに月980円支払っていたのでだいぶ節約になりました。

もちろん今後過去の録音データが増えてくるとそれだけ費用がかかってきますが、S3のライフサイクルルールを活用するなどして予算をある程度以下に保つことも簡単にできそうです。

VPSと違ってサーバ自体のメンテナンスが不要なため、運用の手間を削減できるのもradicasterを使用するメリットだと思います。

## 柔軟なスケジュール予約・連結機能

月〜金のようないわゆる帯番組の録音予約ができるのはもちろんですが、さらにradiko上複数に分割されている番組を1つのエピソードとして連結することが可能です！

連結を行う際は、YAMLの番組定義で以下のように `program_schedule` に二次元配列を指定します。以下は月〜木の帯で、8:30-10:00と10:00-11:00に分割された番組を1つのPodcastフィードとして録音する場合の例です。

```yaml
id: radioto
title: 伊集院光とらじおと
author: 伊集院光
image: https://static.tbsradio.jp/wp-content/uploads/2021/02/hp_ijyuuinn_0224.jpg
area: JP13
station: TBS
program_schedule:
- ["Mon 8:30", "Mon 10:00"]
- ["Tue 8:30", "Tue 10:00"]
- ["Wed 8:30", "Wed 10:00"]
- ["Thu 8:30", "Thu 10:00"]
execution_schedule:
- Mon 12:00
- Tue 12:00
- Wed 12:00
- Thu 12:00
```

録音処理は `execution_schedule` で指定した曜日/時刻に起動し、直近の1エピソードのみを録音します。例えば、月曜12時(Mon 12:00)に起動する録音処理は直近のエピソードである `["Mon 8:30", "Mon 10:00"]` を録音し、かつ開始時刻が配列で渡されているので8:30開始分の番組と10:00開始分の番組を1エピソードとして連結します。

radikoは長時間の番組が分割されていることが多い一方で、既存の録音やPodcast化の仕組みでは連結がサポートされているものを見たことがないので、一部の方にはかなり便利な機能なのではないかと思います。[^3]

[^3]: 個人的には2021年4月にTBSラジオのJUNKが1時間ごとに分割されるようになったのがきっかけで慌てて実装したのですが、評判が悪かったのかすぐに2時間で1番組の形式に戻りましたね…。

## その他

デフォルトでフィードがHTTPS+Basic認証で保護されていて第三者に利用されないようになっていたり、PodcastのURLに無駄に独自ドメインを使用できる点は個人的に結構気が利いていて気に入っています。

# 終わりに

ラジオ好きかつAWSがわかる方向けのアプリケーションでかなりターゲットが絞られてしまうのですが、使いこなせればものすごく便利だと思いますので、興味がある方はぜひ使ってみていただけると嬉しいです。

今後は録音番組の追加や削除などの管理をCLIではなくWeb経由でできるようにする方向のアップデートを考えていますが、機能要望などあればIssueなどでお気軽にお知らせください。