Public Domain Jazz Playerまとめ
Public Domain Jazz Player(pub_dom_jazz)— ふりかえり
アプリ概要
このアプリはGoogle Play Storeでの審査中です
パブリックドメイン(著作権切れ)ジャズ音源をストリーミング再生する Flutter アプリです。HTML スクレイピングは行わず、The Library of Congress(アメリカ議会図書館、以下LOC)の公式メタデータから取得した JSON カタログを唯一のデータ源として権利関連のトラブルを回避しています。
- プラットフォーム: Android(将来的にはiOS対応予定)
- カタログ: リモートの曲一覧JSON、
tracks.jsonを優先し、失敗時は**端末キャッシュ → 同梱assets/tracks.json**の順で読み込み。アプリリリース後の曲変化やプラットフォームに依存しないように設計しました - 各トラック: タイトル・音源 URL に加え、権利状態・権利文面・出典・コレクションなどをデータモデルに持ち、詳細画面で確認できるように設計
作ったもの(機能・構成の要点)
| 領域 | 内容 |
|---|---|
| 再生 | just_audio、モバイルでは just_audio_background により通知・ロック画面からの操作に対応 |
| カタログ取得 | CatalogRepository が HTTPS でリモート JSON を取得し、成功時はキャッシュ保存。オフラインや障害時はキャッシュ/アセットへフォールバック |
| データモデル | Track に RightsInfo / Attribution / CollectionInfo / AudioSourceInfo を分離し、docs/rights_policy.md と UI 表示を揃えやすくした |
| 法務・情報 | 利用規約・プライバシーは url_launcher で外部表示。--dart-define で URL をビルド時に差し替え可能 |
| カタログ生成パイプライン | LOC 向けの Dart ツール(tools/fetch_loc_catalog.dart 等)とシェル、validate_catalog、GitHub Actions による Pages へのカタログ公開(README・docs/ 参照) |
| リリース | Android は Play 向け AAB、key.properties 未設定時はデバッグ署名でビルド可能にするなど、CI とローカルの両立を意識した構成 |
工夫した点
- 公式データへの一本化
出典と権利を説明できるデータだけをカタログに載せる前提にしたことで、後から権利表示・ストア審査・ユーザー説明がしやすい構造にしている。また、何かと規約が厳しいHTMLスクレイピングは行わない。 - リモート優先+キャッシュ+アセットの三段構え
カタログ更新をサーバ/Pages 側だけで回せる一方、初回・オフラインでも最低限動くようにフォールバックを明示した。最悪、何も再生できないという事態は発生しない(はず。LOCがmetadata配信停止などしなければ) - 権利・帰属を隠さない
rights_policyに沿い、ステータスがpublic_domainでなくても権利・出典情報を必ず見せる設計にし、権利関係のトラブルを回避 - プラットフォーム差の吸収
条件付き import(例: キャッシュ実装、通知アート)で Web とモバイル、IO と HTML の差を隔離している。 - 運用と開発の分離
カタログ生成はツールと CI に寄せ、アプリは JSON を読むだけにし、曲数増減やメタデータ修正をアプリ更新から切り離せるようにした。
苦労した点・難しかった点
- LOC 等の API とレート制限
公式 API は便利だが429や取得コストが現実問題になる。item API の有無やタイムアウト、URL 到達チェックの厳しさなど、「正確さ」と「回ること」のバランスをツール側のオプションで調整する必要があった。 - 「メタデータ上の年」と著作権法上の「公表」
録音年やyearがあっても、米国法でいう publish の裏取りには別途エビデンスが要る。実際、Internet Archiveからもトラックの生成を図ったが、同組織はPD以外の曲を大量に収容していた。また、Internet Archiveはmetadataの形式が不安定なため、現地点では最終的に人力でのPD確認をする必要があるようだった。そのため、今回のリリースでは同組織のトラックの掲載を断念した。将来的にはなんらかの方法で対応したい。 - バックグラウンド再生とストア要件
通知・フォアグラウンドサービス・権限まわりは OS バージョンによって挙動が変わる。Play 提出用チェックリスト(権限説明・テスト手順)とセットでないと運用がきつい。 - 依存の都合への対応
背景再生まわりでaudio_serviceを path override するなど、上流パッケージの制約に合わせた調整が必要になる場面があった。