MusicPod adalah pemutar musik, radio, televisi, dan podcast lokal untuk Desktop Linux, MacOS, dan Windows. (Android direncanakan tetapi belum ada perkiraan kapan hal itu akan terjadi.)
sistem operasi | Bagaimana cara menginstal |
---|---|
Linux | atau |
jendela | Halaman Rilis |
macOS | Halaman Rilis |
Android | WIP |
Fitur | Linux Gelap | Linux Ringan | MacOS gelap | macOS ringan |
---|---|---|---|---|
Putar audio lokal | ||||
Temukan audio lokal yang diurutkan berdasarkan Metadata | ||||
Putar stasiun radio, dengan tag es dan karya seni muncul! | ||||
Putar dan unduh podcast, kemajuan aman, urutkan episode, dan banyak lagi! | ||||
Dukungan podcast video! | ||||
Temukan podcast, difilter sesuka Anda | ||||
Temukan stasiun radio, difilter sesuka Anda | ||||
Mode tampilan berbeda |
Ikon aplikasi dibuat oleh Stuart Jaggers, terima kasih banyak Stuart!
Terima kasih TheShadowOfHassen karena telah mengemas MusicPod sebagai Flatpak!
Terima kasih kepada semua kontributor MPV!
Terima kasih @amugofjava karena telah membuat podcast_search yang sangat mudah digunakan dan andal!
Terima kasih @alexmercerind untuk perpustakaan Mediakit yang berkinerja super dan implementasi dart mpris_service!
Terima kasih @KRTirtho atas paket smtc_windows dan Flutter Discord RPC yang sangat mudah digunakan
Terima kasih @tomassasovsky atas implementasi cepat radiobrowser-api!
Terima kasih @ClementBeal untuk Pembaca Metadata Audio yang super cepat dan murni!
Terima kasih @escamoteur karena telah membuat get_it dan watch_it, yang menjadikan aplikasi saya lebih cepat dan kode sumbernya lebih bersih!
Kontribusi sangat diharapkan. Terutama terjemahan. Harap fork MusicPod ke namespace GitHub Anda, kloning ke komputer Anda, buat cabang yang diberi nama Anda sendiri, komit perubahan Anda ke cabang lokal Anda, dorong ke fork Anda, lalu buat permintaan tarik dari fork Anda ke repositori ini. Saya merekomendasikan ekstensi vscode Permintaan Tarik GitHub terutama untuk orang yang baru mengenal Git dan GitHub.
Untuk terjemahan ke dalam bahasa Anda, ubah file app_xx.arb
yang sesuai dengan xx
adalah kode bahasa bahasa Anda dalam huruf kecil. Jika file belum ada, silakan buat dan salin whole
konten app_en.arb ke dalamnya dan ubah hanya nilai terjemahan Anda tetapi biarkan kuncinya tidak disentuh. Editor arb ekstensi vscode oleh Google sangat disarankan untuk menghindari kesalahan sintaksis arb. Juga direkomendasikan adalah Ekstensi Google Terjemahan.
Jika Anda menemukan kesalahan apa pun, silakan laporkan kesalahan tersebut sebagai masalah dan jelaskan sebaik mungkin. Jika Anda ingin menyumbangkan kode, harap buat masalah terlebih dahulu.
Tes tiruan dibuat dengan Mockito. Anda perlu menjalankan perintah build_runner
untuk membuat ulang tiruan, jika Anda mengubah tanda tangan metode layanan.
dart run build_runner build
MusicPod pada dasarnya adalah front-end yang mewah untuk MPV! Tanpa itu akan tetap terlihat bagus, tapi tidak bisa memutar media apa pun :D!
MusicPod menggunakan pola arsitektur MVVM, yang paling sesuai dengan kebutuhan aplikasi reaktif ini, dan memisahkan semua lapisan sehingga kita dapat menukar implementasi satu lapisan jika diperlukan. MVVM juga direkomendasikan oleh Flutter sendiri.
Aplikasi, pemutar, pencarian, dan setiap halaman utama memiliki kumpulan widgetnya sendiri, satu atau lebih model tampilan, yang bergantung pada satu atau lebih layanan.
Semua layanan dan ViewModel didaftarkan dengan lambat melalui get_it, yang berarti layanan dan ViewModel tersebut tidak dibuat instance-nya hingga ditempatkan untuk pertama kalinya melalui di
atau di
.
diagram alur LR
isi tampilan classDef:#0e84207d
isian model tampilan classDef:#e9542080
isian model classDef:#77216f80
Lihat["`
**Melihat**
(Widget)
`"]:::lihat--watchProperti-->ViewModel["`
**Model Tampilan**
(UbahPemberitahu)
`"]:::viewmodel--dengarkan/dapatkan properti-->Model["`
**Model (Domain)**
(Melayani)
`"]:::model
ViewModel--beritahu-->Lihat
Model--changedProperties.add(true)-->ViewModel
ViewModels memiliki ketergantungan pada layanan yang diberikan melalui konstruktornya, di mana mereka berada melalui pencari layanan get_it. Hal ini membuatnya mudah untuk diuji karena Anda dapat mengganti layanan dengan layanan tiruan.
ViewModels adalah ChangeNotifiers. Mereka dapat menggunakan metode notifyListener
yang membuat pendengar (konkret: kelas UI) bereaksi (yaitu membangun kembali).
ViewModels menyimpan (a) StreamSubscription ke layanan yang mereka andalkan. Jika properti hanya berupa status UI non-persisten, properti tersebut disimpan di dalam ViewModel. Jika lebih dari itu, mereka hanyalah pengambil properti layanan. Jadi jika properti suatu layanan berubah, ViewModels akan diberi tahu melalui aliran propertiChanged, dan jika kita ingin UI memperhatikannya, di dalam callback listen
kita akan memberi tahu UI (pendengar).
Mengenai paket untuk mengimplementasikan arsitektur ini, saya telah melalui perjalanan yang cukup panjang dari penyedia ke riverpod.
Saya menemukan solusi favorit pribadi saya dengan get_it ditambah ekstensi watch_it karena ini paling sesuai dengan kebutuhan aplikasi ini dan arsitektur MVVM tanpa terlalu invasif ke dalam API pohon widget flutter.
Dengan cara ini semua lapisan dipisahkan dengan jelas, mudah diimplementasikan kembali dan diikuti, meskipun ini membawa sedikit kode boilerplate.
Jika Widget ingin dibuat ulang setelah properti ViewModels berubah, kami menggunakan metode watchPropertyValue
dari paket watch_it :
final audio = watchPropertyValue (( PlayerModel m) => m.audio);
Hal ini membuatnya lebih mudah, meskipun kita juga bisa menggunakan flutter yang ada di ListenableBuilder.
Sampul lokal dan sampul jarak jauh di-cache di CoverStore
dan UrlStore
setelah dimuat/diambil.
Membaca sampul lokal dan mengambil sampul jarak jauh untuk data radio terjadi di dalam isolasi panah kedua tambahan.
Preferensi disimpan dengan shared_preferences.