【個人開発】無料範囲でポッドキャスト配信サービスを作ってみた
Your Voice is Yoursというポッドキャスト配信サービスをリリースしました。
※いきなりタイトル詐欺ですが、ドメイン代だけはかかってます・・・!
どんなサービス?
配信者がGoogleドライブ上の音声ファイルをポッドキャストとして配信するためのサービスです。
RSSフィードのURLは全て限定公開です。必要に応じて各種プラットフォームに登録してください。
作成できる番組数は無制限です。
技術スタック
- Next.js
- TypeScript
- Vercel ... サイトのホスティング
- Supabase ... DBおよびGoogleOAuthログインのヘルパーとして
- GoogleDrive API ... Googleドライブ上のファイルの取得や操作
- Cloudflare R2 ... メディアファイルとRSSフィードのキャッシュとホスト
- Cloudflare Workers ... R2 Bucketへのインターフェースとして
※Googleドライブからホストすることの利用規約上の懸念について
規約に
とあるのでグレーといえばグレーなのだが、YouTubeで代替できない使用方法だし、全く大規模ではないので勝手にセーフと判断しています。
とらぬたぬきのなんとやらですが、アウトと判断されたらたぶんサービス停止ですね・・・。
やっていること
サービスの機能を分解すると、以下になります。
1. 番組情報をスプレッドシートに記入するヘルパー
新しい番組を追加するためのUIです。
フォームへ記入した内容がスプレッドシートに転記されます。
番組追加UI
スプレッドシートでの表示
2. エピソード情報をスプレッドシートに記入するヘルパー
新しいエピソードを追加するためのUIです。
フォームへ記入した内容がスプレッドシートに転記されます。
エピソード追加UI
スプレッドシートでの表示
3. スプレッドシートの内容からRSSフィードを生成
スプレッドシートに書かれたルールに従って生成されます。
channelタグ設定
itemタグ設定
生成されるRSS(スクショをlocalhostで撮ったので127.0.0.1
が見えてます)
4. RSSフィードをキャッシュしてホスト
生成したRSSフィードをCloudflare R2にアップロードし、ホスティングします。
無料で運営するために
永続的なファイルサーバーを持たない
オリジナルのファイルは各配信者のGoogleドライブ上に置かれますが、それをそのまま配信してはGoogleドライブの規約違反になる恐れがありますので、どこかしらCDN的なところ(今回はCloudflare R2)にキャッシュする仕組みが必要です。
とはいえ、なんでもかんでもキャッシュしていたら
- 元ファイルの変更に対処できない
- サーバー代がかかる
という問題が発生します。
ということで、ファイルのキャッシュには以下の戦略を採っています。
- 一定期間で削除
キャッシュされたファイルは一定期間で削除されます。
これにより、長期間聴かれないファイルに容量を割いてしまうことを防ぎます。 - エピソード更新時にクリア
エピソードが更新された(=オリジナルが更新されたかもしれない)タイミングで、その番組に紐づくキャッシュを全て消去します。
これによってファイルのバージョンを最新に保ちます。 - GETアクセスが来てからキャッシュする
エピソードを更新したタイミングでキャッシュし直すのではなく、初回のアクセス時にGoogleドライブからDLしてくるようにします。
これにより、結局聴かれないファイル(古いエピソードなど)に容量を割いてしまうことを防ぎます。
大きなデータはCloudflare R2に置く
当初はRSSをSupabaseのDBに置いていたんですが、すぐに無料部分をオーバーしてしまいました。
CDNとDBって違うんだなあ、と素人の感想を述べながらCloudflare R2に移植しました。
流行りすぎない
とらぬたぬきのなんとやらですが、もし流行りすぎたら無料部分をはみ出ます。
あーそんなのやだなーあんまりユーザー増えないでほしいなーこわいなー(棒)
そのほかできること
ワンボタン入力
エピソードの追加時に、あらかじめ所定のフォルダに音声ファイルをアップロードしておけば、ワンボタンでフォームに入力できます。
URLのほか、オーディオファイルのmimeTypeやdurationなども自動的に記入されます。
その際、同じフォルダにテキストファイルや画像ファイルがある場合は同時に概要欄テキストとアートワークが設定されます。
予約投稿
エピソードの公開日時を未来に設定すれば、その時刻にRSSフィードが更新されます。
ダイレクト更新
管理画面UI
自動更新フォルダを設定すると、そのフォルダ内の音声ファイルが自動的に配信されます。
エピソードごとのフォルダをつくり、テキストや画像を一緒に置いておくと概要欄テキストやサムネイルも設定できます。
フォルダ構成例(episodesフォルダを自動更新フォルダに設定する想定)
RSSフィードのURL設定
番組につきひとつ、RSSフィードのURLにエイリアスを設定することができます。
easylazyscrapの部分が設定したエイリアス
アクセス解析
聴取環境と地域のグラフ
DL数推移
エピソードごとのDLランキング
あなた次第
あなたの番組情報は全てスプレッドシートにあり、ウェブサイトのUIは言ってしまえばお飾りでしかありません。
サイトのUIを通さずとも、スプレッドシートを変更してUPDATE RSS
のボタンを押せばそれで番組が更新されます。
例えば最新の5エピソードだけを配信するとか、タイトルに[メンバー限定]
と書いてあるエピソードは除外して配信するとか、更新のたびにタイトルが変わるとか、あなたのスプレッドシート力によって様々に番組のアレンジが可能です。
そのほか細かなこだわり
カスタマイズ可能なRSS
スプレッドシートからRSSへの変換処理は、同じスプレッドシート上で細かく設定可能です。
タグの追加や削除、デフォルト値の設定などが配信者の自由になります。
番組情報(再掲)
channelタグ設定(再掲)
エピソード情報
itemタグ設定(再掲)
カスタマイズ可能な入力フォーム
番組によっては、概要欄のテンプレがあったり、タイトルはスプレッドシート側で自動入力するからフォームには不要だったりと、何が便利かはひとそれぞれだということで、入力フォームの機能もある程度カスタマイズ可能にしました。
フォームからいちいち入力しなくてもスプレッドシートの機能が便利に使えるのならそっちが良いよねというのもあります。
本当はポッドキャストRSSフィードの仕様が自由すぎて何を頼ったらいいかわからんのでそれぞれお手元でお好きなようにしてくださいというのが一番の理由です。
番組の構成要素が全て配信者の手元にある
音声ファイルだけでなく番組やエピソードの情報が集約されるスプレッドシートも、配信者のドライブ上に置かれます。
突然サービス終了しても、何も失われないので、別のところですぐ配信を再開できますね!
使ってみる
リンク先のボタンをクリックして、Googleアカウントでログインすれば利用登録完了です。
不明な点や質問、感想等あればDiscordサーバへどうぞ!
最後に
蛇足(想いの部分)
ポッドキャストの配信環境はとても便利になりました。
各種配信サービスの助けにより、RSSなんて言葉を知らなくても配信できてしまいますし、自分の番組がどうやってリスナーに届いているのかについて何も説明できない配信者も多いのではないでしょうか。
全く自然なことですし、裏にある技術のことを意識することなく目的が実現できること、それ自体は素晴らしいことです。
しかしその一方で、自由や工夫の機会が損なわれてしまっているということもまた事実だと思います。
便利の裏で、気づかれることなく毀損されている自由があることに目を向けたくなりました。
配信者には、もっとその背景にある技術について知っていてほしい。
もちろん、これは僕のただのエゴです。
不要な人には不要です。というか大抵の人にとっては不要でしょう。
いくら音声ファイルをGoogleドライブにおいたって、RSSをカスタマイズしたって、リスナーは増えないし、しゃべりも上手くなりません。
だから、このサービスは知ることを押し付けません。
これまで通り、音声ファイルをアップロードして配信ボタンをポチッ!で番組は更新できます。
自分のGoogleドライブアカウントを使っていることすら意識しないかもしれません。
ただ、そのそばに、ちょっとクリックすればすぐ手の届くところに、自由への入り口を用意しています。
自由って、そこにあるということ自体に価値があるんじゃないかと思っています。
例えば、工具箱の隅で活躍の機会を待っている星型ドライバーのように、使う予定のないパスポートのように、やろうと思えばできる状態であるということ、選択肢があるということが大切なのではないかと。
いろいろと書きましたが、結局のところ言いたいことはサービス名であるYour Voice is Yoursに尽きます。
直訳すると「あなたの声はあなたのもの」です。
ポッドキャスト番組にもっと「自分のもの」感を感じられたらいいな、と思っています。
遠いどこかのウェブサーバに自分の音声を預けて配信してもらうのではなくて、自分の手元に置いたまま、自分の手で配信する。
そんな意識を持てたらなと思っています。
現実的にはこのサービスが流行るとは思っていないし、そう望んでいるわけでもありません。
(興味あれば登録してくださいね!嬉しい悲鳴は大歓迎です!)
ただ、こういう意識で実際に動くものを作って公開する奴がいるんだということだけ、知ってもらえたら嬉しいです。
Discussion