تخط إلى المحتوى

نموذج البيانات

فهرس bae هو SQLite عادي، يعلنه إلى coven جدولًا بجدول: تحمل الجداول المتزامنة ساعة تعارض وتنتقل إلى كل جهاز؛ والجداول غير المعلنة لا تغادر الجهاز أبدًا. هذا الفصل هو القرار الأثقل في نموذج البيانات، لذلك تُنظم هذه الصفحة حوله.

قلب المخطط المتزامن:

  • artists، albums، works: طبقة التجميع. يجمع الألبوم إصداراته ويشير إلى إصدار primary؛ وتشكل الأعمال رسمًا أبويًا/فرعيًا للبنية الكلاسيكية.
  • releases: الكيان المركزي، صف واحد لكل طبعة. يحمل حقائق الطبعة (الملصق، ورقم الفهرس، وbarcode، والبلد، والصيغة، والسنة)، ومصدر البيانات الوصفية، وcontent hash للمجلد المستورد، والجهارة المقاسة للألبوم.
  • release_identities: ما هو الإصدار، حسب المصدر. عدم وجود صفوف يعني مجهول؛ صف MusicBrainz أو Discogs مع release ID يعني دقيق؛ ومن دونه يعني تقريبي. يستطيع الإصدار حمل هويات في المصدرين معًا.
  • tracks مع track_artists، إضافة إلى release_artist_roles و**track_artist_roles**: قوائم المسارات والاعتمادات، وكل اعتماد موسوم بمصدره.
  • track_works، work_parts، work_artists: تسجيلات مرتبطة بالأعمال التي تؤديها.
  • audio_formats و**audio_format_segments**: مواصفات التشغيل. لكل مسار: codec، ومعدل العينة، وعمق البت، والقنوات، والجهارة والذروة المقاسان، وأطوال pregap. تربط المقاطع المسار بنوافذ بايت وعينات مرتبة من ملفاته المصدرية، وهذا ما يسمح لمسار نسخة CUE، بما في ذلك pregap، أن يمتد عبر مناطق من ملف كبير واحد أو عدة ملفات.
  • release_files، covers، artist_images: جداول تحمل blobs. الصفوف مدخلات فهرس؛ والبايتات تعيش في طبقة blob الخاصة بـ coven (انظر أدناه).

متزامن، مشروط، محلي

رابط إلى هذا القسم

كل ما سبق يتزامن، لكن ليس بلا شرط. يُعلن releases كجذر مشروط على عموده remote: لا يتزامن صف الإصدار وشجرته كلها (المسارات، والملفات، والاعتمادات، والصيغ، والغلاف) إلا عندما يكون remote صحيحًا، أي عندما يكون الإصدار مُدارًا سحابيًا. تحويل إصدار إلى مُدار ينشر الشجرة؛ ويبقى الإصدار غير المُدار بالكامل على الجهاز المستورد، حتى إن كان مخططه متزامنًا. لا تتزامن الجداول السلفية (artists، albums، works) إلا ما دام هناك إصدار متزامن يشير إليها، لذلك لا يتلقى جهاز فنانًا لا شيء تحته.

جداول محلية بالكامل، لا تُعلن إلى coven:

  • playback_state: المسار الحالي، والموضع، والطابور، ومستوى الصوت، والخلط والتكرار. التشغيل حقيقة جهاز.
  • imports: تتبع عملية الاستيراد.
  • release_metadata: JSON الخام المؤرشف من MusicBrainz وDiscogs، محفوظ لإعادة تفسير لاحقة.

يحمل كل جدول متزامن عمود _updated_at لساعة منطقية هجينة، وهو السجل الذي يرتب به دمج coven حقلًا بحقل التعديلات المتزامنة؛ ويؤكد اختبار أن مجموعة الجداول المتزامنة ومجموعة الجداول الحاملة للساعة متساويتان تمامًا.

يمر الصوت والصور عبر طبقة blob في coven ضمن ثلاثة نطاقات، لكل منها ميزانية ذاكرة مخبأة خاصة بالجهاز: release_files (20 GiB)، وcovers (512 MiB)، وartist_images (256 MiB).

ملفات الإصدار يقدّمها المستخدم وتُخبأ عند الحاجة: في الإصدار غير المُدار يكون blob مرجعًا خارجيًا إلى ملف المستخدم في مساره الأصلي؛ وفي الإصدار المُدار يكون كائنًا مرفوعًا يُجلب إلى الذاكرة المخبأة عند أول قراءة. الأغلفة وصور الفنانين يقدّمها المضيف وتُخبأ مسبقًا: ينتج bae البايتات (تُعاد صياغة الأغلفة كصور JPEG مصغرة لا يزيد عرضها عن 600px)، ويجلبها كل جهاز عند السحب حتى تُعرض الشبكات محليًا.

على موطن معتم، تُرفع blobs تحت مفاتيح محتوى بلا معنى. وعلى موطن قابل للتصفح، يسجل كل صف blob مسارًا سحابيًا مقروءًا ({artist}/{album}/{filename} للصوت، و{album}/{release}/cover.{ext} للأغلفة)، محسوبًا مرة عند الرفع حتى لا تنقل إعادة تسمية لاحقة الكائن.

هوية النسخة الصوتية

رابط إلى هذا القسم

releases.content_hash هو SHA-256 على بنية ملفات المجلد المستورد (المسارات النسبية والأحجام)، مستقلًا عن مكان وجود المجلد على القرص. به يتعرف bae على نسخة صوتية مستوردة سابقًا عندما تظهر مرة أخرى في مجلد مراقب، وبه تجد إعادة الاستيراد الإصدار الذي ينبغي أن تستبدله.