MusicPod هو مشغل موسيقى وراديو وتلفزيون وبودكاست محلي لنظام التشغيل Linux Desktop وMacOS وWindows. (تم التخطيط لنظام Android ولكن لا يوجد وقت للوصول المتوقع حتى الآن عندما سيحدث.)
نظام التشغيل | كيفية التثبيت |
---|---|
لينكس | أو |
ويندوز | صفحة الإصدار |
ماك | صفحة الإصدار |
أندرويد | قيد التنفيذ |
سمات | الظلام لينكس | لايت لينكس | نظام التشغيل MacOS الداكن | لايت ماك |
---|---|---|---|---|
تشغيل الصوت المحلي | ||||
ابحث عن التسجيلات الصوتية المحلية مرتبة حسب البيانات الوصفية | ||||
تشغيل محطات الراديو، مع البحث عن علامات الجليد والأعمال الفنية! | ||||
قم بتشغيل وتنزيل ملفات podcast والتقدم الآمن وفرز الحلقات والمزيد! | ||||
دعم بودكاست الفيديو! | ||||
اكتشف ملفات البودكاست، التي تمت تصفيتها كما تريد | ||||
اكتشف محطات الراديو، التي تمت تصفيتها كما تريد | ||||
أوضاع عرض مختلفة |
تم تصميم أيقونة التطبيق بواسطة ستيوارت جاجرز، شكرًا جزيلاً لك ستيوارت!
شكرًا 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 خاصة للأشخاص الجدد في Git وGitHub.
للترجمات إلى لغتك، قم بتغيير ملف app_xx.arb
المطابق حيث xx
هو رمز اللغة الخاص بلغتك بالأحرف الصغيرة. إذا لم يكن الملف موجودًا بعد، فيرجى إنشائه ونسخ محتوى app_en.arb whole
فيه وتغيير القيم فقط لترجمتك مع ترك المفاتيح دون تغيير. يوصى بشدة باستخدام محرر vscode Extension arb من Google لتجنب أخطاء بناء جملة arb. يوصى أيضًا باستخدام ملحق الترجمة من Google.
إذا وجدت أي خطأ، فلا تتردد في الإبلاغ عنه كمشكلة ووصفه بأفضل ما يمكنك. إذا كنت تريد المساهمة بالكود، يرجى إنشاء مشكلة أولاً.
يتم إنشاء نماذج الاختبار باستخدام Mockito. تحتاج إلى تشغيل الأمر build_runner
من أجل إعادة إنشاء النماذج، في حالة قيامك بتغيير توقيعات أساليب الخدمة.
dart run build_runner build
MusicPod هو في الأساس واجهة أمامية رائعة لـ MPV! بدونها سيظل يبدو جميلًا، لكنه لن يقوم بتشغيل أي وسائط:D!
يستخدم MusicPod النمط المعماري MVVM، الذي يناسب احتياجات هذا التطبيق التفاعلي أكثر من غيره، ويحافظ على فصل جميع الطبقات حتى نتمكن من تبادل تنفيذ طبقة واحدة إذا أردنا ذلك. يوصى أيضًا بـ MVVM بواسطة Flutter نفسها.
يحتوي التطبيق والمشغل والبحث وكل صفحة رئيسية على مجموعة خاصة بهم من عناصر واجهة المستخدم، ونموذج عرض واحد أو أكثر، والذي يعتمد على خدمة واحدة أو أكثر.
يتم تسجيل جميع الخدمات وViewModels بتكاسل عبر get_it، مما يعني أنه لا يتم إنشاء مثيل لها حتى يتم تحديد موقعها لأول مرة عبر di
أو di
.
مخطط انسيابي LR
تعبئة عرض classDef:#0e84207d
تعبئة نموذج عرض classDef:#e9542080
تعبئة نموذج classDef:#77216f80
عرض["`
**منظر**
(الحاجيات)
`"]::view--watchProperty-->ViewModel["`
**نموذج العرض**
(منبه التغيير)
`"]:::viewmodel--استمع/احصل على الخصائص-->النموذج["`
**(المجال) النموذج**
(خدمة)
`"] :::نموذج
ViewModel--إخطار-->عرض
النموذج--changedProperties.add(true)-->ViewModel
لدى ViewModels تبعيات للخدمات المقدمة عبر منشئها، حيث توجد عبر محدد موقع الخدمة get_it. وهذا يجعلها سهلة الاختبار حيث يمكنك استبدال الخدمات بخدمات مستهزئة.
ViewModels هي ChangeNotifiers. يمكنهم استخدام طريقة notifyListener
التي تجعل المستمعين (الملموسين: فئات واجهة المستخدم) يتفاعلون (أي إعادة البناء).
يحتفظ ViewModels بـ (أ) StreamSubscription (اشتراكات) الخدمة (الخدمات) التي يعتمدون عليها. إذا كانت الخصائص عبارة عن حالة واجهة مستخدم غير ثابتة فقط، فسيتم الاحتفاظ بها داخل ViewModel. إذا كانوا أكثر من ذلك، فهم مجرد واصلين إلى خصائص الخدمة. لذا، إذا تغيرت إحدى خصائص الخدمة، فسيتم إخطار ViewModels عبر تدفق propertyChanged، وإذا أردنا أن تنتبه واجهة المستخدم، فسنقوم بإخطار واجهة المستخدم (المستمعين) داخل رد اتصال listen
.
فيما يتعلق بحزم تنفيذ هذه البنية، فقد قمت برحلة طويلة من المزود إلى Riverpod.
لقد وجدت الحل الشخصي المفضل لدي باستخدام get_it بالإضافة إلى امتداد watch_it الخاص به لأن هذا يناسب احتياجات هذا التطبيق وبنية MVVM بشكل أكبر دون التدخل بشكل كبير في واجهة برمجة التطبيقات (API) لشجرة عناصر واجهة المستخدم الرفرفة.
بهذه الطريقة يتم فصل جميع الطبقات بشكل واضح، مما يسهل إعادة تنفيذها ومتابعتها، حتى لو كان ذلك يجلب القليل من التعليمات البرمجية النمطية.
إذا كانت الأدوات ترغب في إعادة بنائها بمجرد تغيير خصائص ViewModels، فإننا نستخدم طريقة watchPropertyValue
لحزمة watch_it:
final audio = watchPropertyValue (( PlayerModel m) => m.audio);
هذا يجعل الأمر أسهل، على الرغم من أنه يمكننا أيضًا استخدام الرفرفة المضمنة في برنامج ListableBuilder.
يتم تخزين كل من الأغلفة المحلية والأغلفة البعيدة مؤقتًا في CoverStore
و UrlStore
بعد تحميلها/جلبها.
تتم قراءة الأغلفة المحلية وجلب الأغلفة البعيدة لبيانات الراديو داخل عزلات السهام الثانية الإضافية.
يتم تخزين التفضيلات باستخدام Shared_preferences.