最近、外出をするときにポッドキャストを聴くことが多くなりました。
今まで利用していたアプリは多機能な一方、それらを使いこなせていない感がありました。
そこで、自分のユースケースにあったポッドキャストプレイヤーを作ってみたことから、メモを残します。
目次
機能について
自分の場合、事前に家でポッドキャストのエピソードをダウンロードしておいて、外出時は再生するだけでした。そのため、以下の機能があれば良さそうでした。
- ポッドキャストの管理
- RSSページを元にした登録
- 音声データのダウンロード
- エピソードの管理
- 再生、停止
- RSSの購読によるエピソード登録
- いわゆる既読・未読管理
- 聴き終わった後の音声ファイル削除
- エピソードの絞り込み
一方、自分のユースケースに合わない機能は実装しませんでした。
- ストリーミング再生
- エピソードの自動更新や、音声ファイルの自動ダウンロード
- ポッドキャスト検索
技術スタックについて
個人のAndroid端末だけで動作確認が取れればよいので、Android 16で動くものを優先しました。
また、できる限り外部ライブラリへの依存を減らすことでアップデートを容易にしたかったことから、プロダクションコードはGoogleとJetBrains製のライブラリのみにしました。
| 分類 | ライブラリ | バージョン |
|---|---|---|
| 言語 | Kotlin | 2.3.10 |
| UI | Jetpack Compose(BOM) | 2026.06.01 |
| 再生 | Media3(ExoPlayer + MediaSession + MediaSessionService) | 1.10.1 |
| DB | Room | 2.8.4 |
| 非同期 | kotlinx-coroutines | 1.11.0 |
| HTTP | HttpURLConnection (OS 標準) | — |
| RSS パース | XmlPullParser (OS 標準) | — |
| 画像 | BitmapFactory + 自前ファイルキャッシュ | — |
今まで音声ファイルを扱ったことがなかったのでライブラリ選定が難しそうだと思っていました。しかし、 androidx/media を使えば今回必要な機能がすべて含まれていると分かり、だいぶ簡潔になりました。
https://github.com/androidx/media
一方、テストコードやリンターなどについては、AGPやKoverの他に、サードパーティライブラリも導入しました。ビルド時はサードパーティを許容した感じです。
| ツール | 役割 | バージョン |
|---|---|---|
| AGP | ビルド | 9.3.0 |
| ktfmt | フォーマッター | 0.64 |
| detekt | 静的解析 | 2.0.0-alpha.5 |
| Kover | カバレッジ | 0.9.9 |
| JUnit 4 | テストランナー | 4.13.2 |
| kotest-property | プロパティベースドテスト(property モジュールのみ) | 6.2.3 |
プロパティベースドテストのライブラリについては、最初、以下を眺めて選定を考えました。
https://github.com/jmid/pbt-frameworks
しかし、Java/Kotlinのライブラリについては更新が止まってそうなものもあり、どれを採用するか迷いました。
そんな中、kotestにプロパティベースドテストの機能が含まれていると知りました。
まずはこれで十分だろうということで、 kotest-property だけを導入しました。そのため、テストランナーや書き方については、JUnit 4ベースのままになっています。
また、detektはアルファ版であっても2系にした理由は以下です。
- 1系はKotlin2.3系に未対応
- 2系は対応、今後の安定版に期待
- この規模のアプリなら問題が出ても大したことがないだろう
- ビルド時のみの依存であり、プロダクションコードには影響しないこと
開発〜運用について
2026年7月現在の開発方法のスナップショットとしてメモしておきます。
仕様の詰め方について
Fable5 high + OpenSpec + grill-me (grilling) で詰めました。流れは以下でした。
- OpenSpecの
/opsx:exploreで仕様を発散 - grill-meで仕様を収束
- OpenSpecの
/opsx:ffでドキュメントづくり
なお、機能があれば良いということで、UI/UXについてはモデル任せにしました。
実装について
AIエージェントの方が Android + Kotlin に詳しいため、実装は任せることにしました。
Fable5 high もしくは Opus 4.8 high を使い、 /opsx:apply で実装してもらいました。
なお、自分で実装しない分、
- リンター
- フォーマッター
- テストコード
- 事例ベーステスト
- プロパティベースドテスト
- テストカバレッジ
などを整備しました。
detektを使って「例外の握りつぶし」「アーキテクチャ違反」などが発生した場合はビルドエラーにすることで、ある程度の品質を担保しています。
また、AndroidのテストまわりについてはAIエージェントの方が詳しいので、より良いテスト手法があればそれを採用しました。
運用について
デプロイについては、macとスマホをUSBケーブルで繋いでインストールすることにしました。
また、スマホでポッドキャストを登録するのがやや手間なので、AIスキル「USBケーブルを介してPCからポッドキャストを登録する」を用意しました。
スクリーンショット
AIによるUI/UXのまま、特に手を加えていない状態になっています。
トップ
ポッドキャストの詳細
再生中の画面
おわりに
シンプルですが、自分のほしかった機能は手に入ったので良しとします。
後は使ってみて、気になったところを修正していければと考えています。
ソースコード
GitHubに上げました。
https://github.com/thinkAmi/podcast-player


