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

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

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

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

  • artists، albums، works: طبقة التجميع. يجمع الألبوم إصداراته ويشير إلى إصدار primary؛ وتشكل الأعمال رسمًا أبويًا/فرعيًا للبنية الكلاسيكية.
  • releases: الكيان المركزي، صف واحد لكل ضغط. يحمل حقائق الضغط (العلامة، رقم الفهرس، رمز الخطوط المتوازية، البلد، الشكل، السنة)، منشأ البيانات الوصفية الاختيارية، محتويات الملف المستورد، وقياس صوت الألبوم. لا مصدر يعني أن البيانات الوصفية قد تم إدخالها مباشرة؛ المصدر الخارجي يسمي الإصدار المصدر بالضبط، في حين أن وسوم الملفات يسجل مصدر لقطة سريعة محلية.
  • release_identities: هويات خارجية دقيقة لما هو الإصدار هو. لا صفوف تعني لا هوية خارجية. كل صف يسمي إصدار MusicBrainz أو Discogs ومجموعة إصدار، ويمكن للإصدار أن يحتفظ بهوية في كلا المصدرين في وقت واحد. هذا منفصل عن المنشأ: يمكن أن تتغير الهوية دون الادعاء بأن البيانات الوصفية الحالية القابلة للتحرير قد أعيدت من ذلك المصدر.
  • 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: تتبع عملية الاستيراد.
  • source_release_payloads: محفوظات 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 على نسخة صوتية مستوردة سابقًا عندما تظهر مرة أخرى في مجلد مراقب، وبه تجد إعادة الاستيراد الإصدار الذي ينبغي أن تستبدله.