MusicPod — это проигрыватель локальной музыки, радио, телевидения и подкастов для Linux Desktop, MacOS и Windows. (Android запланирован, но когда это произойдет, пока неизвестно.)
ОС | Как установить |
---|---|
Линукс | или |
Окна | Страница выпуска |
MacOS | Страница выпуска |
Андроид | НЗП |
Функции | Темный Линукс | Легкий Linux | Темная MacOS | Легкая MacOS |
---|---|---|---|---|
Воспроизвести локальное аудио | ||||
Найдите локальные аудиозаписи, отсортированные по метаданным. | ||||
Слушайте радиостанции с ледяными тегами и изображениями! | ||||
Слушайте и скачивайте подкасты, отслеживайте прогресс, сортируйте выпуски и многое другое! | ||||
Поддержка видеоподкастов! | ||||
Откройте для себя подкасты, отфильтрованные по вашему усмотрению | ||||
Откройте для себя радиостанции, отфильтрованные по вашему усмотрению | ||||
Различные режимы просмотра |
Значок приложения создал Стюарт Джаггерс, большое спасибо, Стюарт!
Спасибо TheShadowOfHassen за упаковку MusicPod в Flatpak!
Спасибо всем участникам MPV!
Спасибо @amugofjava за создание очень простого в использовании и надежного podcast_search!
Спасибо @alexmercerind за сверхпроизводительную библиотеку Mediakit и реализацию dart mpris_service!
Спасибо @KRTirtho за очень простой в использовании пакет smtc_windows и Flutter Discord RPC.
Спасибо @tomassasinsky за дартическую реализацию radiobrowser-api!
Спасибо @ClementBeal за супербыструю и чистую программу чтения метаданных аудио Dart!
Спасибо @escamoteur за создание get_it и watch_it, которые сделали мое приложение быстрее и чище исходный код!
Взносы очень приветствуются. Особенно переводы. Пожалуйста, создайте ветвь MusicPod в своем пространстве имен GitHub, клонируйте его на свой компьютер, создайте ветку с собственным именем, зафиксируйте изменения в локальной ветке, отправьте их в свою вилку, а затем сделайте запрос на извлечение из вашей ветки в этот репозиторий. Я рекомендую расширение vscode GitHub Pull Requests, особенно для новичков в Git и GitHub.
Для перевода на ваш язык измените соответствующий файл app_xx.arb
, где xx
— код вашего языка в нижнем регистре. Если файл еще не существует, создайте его, скопируйте в него whole
содержимое app_en.arb и измените только значения вашего перевода, но оставьте ключи нетронутыми. Настоятельно рекомендуется использовать редактор вилок с расширением vscode от Google, чтобы избежать синтаксических ошибок вилок. Также рекомендуется использовать расширение Google Translate.
Если вы обнаружите какую-либо ошибку, пожалуйста, сообщите об этом как о проблеме и опишите ее как можно лучше. Если вы хотите добавить код, сначала создайте проблему.
Тестовые макеты генерируются с помощью Mockito. Вам нужно запустить команду build_runner
, чтобы заново сгенерировать моки, если вы изменили сигнатуры сервисных методов.
dart run build_runner build
MusicPod — это, по сути, модный интерфейс для MPV! Без него он все равно выглядел бы хорошо, но не воспроизводил бы никаких медиафайлов :D!
MusicPod использует архитектурный шаблон MVVM, который наиболее соответствует потребностям этого реактивного приложения и сохраняет все уровни разделенными, чтобы мы могли при необходимости поменять реализацию одного уровня. MVVM также рекомендуется самим Flutter.
Приложение, плеер, поиск и каждая главная страница имеют свой набор виджетов, одну или несколько моделей просмотра, которые зависят от одного или нескольких сервисов.
Все службы и модели ViewModel регистрируются лениво через get_it, что означает, что они не создаются до тех пор, пока не будут впервые обнаружены через di
или di
.
блок-схема LR
Заполнение представления classDef: # 0e84207d
classDef viewmodel fill:#e9542080
Заполнение модели classDef: #77216f80
Посмотреть["`
**Вид**
(Виджеты)
`"]:::view--watchProperty-->ViewModel["`
**Модель просмотра**
(Уведомление об изменении)
`"]:::viewmodel --прослушать/получить свойства-->Model["`
**Модель (домен)**
(Услуга)
`"]:::модель
ViewModel -- notify --> Просмотр
Модель --changedProperties.add(true) -->ViewModel
Модели представления имеют зависимости от сервисов, которые передаются через их конструктор, где они расположены с помощью локатора сервисов get_it. Это упрощает их тестирование, поскольку вы можете заменить сервисы имитируемыми сервисами.
ViewModels — это ChangeNotifiers. Они могут использовать метод notifyListener
, который заставляет прослушиватели (конкретно: классы пользовательского интерфейса) реагировать (т. е. перестраиваться).
Модели представления содержат (а) StreamSubscription(ы) для (услуг)(ов), от которых они зависят. Если свойства представляют собой только непостоянное состояние пользовательского интерфейса, они хранятся внутри ViewModel. Если их больше, то они просто получают доступ к служебным свойствам. Таким образом, если свойство службы изменится, ViewModels будут уведомлены через поток PropertiesChanged, и если мы хотим, чтобы пользовательский интерфейс обратил на это внимание, внутри обратного вызова listen
мы уведомим пользовательский интерфейс (прослушиватели).
Что касается пакетов для реализации этой архитектуры, мне пришлось пройти долгий путь от провайдера до RiverPod.
Я нашел свое личное любимое решение — get_it плюс его расширение watch_it, потому что оно больше всего соответствует потребностям этого приложения и MVVM-архитектуры, не слишком вторгаясь в API дерева виджетов флаттера.
Таким образом, все уровни четко разделены, их легко реализовать повторно и за ними легко следить, даже если при этом потребуется немного шаблонного кода.
Если виджеты хотят перестроиться после изменения свойств ViewModels, мы используем метод watchPropertyValue
пакета watch_it:
final audio = watchPropertyValue (( PlayerModel m) => m.audio);
Это упрощает задачу, хотя мы также могли бы просто использовать флаттеры, встроенные в ListenableBuilder.
Как локальные, так и удаленные обложки кэшируются в CoverStore
и UrlStore
после их загрузки/извлечения.
Чтение локальных обложек и получение удаленных обложек для радиоданных происходит внутри дополнительных изолятов второго дротика.
Настройки хранятся в файлеshared_preferences.