বিষয়ে যান

ডেটা মডেল

bae-এর তালিকা সাধারণ SQLite, coven-কে টেবিল ধরে জানানো হয়: সিঙ্ক হওয়া টেবিল conflict clock বহন করে এবং প্রতিটি ডিভাইসে যায়; না-জানানো টেবিল কখনও ডিভাইস ছাড়ে না। এই ভাগটাই ডেটা মডেলের মূল সিদ্ধান্ত, তাই পৃষ্ঠাটি সেটিকে কেন্দ্র করে সাজানো।

তালিকার graph

এই অংশের লিঙ্ক

স্কিমার সিঙ্ক হওয়া কেন্দ্র:

  • artists, albums, works: গোষ্ঠী করার স্তর। একটি অ্যালবাম তার রিলিজগুলো এক করে এবং primary one-এ point করে; work ধ্রুপদী গঠনের জন্য parent/child graph তৈরি করে।
  • releases: কেন্দ্রীয় উপাদান, প্রতি চাপ দেওয়ার জন্য একটি সারি। চাপ দেওয়ার তথ্য (লেবেল, ক্যাটালগ নম্বর, বারকোড, দেশ, ফরম্যাট, বছর), বৈকল্পিক মেটাডাটা উৎস, আমদানিকৃত ফোল্ডারের বিষয়বস্তু হ্যাশ, এবং পরিমাপকৃত অ্যালবাম শব্দের পরিমাণ বহন করে। কোন উৎস না থাকার অর্থ মেটাডাটা সরাসরি প্রবেশ করা হয়েছে; বহিস্থিত উৎস নামের সঠিক উৎস প্রকাশ, যখন ফাইলের ট্যাগ একটি স্থানীয় স্ন্যাপশট উৎস রেকর্ড করে।
  • release_identities: একটি রিলিজ হচ্ছে এর সঠিক বহিরাগত পরিচয়। কোন সারির অর্থ কোন বহিরাগত পরিচয় নেই। প্রতিটি সারিতে MusicBrainz অথবা Discogs রিলিজ এবং রিলিজ গ্রুপের নাম থাকে, এবং একটি রিলিজ একই সাথে উভয় উৎস থেকে পরিচয় রাখতে পারে। এটি উৎস থেকে পৃথক: বর্তমান সম্পাদনযোগ্য মেটাডাটা সেই উৎস থেকে পুনরায় সেট করা হয়েছে বলে দাবি না করে পরিচয় পরিবর্তন করা যেতে পারে।
  • tracks সহ track_artists, plus release_artist_rolestrack_artist_roles: ট্র্যাক-তালিকা ও কৃতিত্ব, প্রতিটি কৃতিত্ব তার উৎসসহ tagged।
  • track_works, work_parts, work_artists: recording যে work perform করে তার সঙ্গে linked।
  • audio_formatsaudio_format_segments: প্লেব্যাক-বিবরণ। প্রতি ট্র্যাক: codec, sample rate, bit depth, channel, measured loudness ও peak, এবং pregap length। Segment একটি ট্র্যাককে তার উৎস ফাইলের ordered byte ও sample window-তে map করে; এই কারণেই CUE rip-এর track, pregap সহ, এক বড় file বা একাধিক file-এর region জুড়ে থাকতে পারে।
  • release_files, covers, artist_images: blob-বহনকারী টেবিল। সারি হলো তালিকার entry; bytes coven-এর blob layer-এ থাকে (নিচে দেখুন)।

সিঙ্ক হওয়া, gate-সহ, স্থানীয়

এই অংশের লিঙ্ক

উপরের সব সিঙ্ক হয়, কিন্তু নিঃশর্ত নয়। releases তার remote column-এ gated root হিসেবে declared: একটি release row এবং তার পুরো subtree (track, file, credit, format, cover) শুধু remote true থাকলে সিঙ্ক হয়, অর্থাৎ রিলিজ মেঘে-পরিচালিত থাকলে। রিলিজ পরিচালিত করলে subtree published হয়; অ-পরিচালিত রিলিজ ইম্পোর্টকারী ডিভাইসেই পুরো থাকে, যদিও তার স্কিমা সিঙ্ক হওয়া। Ancestor table (artists, albums, works) শুধু তখন সিঙ্ক হয় যখন কোনো সিঙ্ক হওয়া রিলিজ এখনও সেগুলো reference করে, তাই কোনো ডিভাইস কখনও নিচে কিছু নেই এমন artist পায় না।

সম্পূর্ণ স্থানীয় টেবিল, coven-এ কখনও declared নয়:

  • playback_state: current track, position, queue, volume, shuffle ও repeat। Playback একটি device fact।
  • imports: ইম্পোর্টের কাজ tracking।
  • source_release_payloads: MusicBrainz এবং Discogs থেকে আর্কাইভকৃত কাঁচা JSON, স্থানীয় মুক্তির পরিবর্তে প্রদানকারীর মুক্তি দ্বারা কী করা। এটি সুসংগত ক্যাটালগ গ্রাফ পরিবর্তন না করেই সঠিকভাবে পুনঃনির্ধারণ এবং পুনরায় ব্যাখ্যা সমর্থন করে।

প্রতিটি সিঙ্ক হওয়া table _updated_at hybrid-logical-clock column বহন করে, যেটি coven-এর field-by-field merge concurrent edit order করতে ব্যবহার করে; একটি test নিশ্চিত করে synced set এবং clock-carrying set ঠিক এক।

অডিও ও ছবি coven-এর blob layer দিয়ে যায়, তিন namespace-এ, প্রতিটির নিজের device cache budget আছে: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB)।

রিলিজ-ফাইল ব্যবহারকারীর দেওয়া এবং দরকার হলে ক্যাশে আসে: অ-পরিচালিত রিলিজের জন্য blob হলো original path-এ user file-এর external reference; পরিচালিত হলে uploaded object প্রথম read-এ cache-এ fetched হয়। Cover ও artist image host-provided এবং eagerly cached: bae bytes তৈরি করে (cover সর্বোচ্চ 600px চওড়া JPEG thumbnail হিসেবে re-rendered), আর প্রতিটি ডিভাইস pull করলে সেগুলো fetch করে যাতে grid local-এ render হয়।

Opaque ঘরে blob অর্থহীন content key-র নিচে upload হয়। Browsable ঘরে প্রতিটি blob row readable cloud path record করে (audio-র জন্য {artist}/{album}/{filename}, cover-এর জন্য {album}/{release}/cover.{ext}), upload-এর সময় একবার computed, তাই পরে rename হলে object নড়ে না।

একটি rip-এর পরিচয়

এই অংশের লিঙ্ক

releases.content_hash imported folder-এর file structure (relative path ও size)-এর উপর SHA-256, folder disk-এ কোথায় আছে তার উপর নয়। Watched folder-এ একই rip আবার দেখা দিলে bae এভাবেই already-imported হিসেবে চেনে, আর re-import বুঝে কোন release replace করতে হবে।