吉祥寺.pm28【オンライン】 - connpass https://kichijojipm.connpass.com/event/236031/
Podcast配信システムを自作したら捗った話2022-01-26 吉祥寺.pm 28【オンライン】@mktakuya
View Slide
自己紹介• @mktakuya(えむけー / mk / MK)• 都内のIT企業でWebエンジニア• サーバサイド多め。主にRuby• 学生時代の友達と雑談系Podcastを配信しています ゆるふわPodcast https://yuru28.com
Podcast配信システムを自作したら捗った話
ゆるふわPodcast• 2019年5月〜 高専時代の友人と開始した雑談Podcast• 2022年1月27日時点で全120エピソード公開中• → 2020年5月から毎週配信継続中!!• 基本3人で雑談、たまにゲストをお迎えして真面目な話• → 「若いエンジニア達が何を考えているか知ることが 出来ておもしろい」らしいhttps://yuru28.com↑ EP33 fukabori.fm iwashiさんを深堀りする回 https://yuru28.com/33
音声配信へのこだわり• Anchorやstand.fmなど音声配信サービスを利用せず、 自分たちでサイトを作りフィードを配信している → 技術勉強だったりオープンな技術を尊重したかったり Rebuildの宮川さんへの憧れだったり……↑Rails製管理画面→
Podcastの音声配信• Web上にMP3ファイルを置いて、 そのURLを記載したRSSフィードを配信すれば Podcastは成り立つ• 言ってしまえばWebサイトなどはおまけ• (当たり前だが)音声配信がPodcastのキモ
音声配信 Before / After• 今日は「Podcastの音声配信システム」について話します• Before: SoundCloudベース• SoundCloud上のMP3ファイルのURLをフィードに記載• 音声配信だけで月$16(SoundCloud Pro)• After: 自前配信(S3 + CDN)• Amazon Lightsail オブジェクトストレージに ファイルを配置し、RailsのActiveStorageのURLをフィードに記載し、CDN(Cloudflare)経由で配信• 音声配信月$1(オブジェクトストレージ 5GBプラン)
Before: SoundCloudベース• Podcastを始めた2019年春• Webサイトや管理画面、RSSフィードはRailsで作成• SoundCloudに音声ファイルをアップロード Webから視聴: 公式の埋め込みプレーヤー アプリから視聴: フィードにMP3 URLを記載• ストレージと配信を SoundCloudに任せる形に
SoundCloudベースのツラミ• エピソード公開が二度手間だった• SoundCloudで音声UP → SoundCloudのTrack IDをメモ→ 管理画面でメタデータ編集 → 公開予約• アナリティクスが貧弱だった• 過去データや再生元(Web?アプリ?)が取れない• 仲間内の趣味でやるにはお高い価格だった($16/月)
音声配信も自作の機運
満たしたい要件• 音声UPからエピソード公開まで管理画面でできること• 音声DLの日時やエピソード番号、 User-Agentやリファラなどをログに残せること• SoundCloudベースのものよりも安いこと(重要)
技術調査: ロギングについて• 音声はエッジ(Cloudflare)からDLしてほしいが、 ロギングのためにオリジン(Rails)にもアクセスが必要 → エッジからレスポンスが返ると、 Railsにリクエストが届かずロギング出来ない• rebuild.fm を研究 m(_ _)m → フィード記載のURLにアクセスすると、 キャッシュの効いたMP3ファイルのURLにリダイレクト↑ ①RSSフィードには、 cache.rebuild.fm のURLが載っている↑ ②実際の音声ファイルはリダイレクト後にCDNからDL
ロギングの実装• フィードには↓のようなURLを記載し、 /audio/d36e49d128/podcast-ep120.mp3 Controller内でロギングとリダイレクトを行った← rails_storage_proxy_url(ar_instance.attribute) すると、 Railsが裏側でS3等からファイルをDLし、 クライアントにファイルを送信(プロキシ)してくれる↑ フィード記載のURLへのアクセスはオリジンまで到達し、リダイレクト後のURLはエッジがレスポンスを返す これによって、Rails AppでのロギングとMP3ファイルのキャッシュからの配信を両立する
あとはふつうのRails開発• Rails謹製のActiveStorageを利用して Episodeモデルにaudio_fileをattach• お手軽版S3(?)のLightsailオブジェクトストレージ利用• 音声DLのログをBigQueryに流したりなどしつつ……
!!!完成!!!• リスナーから見てなにかが変わったわけでは無いが。。。• Webプレイヤー経由 / RSSフィード経由のDL数をとれたり• User-Agentからみんなの Podcastアプリを調査 してみたり←↑ RedashからBigQueryに 繋いでBIしてみた図
!!!完成!!!• 編集→公開も管理画面で完結• SoundCloudと管理画面を行き来する 不毛な作業から開放🎉• (音声配信部分だけ)$16 / 月 → $1 / 月に圧縮• SoundCloud Pro: $16 → Lightsailのオブジェクトストレージ: $1• 年間$180(2万円ちょい)の費用削減🎉
吉祥寺.pm 28テーマ「リブート」
リブート的な話• 2021年: Podcastのサポータープログラムの収益で (ありがたいことに)収支がトントンに。• 2022年: 脱SoundCloud(DONE)や脱Heroku(WIP)を やって、経費を圧縮する予定。• 利益(?)をゲスト様のマイク代にしたり、 機材アップグレードにまわしたり、 よりおもしろいことに投資したり• 2022年5月からPodcastも4年目になるので、 ここらでリブートしていきたい💪www.patreon.com/bePatron?u=12932782
おもしろいことの例• もっとゲスト回 / 企画回増やす• 突然YouTuberデビューする• BigQueryに突っ込んだ再生ログを使ってなにかする• エピソードの自動文字起こしを使ってなにかする• ……アイデア募集!← Googleの自動文字起こしAPIで生成した 文字起こしの検索(そのうち公開予定)
まとめ• Podcast配信システムを自作すると捗る• 費用圧縮• ログ取って遊べる• 自由度高い• 大容量ファイルへのアクセスをキャッシュ効かせつつ ロギングしたいときは、ロギング用URLからキャッシュの効いたURLにリダイレクトすると良い• 配信を 自分でやると 捗るよ(575)