أثناء العمل والمشي ، أستمع غالبًا إلى موسيقى الخلفية. اعتدت استخدام راديو إنترنت يسمى Jango ، والذي يناسب الجميع تقريبًا ، باستثناء الأشياء التالية:
- عدم إمكانية الوصول أثناء المشي يوميًا تقريبًا في الغابة (أي بدون اتصال بالإنترنت).
- الحاجة إلى التبديل بين القنوات المختلفة من أجل تغيير نوع الموسيقى. وبعبارة أخرى ، فإن مستمع Jango لديه فرصة ضئيلة لاكتشاف أنواع موسيقية جديدة.
في يوم من الأيام توصلت الفكرة إلى تطبيق للهاتف المحمول للاستماع إلى الموسيقى ، والذي يمكن أن يعمل معظم الوقت بدون الإنترنت (أي الموسيقى المخزنة مؤقتًا) مع اكتشاف تلقائي لتفضيلات المستخدم الموسيقية. لم أر شيئًا كهذا (ربما نظرت بشكل سيء؟) ، لذلك قررت أن أطبقه بنفسي. الآن ، بعد عدة أشهر من الترميز في وقت فراغي من العمل الرئيسي ، نشرت الإصدار الأول ، الذي لا يزال خامًا للغاية ، ولكنه يعمل بالفعل من تطبيق Android .

أردت تنفيذ تطبيق بواجهة بسيطة وبديهية للغاية (في الواقع ، مع زرين فقط: "pause" و "skip") ، ولكن مع منطق داخلي متقدم بما فيه الكفاية لتحليل التفضيلات الموسيقية (استنادًا إلى جمع إحصائيات عن مدة الاستماع إلى المقطوعات قبل تخطيها) وتخزين المسارات. نظرًا لأنني لم أرغب في تكرار المنطق لأنظمة أساسية مختلفة ، فقد تقرر تطبيقه في الإصدار C ++ (وهو "القاسم المشترك" لنظامي التشغيل iOS و Android).
لتخزين البيانات الوصفية عن المسارات ، وكذلك تفضيلات المستخدم ، اخترت سكليتي. يتم تخزين ملفات غلاف الألبوم والموسيقى في شجرة دليل مستندة إلى التجزئة من ثلاثة مستويات (على غرار طريقة عملها في Git).
اختار 512 ميجابايت حجم ذاكرة التخزين المؤقت (يمكن تكوين هذه الأرقام وأي أرقام أخرى ، بالطبع). منطق دوران المسارات هو كما يلي: يتم تنزيل 20 مسارًا لكل تكرار تحديث. بعد أن يستمع المستخدم إلى كل مسار على الأقل مرتين ، يتم بدء تحديث جديد. يتم حذف المسارات التي يكون متوسط وقت الاستماع فيها أقل من الحد المحدد ، ويتم تنزيل البيانات الوصفية للمسارات الجديدة من الخادم ، وبعدها يبدأ التنزيل.
منطق التشغيل هو على النحو التالي. كلما طال متوسط مدة الاستماع للمقطوعة ، زاد عدد مرات تشغيلها.
كوني مطور C ++ ذي خبرة ، لم أواجه أي صعوبات خاصة في تنفيذ المنطق الموضح أعلاه (على الرغم من أنه في الواقع أكثر تعقيدًا إلى حد ما). ومع ذلك ، نظرًا لعدم وجود خبرة في كتابة تطبيقات Android ، اضطررت إلى قضاء الكثير من الوقت والجهد في تنفيذ طبقة البرامج المناسبة (خاصة واجهة المستخدم). أنا متأكد من أن العديد من الأشياء يتم تنفيذها الآن وليس بأفضل طريقة.
قررت أن أكتب غلاف Android في Kotlin. في الواقع ، لم تعد Java بأي مزايا ، لأنه لا يزال يتعين عليك العبث مع JNI (في نظام التشغيل iOS ، سيكون الوضع مختلفًا ، فهناك الهدف- C أكثر ملاءمة من Swift من حيث التكامل مع رمز المنطق الأساسي الأصلي).
لقد استخدمت Fuel لتنزيل JSON metadata ، و Fetch لتنزيل الملفات (فوجئت أن Fuel غير قادر على تنزيل الملفات بكفاءة). بالمناسبة ، إلى المكتبة الثانية لدي شكاوى حول استقرار العمل.
تمت كتابة رمز الخادم بلغة Golang ويستخدم PostgreSQL من خلال الإصلاح . تم إنشاء قاعدة بيانات البيانات التعريفية الحالية عن طريق فهرسة أرشيف الموسيقى الحرة ، وفي المستقبل أخطط لفهرسة المصادر المفتوحة الأخرى أيضًا. لم يتم تخزين المسارات على الخادم حتى الآن لتوفير مساحة (يمكنني الحفظ على الاستضافة) ، ولكن الرجوع مباشرة إلى مستودع المصدر.
يجمع الخادم إحصائيات الاستماع إلى المقاطع الصوتية لكل مستخدم. وبالتالي ، يتم تعيين درجة تفضيل لكل نوع موسيقي يؤثر على احتمال اختيار التراكيب المناسبة أثناء الدوران.
سأكون سعيدا إذا جربت طلبي. فجأة سوف تحب ذلك. بالتأكيد أثناء الاستخدام ، ستواجه أخطاء (البرنامج لا يزال خامًا). تعتمد سرعة تصحيحها بشكل مباشر على الطلب على عملي.