عن المشروع

Tandem هو مشروع يستضيفه المستخدم في مرحلة ما قبل الإصدار (0.1.0، لا توجد إصدارات موسومة بعد)، وهدفه واضح: قراءة كتاب، والاستماع إلى الكتاب نفسه، وعدم فقدان مكانك أبدًا. يعمل الخادم في Docker إلى جانب PostgreSQL وتطبيق الويب، بينما يعمل React PWA وتطبيق Android المطور بـ Kotlin/Jetpack Compose كعملاء خفيفين. يتولى الخادم جميع الأعمال المتعلقة بالحالة؛ حيث يقوم بمسح مجلدات الكتب الإلكترونية والصوتية، واستخراج البيانات الوصفية والأغلفة، وربط الكتاب الإلكتروني بكتابه الصوتي، وتشغيل قائمة انتظار النسخ النصي، وتوليد خرائط المزامنة، وهو الكاتب الوحيد لموضع القراءة. يقرأ العملاء ويكتبون الموضع من خلال نقاط نهاية REST مع مصادقة JWT ويحتفظون فقط بذاكرة تخزين مؤقت محلية على الجهاز. القدرة المميزة للمشروع هي التسليم على مستوى الجملة بين التنسيقات. عند الانتقال من القراءة إلى الاستماع (أو العكس)، يتم الوصول إلى الجملة التي كنت عندها بدلاً من بداية الفصل، وذلك عبر الأجهزة المختلفة. يتطلب ذلك نصاً مكتوباً: حيث يتم نسخ الكتاب الصوتي ومحاذاته مع نص EPUB. يمكن تشغيل Whisper محلياً في صورة خادم مبنية بمجموعة الأدوات المحلية الاختيارية، أو بشكل افتراضي، يتم إرسال المهام إلى عامل Jetson منفصل (faster-whisper؛ حيث يعد Orin Nano 8 GB هو النشر المرجعي، مع نموذج medium افتراضياً). وتصاحب ذلك قائمة انتظار للنسخ النصي مع ميزات إعادة المحاولة، ونافذة لساعات غير الذروة، ومحرر للنصوص؛ علماً بأن النسخ النصي اختياري، وبدونه ستحصل على مكتبة وقارئين ولكن بدون مزامنة عبر التنسيقات. تشمل الميزات الأخرى الموصوفة ماسحاً للمكتبة مع تجميع السلاسل والربط التلقائي بين الكتب الإلكترونية والصوتية، وقارئ/مشغل ويب PWA مع عناصر تحكم في شاشة القفل (بالنسبة لمستخدمي iPhone، نظراً لعدم وجود تطبيق iOS)، وقارئ/مستمع Android مع تنزيلات بلا اتصال بالإنترنت، وتشغيل في الخلفية وAndroid Auto، وحسابات متعددة المستخدمين مع أدوار وتسجيل مقتصر على الدعوات افتراضياً، وتكاملات اختيارية (Audiobookshelf، وGoogle Books، وبيانات Open Library الوصفية، واستيرادات ACSM/Audible التي تتطلب بناء صورة خاصة)، بالإضافة إلى نسخ احتياطية ليلية لـ Postgres ولقطات للأغلفة يمكن استعادتها من واجهة المستخدم. يتم النشر عبر Docker Compose. يوضح ملف README بشكل صريح أن الأسرار يجب أن تكون في ملفات بدلاً من متغيرات البيئة (مفتاح JWT، وكلمة مرور Postgres، ومفاتيح تشفير الاعتمادات Fernet تحت مجلد secrets/)، وأن الخادم يجب أن يعمل كعملية واحدة لأن قائمة الانتظار والمجدولات محلية العملية، وأن التثبيت الجديد ينشئ حساب superadmin بكلمة مرور يتم إنشاؤها عشوائياً وتكتب في السجل، مما يفرض إعادة تعيينها عند تسجيل الدخول الأول. يتطلب إعداد الوكيل العكسي (reverse-proxy) ضبط FORWARDED_ALLOW_IPS، ويتم توفير مثال Caddyfile محصن. تغطي جداول متغيرات البيئة المكثفة الإعدادات الإلزامية والاختيارية، وخنق المصادقة، وحدود الرفع، وإعدادات المزامنة القابلة للضبط؛ كما يتم تعطيل وثائق API (/docs, /redoc) عمداً في بيئة الإنتاج. القيود الموثقة صريحة: دعم EPUB فقط للمزامنة (ملفات PDF يتم ربطها ولكن لا يتم محاذاتها أبداً؛ ويجب تحويل MOBI/AZW3)، ويجب أن تكون الكتب الصوتية ملفات واحدة (يتم تخطي النسخ متعددة الملفات، يجب دمجها إلى .m4b أولاً)، عملية نسخ نصي واحدة في المرة الواحدة، لا يوجد توسع أفقي، لا يوجد تطبيق iOS، لم يتم اختبار Android Auto على الأجهزة، لا يوجد تقرير عن الانهيارات في أي مكان، تم مؤخراً إضافة مسارات التنزيل/البث، ولا يوجد شيء في أي متجر تطبيقات. يوصف المشروع بأنه جهد يقوم به مطور واحد في استخدام يومي مع مجموعة اختبارات حقيقية ولكن بتعرض محدود للأجهزة وتخطيطات المكتبات بخلاف ما يملكه المؤلف.