דילוג לתוכן

מודל נתונים

הקטלוג של bae הוא SQLite רגיל, מוצהר ל-coven טבלה אחר טבלה: טבלאות מסונכרנות נושאות שעון התנגשות ונוסעות לכל מכשיר; טבלאות שלא הוצהרו לעולם לא עוזבות את המכשיר. החלוקה היא ההחלטה המרכזית במודל הנתונים, לכן הדף הזה מאורגן סביבה.

גרף הקטלוג

קישור למקטע הזה

הלב המסונכרן של הסכמה:

  • artists, albums, works: שכבת הקיבוץ. אלבום מאגד את ההוצאות שלו ומצביע על הוצאה ראשית; יצירות יוצרות גרף הורה/ילד למבנה קלאסי.
  • 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: מפרטי הניגון. לכל רצועה: קודק, קצב דגימה, עומק סיביות, ערוצים, עוצמת שמע ושיא נמדדים, ואורכי pregap. מקטעים ממפים רצועה לחלונות בתים ודגימות מסודרים של קובצי המקור שלה, וכך רצועה מריפ CUE, כולל pregap, יכולה להשתרע על אזורים של קובץ גדול אחד, או כמה קבצים.
  • release_files, covers, artist_images: טבלאות שנושאות אובייקטים בינאריים. השורות הן רשומות קטלוג; הבתים חיים בשכבת האובייקטים הבינאריים של coven (ראה למטה).

מסונכרן, מותנה, מקומי

קישור למקטע הזה

כל מה שמעל מסתנכרן, אבל לא בלי תנאי. releases מוצהרת כשורש מותנה על העמודה remote: שורת הוצאה וכל תת־העץ שלה (רצועות, קבצים, קרדיטים, פורמטים, עטיפה) מסתנכרנים רק בזמן ש-remote הוא true, כלומר בזמן שההוצאה מנוהלת בענן. העברת הוצאה למנוהלת מפרסמת את תת־העץ; הוצאה לא מנוהלת נשארת לגמרי במכשיר המייבא, אף שהסכמה שלה מסונכרנת. טבלאות האב (artists, albums, works) מסתנכרנות רק בזמן שהוצאה מסונכרנת כלשהי עדיין מפנה אליהן, כך שמכשיר לעולם לא מקבל אמן בלי שום דבר תחתיו.

טבלאות מקומיות לגמרי, שלא מוצהרות ל-coven לעולם:

  • playback_state: רצועה נוכחית, מיקום, תור, עוצמה, ערבוב וחזרה. ניגון הוא עובדת מכשיר.
  • imports: מעקב אחר פעולות ייבוא.
  • release_metadata: JSON גולמי מאורכב מ-MusicBrainz ו-Discogs, נשמר לפרשנות מחדש בעתיד.

כל טבלה מסונכרנת נושאת עמודת _updated_at של שעון לוגי היברידי, הרשומה שלפיה המיזוג שדה אחרי שדה של coven מסדר עריכות מקבילות; בדיקה אוכפת שקבוצת הטבלאות המסונכרנות וקבוצת הטבלאות שנושאות שעון זהות בדיוק.

אובייקטים בינאריים

קישור למקטע הזה

שמע ותמונות עוברים דרך שכבת האובייקטים הבינאריים של coven בשלושה מרחבי שמות, לכל אחד תקציב מטמון מכשיר משלו: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB).

קובצי הוצאה מסופקים על ידי המשתמש ונשמרים במטמון עצל: בהוצאה לא מנוהלת האובייקט הבינארי הוא הפניה חיצונית לקובץ של המשתמש בנתיב המקורי שלו; בהוצאה מנוהלת הוא אובייקט שהועלה ונמשך למטמון בקריאה הראשונה. עטיפות ותמונות אמנים מסופקות על ידי המארח ונשמרות במטמון מוקדם: bae מייצר את הבתים (עטיפות נוצרות מחדש כתמונות JPEG ממוזערות ברוחב עד 600px), וכל מכשיר מושך אותן בסנכרון נכנס כך שרשתות יוצגו מקומית.

בבית אטום, אובייקטים בינאריים עולים תחת מפתחות תוכן חסרי משמעות. בבית ניתן לעיון, כל שורת אובייקט בינארי רושמת נתיב ענן קריא ({artist}/{album}/{filename} לשמע, {album}/{release}/cover.{ext} לעטיפות), שמחושב פעם אחת בהעלאה כך ששינוי שם מאוחר יותר לא מזיז את האובייקט.

זהות של ריפ

קישור למקטע הזה

releases.content_hash הוא SHA-256 על מבנה הקבצים של התיקייה שיובאה (נתיבים יחסיים וגדלים), בלי תלות במקום שבו התיקייה יושבת בדיסק. כך bae מזהה ריפ שכבר יובא כשהוא מופיע שוב בתיקייה במעקב, וכך ייבואים חוזרים מוצאים את ההוצאה שהם צריכים להחליף.