普段自分は深夜ラジオを作業用BGMで聴くことが多い。特に「星野源のオールナイトニッポン」は長いこと聴いている。

社会人になった今リアルタイムは厳しく、radikoのタイムフリーやSpotifyに配信されたものを聴く。 Spotify配信のものが手軽で過去のも聴けて便利なのだが、権利の関係で曲が流れない、BGMも一部流れない(ANNの代名詞・Bittersweet Sambaも流れない …)というところがネックで、やはりradiko経由で聴くのがよさそう。

Chinachuによるテレビ録画みたく、radikoもルールに従ってダウンロードする仕組みが欲しくなり、実装してみた。 やりたかったこと完璧にはできなかったが、その過程も含めてメモしておく。

やったことざっくり

リポジトリ: abekoh/radiko-archiver: Archive radiko programs

※動作不安定なところがまだ結構ありそう。また、使う場合は個人利用限定でお願いします。

  • goroutine, channelなどを駆使して自動ダウンロードする仕組みをつくった
  • Podcastアプリで聴けるようにPodcast向けRSSをプライベートに配信しようとしたが、いろいろ懸念があり断念
  • 代わりに、Dropboxに自動でアップロードするようにした

使い方はREADMEに簡単にまとめてる。

ちなみに、動作環境はこちらの記事でも出てきた物理Ubuntuサーバー。

自動ダウンロード

goroutineを駆使して、

  • rules.tomlをもとにスケジュールをplannerで組み
  • dispatcherでスケジュールに従ってfetcherを実行
  • fetcherでファイルのダウンロード、結合を実施

という動きにしている。goroutine、chan、selectなど非同期な要素を組み合わせて思い通りに実装できるのが楽しい。

workerをいくつか役割ごとに動かしてみたが、dispatcherひとつだけ動かすだけでもシンプルでよいかも?それだとユニットテスト書くときごちゃりそうな気もするけど。

Podcast RSS プライベート配信 (断念)

アーカイブしたファイルを聴く方法について、当初はPodcastアプリで聴く想定だった。

次のようなRSSの仕様に沿ってXMLをHTTPで公開、自宅LAN内だけで取れたらと思っていた。

しかし、試してみたところそれだとダメ。インターネットからクロールできないといけないっぽい。そりゃそうか…

回避策として、BASIC認証設定してCloudflare Tunnelでインターネット公開してhttps://username:[email protected]/といったURLを登録してしまえば突破できそうと思ったけど、 完全プライベート向けにしたいもののパスワードをそのままPodcastサービスに教えてしまうのは抵抗があったのでやめた。

結局、シンプルにダウンロードしたファイルをDropboxに順次アップロードする方法を取って、スマホから同期するようにした。

雑感

Go 1.21から入った log/slog を今回使ってログを出すようにしてみた。サードパーティほど機能もりもりではないものの素朴でちょっとしたアプリに入れるとかはとても良さそうだった。

ディレクトリ構成について、最近Go公式から出たものを参考に組んでみた。シンプルな指針ながらこういうのあると嬉しい。
Organizing a Go module - The Go Programming Language

ラジオ・Podcastは1つのPodcastアプリで完結させるってことを目標にしてたができなくて残念。 さらに、愛用していたGoogle Podcastも来年サービス終了のようでこれも残念。 まぁPocket Castsなどに乗り換えても対して困らないんだけど… 余裕があったら、モバイル開発入門ついでにプライベート配信にも対応したPodcast再生アプリ開発とかやってみたい。