トップへ戻る

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 を取得し、成功時はキャッシュ保存。オフラインや障害時はキャッシュ/アセットへフォールバック
データモデルTrackRightsInfo / 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 とローカルの両立を意識した構成

工夫した点

  1. 公式データへの一本化
    出典と権利を説明できるデータだけをカタログに載せる前提にしたことで、後から権利表示・ストア審査・ユーザー説明がしやすい構造にしている。また、何かと規約が厳しいHTMLスクレイピングは行わない。
  2. リモート優先+キャッシュ+アセットの三段構え
    カタログ更新をサーバ/Pages 側だけで回せる一方、初回・オフラインでも最低限動くようにフォールバックを明示した。最悪、何も再生できないという事態は発生しない(はず。LOCがmetadata配信停止などしなければ)
  3. 権利・帰属を隠さない
    rights_policy に沿い、ステータスが public_domain でなくても権利・出典情報を必ず見せる設計にし、権利関係のトラブルを回避
  4. プラットフォーム差の吸収
    条件付き import(例: キャッシュ実装、通知アート)で Web とモバイルIO と HTML の差を隔離している。
  5. 運用と開発の分離
    カタログ生成はツールと CI に寄せ、アプリは JSON を読むだけにし、曲数増減やメタデータ修正をアプリ更新から切り離せるようにした。

苦労した点・難しかった点

  1. LOC 等の API とレート制限
    公式 API は便利だが 429 や取得コストが現実問題になる。item API の有無やタイムアウト、URL 到達チェックの厳しさなど、「正確さ」と「回ること」のバランスをツール側のオプションで調整する必要があった。
  2. 「メタデータ上の年」と著作権法上の「公表」
    録音年や year があっても、米国法でいう publish の裏取りには別途エビデンスが要る。実際、Internet Archiveからもトラックの生成を図ったが、同組織はPD以外の曲を大量に収容していた。また、Internet Archiveはmetadataの形式が不安定なため、現地点では最終的に人力でのPD確認をする必要があるようだった。そのため、今回のリリースでは同組織のトラックの掲載を断念した。将来的にはなんらかの方法で対応したい。
  3. バックグラウンド再生とストア要件
    通知・フォアグラウンドサービス・権限まわりは OS バージョンによって挙動が変わる。Play 提出用チェックリスト(権限説明・テスト手順)とセットでないと運用がきつい。
  4. 依存の都合への対応
    背景再生まわりで audio_service を path override するなど、上流パッケージの制約に合わせた調整が必要になる場面があった。