MusicPod は、Linux デスクトップ、MacOS、Windows 用のローカル音楽、ラジオ、テレビ、ポッドキャスト プレーヤーです。 (Android は計画されていますが、いつ実現するかはまだ未定です。)
OS | インストール方法 |
---|---|
Linux | または |
窓 | リリースページ |
MacOS | リリースページ |
アンドロイド | WIP |
特徴 | ダークリナックス | ライトリナックス | ダーク MacOS | 軽いMacOS |
---|---|---|---|---|
ローカルオーディオを再生する | ||||
メタデータでソートされたローカルオーディオを検索 | ||||
icytag とアートワークを検索して、ラジオ ステーションを再生しましょう。 | ||||
ポッドキャストの再生とダウンロード、安全な進行、エピソードの並べ替えなどを行います。 | ||||
ビデオポッドキャストのサポート! | ||||
好きなようにフィルタリングしてポッドキャストを発見 | ||||
好きなようにフィルタリングしてラジオ局を発見 | ||||
さまざまな表示モード |
アプリのアイコンは Stuart Jaggers によって作成されました。Stuart に感謝します。
MusicPod を Flatpak としてパッケージ化してくださった TheShadowOfHassen に感謝します。
MPV の貢献者全員に感謝します!
非常に使いやすく信頼性の高い podcast_search を作成してくれた @amugofjava に感謝します!
@alexmercerind、非常にパフォーマンスの高い Mediakit ライブラリと mpris_service dart の実装に感謝します。
@KRTirtho、非常に使いやすい smtc_windows パッケージと Flutter Discord RPC をありがとう
radiobrowser-api の dart 実装については、@tomassasovsky に感謝します。
超高速で純粋な dart オーディオ メタデータ リーダーを提供してくれた @ClementBeal に感謝します。
get_it と watch_it を作成してくれた @escamoteur に感謝します。これにより、アプリケーションが高速になり、ソース コードがクリーンになりました。
貢献は大歓迎です。特に翻訳。 MusicPod を GitHub 名前空間にフォークし、コンピューターにクローンを作成し、自分で名前を付けたブランチを作成し、変更をローカル ブランチにコミットしてフォークにプッシュし、フォークからこのリポジトリにプル リクエストを行ってください。特に Git や GitHub を初めて使用する人には、vscode 拡張機能の GitHub Pull Requests をお勧めします。
あなたの言語に翻訳するには、対応するapp_xx.arb
ファイルを変更します。xx xx
あなたの言語の小文字の言語コードです。ファイルがまだ存在しない場合は、ファイルを作成して app_en.arb の内容whole
をそのファイルにコピーし、値のみを翻訳に変更します。キーはそのままにしておきます。 arb 構文エラーを回避するには、Google による vscode 拡張機能 arb エディターを強くお勧めします。 Google翻訳拡張機能もおすすめです。
エラーを見つけた場合は、お気軽に問題として報告し、できる限り詳しく説明してください。コードを貢献したい場合は、まず問題を作成してください。
テストモックはMockitoで生成されます。サービス メソッドのシグネチャを変更した場合に備えて、モックを再生成するにはbuild_runner
コマンドを実行する必要があります。
dart run build_runner build
MusicPod は基本的に MPV 用の豪華なフロントエンドです。それがなければ、見た目はまだきれいですが、メディアを再生できません:D!
MusicPod は、このリアクティブ アプリのニーズに最も適合する MVVM アーキテクチャ パターンを使用し、すべてのレイヤーを分離して、必要に応じて 1 つのレイヤーの実装を交換できるようにします。 MVVM は Flutter 自体でも推奨されています。
アプリ、プレーヤー、検索、および各メイン ページには、1 つまたは複数のサービスに依存する独自のウィジェットのセット、1 つまたは複数のビュー モデルがあります。
すべてのサービスと ViewModel は get_it を介して遅延登録されます。つまり、 di
またはdi
を介して初めて特定されるまでインスタンス化されません。
フローチャート LR
classDef ビューの塗りつぶし:#0e84207d
classDef viewmodel fill:#e9542080
classDef モデルの塗りつぶし:#77216f80
表示["`
**ビュー**
(ウィジェット)
`"]:::view--watchProperty-->ViewModel["`
**モデルの表示**
(ChangeNotifier)
`"]:::viewmodel -- プロパティを聞く/取得 -->Model["`
**(ドメイン)モデル**
(サービス)
`"]:::モデル
ViewModel -- 通知 --> 表示
モデル--changedProperties.add(true)-->ViewModel
ViewModel には、コンストラクターを介して指定されるサービスへの依存関係があり、サービス ロケーター get_it を介して配置されます。これにより、サービスをモック化されたサービスに置き換えることができるため、テストが容易になります。
ViewModel は ChangeNotifier です。リスナー (具体的には UI クラス) を反応させる (つまり、リビルドする) メソッドを使用して、 notifyListener
メソッドを使用できます。
ViewModel は、依存するサービスへの StreamSubscription を保持します。プロパティが非永続的な UI 状態のみである場合、プロパティは ViewModel 内に保持されます。それ以上の場合、それらはサービス プロパティへの単なるゲッターです。したがって、サービスのプロパティが変更されると、プロパティ変更ストリームを介して ViewModel に通知され、UI に通知させたい場合は、 listen
コールバック内で UI (リスナー) に通知します。
このアーキテクチャを実装するためのパッケージに関して、私はプロバイダーから Riverpod までかなりの道のりを歩んできました。
get_it とその watch_it 拡張機能を使用した個人的なお気に入りのソリューションを見つけました。これは、フラッター ウィジェット ツリーの API にあまり侵入せずに、このアプリケーションと MVVM アーキテクチャのニーズに最も適合するためです。
こうすることで、すべてのレイヤーが明確に分離され、定型的なコードが多少含まれる場合でも、再実装が容易になり、理解しやすくなります。
ViewModel のプロパティが変更された後でウィジェットを再構築したい場合は、watch_it パッケージのwatchPropertyValue
メソッドを使用します。
final audio = watchPropertyValue (( PlayerModel m) => m.audio);
これにより、ListenableBuilder で構築されたフラッターを使用することもできますが、作業が簡単になります。
ローカル カバーとリモート カバーは両方とも、ロード/フェッチされた後、 CoverStore
とUrlStore
にキャッシュされます。
ローカル カバーの読み取りと無線データのリモート カバーの取得は、追加の 2 番目のダーツ アイソレーション内で行われます。
設定はshared_preferencesで保存されます。