MusicPod é um reprodutor local de música, rádio, televisão e podcast para Linux Desktop, MacOS e Windows. (O Android está planejado, mas ainda não há previsão de quando isso acontecerá.)
SO | Como instalar |
---|---|
Linux | ou |
Windows | Página de lançamento |
Mac OS | Página de lançamento |
Android | WIP |
Características | Linux escuro | Linux leve | Mac OS escuro | Mac OS leve |
---|---|---|---|---|
Reproduzir áudio local | ||||
Encontre áudios locais classificados por metadados | ||||
Toque estações de rádio, com tags geladas e obras de arte pesquisadas! | ||||
Reproduza e baixe podcasts, progrida com segurança, classifique episódios e muito mais! | ||||
Suporte para podcast de vídeo! | ||||
Descubra podcasts filtrados como desejar | ||||
Descubra estações de rádio filtradas como desejar | ||||
Diferentes modos de visualização |
O ícone do aplicativo foi feito por Stuart Jaggers, muito obrigado Stuart!
Obrigado TheShadowOfHassen por empacotar o MusicPod como um Flatpak!
Obrigado a todos os contribuidores do MPV!
Obrigado @amugofjava por criar o podcast_search muito fácil de usar e confiável!
Obrigado @alexmercerind pela biblioteca Mediakit de super desempenho e pela implementação do mpris_service dart!
Obrigado @KRTirtho pelo pacote smtc_windows muito fácil de usar e pelo Flutter Discord RPC
Obrigado @tomassasovsky pela implementação do dart do radiobrowser-api!
Obrigado @ClementBeal pelo leitor de metadados de áudio Dart super rápido e puro!
Obrigado @escamoteur por criar get_it e watch_it, o que tornou minha aplicação mais rápida e o código-fonte mais limpo!
Contribuições são altamente bem-vindas. Principalmente traduções. Faça um fork do MusicPod para o seu namespace GitHub, clone-o para o seu computador, crie um branch com seu nome, envie suas alterações para o seu branch local, envie-as para o seu fork e, em seguida, faça uma solicitação pull do seu fork para este repositório. Eu recomendo a extensão vscode GitHub Pull Requests especialmente para pessoas novas no Git e no GitHub.
Para traduções para o seu idioma, altere o arquivo app_xx.arb
correspondente, onde xx
é o código do idioma do seu idioma em letras minúsculas. Se o arquivo ainda não existir, crie-o e copie whole
o conteúdo de app_en.arb nele e altere apenas os valores da sua tradução, mas deixe as chaves intactas. O editor arb de extensão vscode do Google é altamente recomendado para evitar erros de sintaxe arb. Também recomendada é a extensão Google Translate.
Se você encontrar algum erro, sinta-se à vontade para relatá-lo como um problema e descrevê-lo da melhor maneira possível. Se você quiser contribuir com código, crie um problema primeiro.
Simulações de teste são geradas com Mockito. Você precisa executar o comando build_runner
para gerar novamente simulações, caso tenha alterado as assinaturas dos métodos de serviço.
dart run build_runner build
MusicPod é basicamente um front-end sofisticado para MPV! Sem ele ainda ficaria bonito, mas não reproduziria nenhuma mídia :D!
MusicPod usa o padrão de arquitetura MVVM, que mais se adapta às necessidades deste aplicativo reativo, e mantém todas as camadas separadas para que possamos trocar a implementação de uma camada se necessário. MVVM também é recomendado pelo próprio Flutter.
O app, o player, a busca e cada página principal possuem seu próprio conjunto de widgets, um ou mais modelos de visualização, que dependem de um ou mais serviços.
Todos os serviços e ViewModels são registrados lentamente via get_it, o que significa que eles não são instanciados até serem localizados pela primeira vez via di
ou di
.
fluxograma LR
preenchimento de visualização classDef:#0e84207d
preenchimento do modelo de visualização classDef:#e9542080
preenchimento do modelo classDef:#77216f80
Ver["`
**Visualizar**
(Widgets)
`"]:::view--watchProperty-->ViewModel["`
**Ver modelo**
(ChangeNotifier)
`"]:::viewmodel--ouvir/obter propriedades-->Model["`
**Modelo (Domínio)**
(Serviço)
`"]:::modelo
ViewModel--notify-->Ver
Modelo--changedProperties.add(true)-->ViewModel
Os ViewModels possuem dependências de serviços que são fornecidos por meio de seu construtor, onde estão localizados por meio do localizador de serviço get_it. Isso os torna fáceis de testar, pois você pode substituir os serviços por serviços simulados.
Os ViewModels são ChangeNotifiers. Eles podem usar o método notifyListener
que faz com que os ouvintes (concretos: classes de UI) reajam (ou seja, reconstruam).
Os ViewModels mantêm (a) StreamSubscription(s) para (os) serviços dos quais dependem. Se as propriedades forem apenas estados de UI não persistentes, elas serão mantidas dentro do ViewModel. Se forem mais do que isso, serão apenas buscadores de propriedades de serviço. Portanto, se uma propriedade de um serviço for alterada, os ViewModels serão notificados por meio do fluxo propertiesChanged e, se quisermos que a IU perceba, dentro do retorno de chamada listen
notificaremos a IU (ouvintes).
Em relação aos pacotes para implementar esta arquitetura tive uma longa jornada desde o provedor até o riverpod.
Eu encontrei minha solução favorita com get_it mais sua extensão watch_it porque isso se adapta ao máximo às necessidades deste aplicativo e da arquitetura MVVM sem ser muito invasivo na API da árvore de widgets flutter.
Dessa forma, todas as camadas ficam claramente separadas, fáceis de reimplementar e seguir, mesmo que isso traga um pouco de código clichê.
Se os Widgets quiserem ser reconstruídos assim que as propriedades dos ViewModels mudarem, usamos o método watchPropertyValue
do pacote watch_it:
final audio = watchPropertyValue (( PlayerModel m) => m.audio);
Isso torna tudo mais fácil, embora também possamos usar flutters integrados no ListenableBuilder.
Tanto as capas locais quanto as remotas são armazenadas em cache em um CoverStore
e em um UrlStore
depois de terem sido carregadas/buscadas.
A leitura das capas locais e a busca das capas remotas para dados de rádio acontecem dentro de isolados adicionais de segundo dardo.
As preferências são armazenadas com shared_preferences.