MusicPod เป็นเครื่องเล่นเพลง วิทยุ โทรทัศน์ และพอดแคสต์ท้องถิ่นสำหรับ Linux Desktop, MacOS และ Windows (Android มีการวางแผนแต่ยังไม่มีการทางพิเศษแห่งประเทศไทยว่าจะเกิดขึ้นเมื่อใด)
ระบบปฏิบัติการ | วิธีการติดตั้ง |
---|---|
ลินุกซ์ | หรือ |
หน้าต่าง | หน้าวางจำหน่าย |
แมคโอเอส | หน้าวางจำหน่าย |
หุ่นยนต์ | วีไอพี |
คุณสมบัติ | ดาร์กลินุกซ์ | ไลท์ลินุกซ์ | MacOS สีเข้ม | MacOS แบบเบา |
---|---|---|---|---|
เล่นเสียงท้องถิ่น | ||||
ค้นหาไฟล์เสียงในเครื่องจัดเรียงตามข้อมูลเมตา | ||||
เล่นสถานีวิทยุพร้อมค้นหาแท็กน้ำแข็งและงานศิลปะ! | ||||
เล่นและดาวน์โหลดพอดแคสต์ ความคืบหน้าอย่างปลอดภัย จัดเรียงตอน และอื่นๆ อีกมากมาย! | ||||
รองรับวิดีโอพอดแคสต์! | ||||
ค้นพบพอดแคสต์ที่กรองตามที่คุณต้องการ | ||||
ค้นหาสถานีวิทยุที่กรองตามที่คุณต้องการ | ||||
โหมดมุมมองที่แตกต่างกัน |
ไอคอนแอปนี้สร้างโดย Stuart Jaggers ขอบคุณมาก Stuart!
ขอบคุณ TheShadowOfHassen สำหรับการบรรจุ MusicPod เป็น Flatpak!
ขอขอบคุณผู้สนับสนุน MPV ทุกท่าน!
ขอบคุณ @amugofjava ที่สร้าง podcast_search ที่ใช้งานง่ายและเชื่อถือได้!
ขอบคุณ @alexmercerind สำหรับไลบรารี Mediakit ประสิทธิภาพสูงและการใช้งาน mpris_service dart!
ขอบคุณ @KRTirtho สำหรับแพ็คเกจ smtc_windows ที่ใช้งานง่ายและ Flutter Discord RPC
ขอบคุณ @tomassasovsky สำหรับการใช้งานโผ radiobrowser-api!
ขอบคุณ @ClementBeal สำหรับเครื่องอ่านเมตาดาต้าเสียงโผที่รวดเร็วและบริสุทธิ์!
ขอบคุณ @escamoteur ที่สร้าง get_it และ watch_it ซึ่งทำให้แอปพลิเคชันของฉันเร็วขึ้นและซอร์สโค้ดสะอาดขึ้น!
ยินดีเป็นอย่างยิ่ง โดยเฉพาะงานแปล โปรดแยก MusicPod ไปยังเนมสเปซ GitHub ของคุณ โคลนไปยังคอมพิวเตอร์ของคุณ สร้างสาขาที่ตั้งชื่อด้วยตัวเอง ยืนยันการเปลี่ยนแปลงของคุณกับสาขาในพื้นที่ของคุณ พุชไปที่ทางแยกของคุณ จากนั้นทำการดึงคำขอจากทางแยกของคุณไปยังที่เก็บนี้ ฉันขอแนะนำส่วนขยาย vscode GitHub Pull Requests โดยเฉพาะสำหรับผู้ที่เพิ่งเริ่มใช้ Git และ GitHub
สำหรับการแปลเป็นภาษาของคุณ ให้เปลี่ยนไฟล์ app_xx.arb
ที่เกี่ยวข้อง โดยที่ xx
คือรหัสภาษาของภาษาของคุณที่เป็นตัวพิมพ์เล็ก หากไฟล์ยังไม่มีอยู่ โปรดสร้างมันขึ้นมาและคัดลอกเนื้อหา whole
ของ app_en.arb ไปไว้ในนั้น และเปลี่ยนเฉพาะค่าในการแปลของคุณ แต่ปล่อยคีย์ไว้โดยไม่มีใครแตะต้อง ขอแนะนำอย่างยิ่งให้ใช้เครื่องมือแก้ไข arb ส่วนขยาย vscode โดย Google เพื่อหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์ของ arb ที่แนะนำคือส่วนขยายของ Google Translate
หากคุณพบข้อผิดพลาดใด ๆ โปรดรายงานปัญหาและอธิบายให้ดีที่สุดเท่าที่จะทำได้ หากคุณต้องการสนับสนุนโค้ด โปรดสร้างปัญหาก่อน
การทดสอบจำลองถูกสร้างขึ้นด้วย Mockito คุณต้องรันคำสั่ง build_runner
เพื่อสร้างการจำลองใหม่ ในกรณีที่คุณเปลี่ยนลายเซ็นของวิธีการบริการ
dart run build_runner build
MusicPod นั้นเป็นฟรอนต์เอนด์ที่หรูหราสำหรับ MPV! หากไม่มีมันก็ยังดูดี แต่มันไม่สามารถเล่นสื่อใดๆ ได้ :D!
MusicPod ใช้รูปแบบสถาปัตยกรรม MVVM ซึ่งตรงกับความต้องการของแอปแบบโต้ตอบนี้มากที่สุด และแยกเลเยอร์ทั้งหมดออกจากกัน เพื่อให้เราสามารถแลกเปลี่ยนการใช้งานเลเยอร์เดียวได้หากจำเป็น Flutter เองก็แนะนำ MVVM เช่นกัน
แอป โปรแกรมเล่น การค้นหา และหน้าหลักแต่ละหน้ามีชุดวิดเจ็ตของตัวเอง รูปแบบการดูตั้งแต่หนึ่งรายการขึ้นไป ซึ่งขึ้นอยู่กับบริการหนึ่งรายการขึ้นไป
บริการและ ViewModels ทั้งหมดได้รับการลงทะเบียนอย่างเกียจคร้านผ่าน get_it ซึ่งหมายความว่าจะไม่สร้างอินสแตนซ์จนกว่าจะพบเป็นครั้งแรกผ่าน di
หรือ di
ผังงาน LR
มุมมอง classDef เติม:#0e84207d
classDef viewmodel เติม:#e9542080
เติมโมเดล classDef:#77216f80
ดู["`
**ดู**
(วิดเจ็ต)
`"]:::view--watchProperty-->ViewModel["`
**ดูรุ่น**
(ตัวแจ้งเตือนการเปลี่ยนแปลง)
`"]:::viewmodel--ฟัง/รับคุณสมบัติ-->รุ่น["`
**(โดเมน) รุ่น**
(บริการ)
`"]:::รุ่น
ViewModel--แจ้งเตือน-->ดู
โมเดล--changedProperties.add(true)-->ViewModel
ViewModels มีการพึ่งพาบริการที่ได้รับผ่าน Constructor โดยที่บริการเหล่านั้นตั้งอยู่ผ่านตัวระบุตำแหน่งบริการ get_it ทำให้ง่ายต่อการทดสอบเนื่องจากคุณสามารถแทนที่บริการด้วยบริการที่เยาะเย้ยได้
ViewModels คือ ChangeNotifiers พวกเขาสามารถใช้เมธอด notifyListener
ซึ่งทำให้ผู้ฟัง (คอนกรีต: คลาส UI) ตอบสนอง (เช่น สร้างใหม่)
ViewModels เก็บ (ก) StreamSubscription (s) ถึง () บริการที่พวกเขาขึ้นอยู่กับ หากคุณสมบัติเป็นเพียงสถานะ UI ที่ไม่ถาวร คุณสมบัติเหล่านั้นจะถูกเก็บไว้ใน ViewModel หากมากกว่านั้น พวกเขาก็แค่ได้เข้าถึงคุณสมบัติการบริการเท่านั้น ดังนั้นหากคุณสมบัติของบริการมีการเปลี่ยนแปลง ViewModels จะได้รับการแจ้งเตือนผ่านกระแส propertiesChanged และหากเราต้องการให้ UI แจ้งให้ทราบ ภายใน listen
Callback เราจะแจ้ง UI (ผู้ฟัง)
เกี่ยวกับแพ็คเกจเพื่อใช้สถาปัตยกรรมนี้ ฉันใช้เวลาเดินทางจากผู้ให้บริการไปยังริเวอร์พอดค่อนข้างนาน
ฉันพบโซลูชันส่วนตัวที่ฉันชื่นชอบด้วย get_it บวกกับส่วนขยาย watch_it เนื่องจากสิ่งนี้เหมาะกับความต้องการของแอปพลิเคชันนี้และสถาปัตยกรรม MVVM มากที่สุดโดยไม่รุกราน API ของแผนผังวิดเจ็ตที่กระพือปีกเกินไป
วิธีนี้จะทำให้เลเยอร์ทั้งหมดแยกออกจากกันอย่างชัดเจน นำไปใช้ใหม่ได้ง่าย และปฏิบัติตามได้ง่าย แม้ว่าจะทำให้มีโค้ดสำเร็จรูปเล็กน้อยก็ตาม
หากวิดเจ็ตต้องการสร้างใหม่เมื่อคุณสมบัติของ ViewModels เปลี่ยนไป เราจะใช้เมธอด watchPropertyValue
ของแพ็คเกจ watch_it:
final audio = watchPropertyValue (( PlayerModel m) => m.audio);
สิ่งนี้ทำให้ง่ายขึ้น แม้ว่าเราจะสามารถใช้ flutters ที่สร้างใน ListenableBuilder ก็ได้
ทั้งหน้าปกในเครื่องและหน้าปกระยะไกลจะถูกแคชไว้ใน CoverStore
และ UrlStore
หลังจากที่โหลด/ดึงข้อมูลแล้ว
การอ่านหน้าปกในเครื่องและการดึงข้อมูลหน้าปกระยะไกลสำหรับข้อมูลวิทยุจะเกิดขึ้นภายในส่วนแยกลูกดอกที่สองเพิ่มเติม
การตั้งค่าจะถูกเก็บไว้กับ shared_preferences