ডেটা মডেল
bae-এর তালিকা সাধারণ SQLite, coven-কে টেবিল ধরে জানানো হয়: সিঙ্ক হওয়া টেবিল এমন প্রতিটি ডিভাইসে যায় যা সেগুলো পড়তে পারে; না-জানানো টেবিল কখনও ডিভাইস ছাড়ে না। এই ভাগটাই ডেটা মডেলের মূল সিদ্ধান্ত, তাই পৃষ্ঠাটি সেটিকে কেন্দ্র করে সাজানো।
তালিকার graph
এই অংশের লিঙ্কস্কিমার সিঙ্ক হওয়া কেন্দ্র:
artists,albums,works: গোষ্ঠী করার স্তর। একটি অ্যালবাম তার রিলিজগুলো এক করে এবং primary one-এ point করে; work ধ্রুপদী গঠনের জন্য parent/child graph তৈরি করে।releases: কেন্দ্রীয় উপাদান, প্রতিটি আমদানি করা কপির জন্য একটি সারি। চাপ দেওয়ার তথ্য (লেবেল, ক্যাটালগ নম্বর, বারকোড, দেশ, ফরম্যাট, বছর), বৈকল্পিক মেটাডাটা উৎস, আমদানিকৃত ফোল্ডারের বিষয়বস্তু হ্যাশ, এবং পরিমাপকৃত অ্যালবাম শব্দের পরিমাণ বহন করে। কোন উৎস না থাকার অর্থ মেটাডাটা সরাসরি প্রবেশ করা হয়েছে; বহিস্থিত উৎস নামের সঠিক উৎস প্রকাশ, যখন ফাইলের ট্যাগ একটি স্থানীয় স্ন্যাপশট উৎস রেকর্ড করে।release_identities: একটি রিলিজ হচ্ছে এর সঠিক বহিরাগত পরিচয়। কোন সারির অর্থ কোন বহিরাগত পরিচয় নেই। প্রতিটি সারিতে MusicBrainz অথবা Discogs রিলিজ এবং রিলিজ গ্রুপের নাম থাকে, এবং একটি রিলিজ একই সাথে উভয় উৎস থেকে পরিচয় রাখতে পারে। এটি উৎস থেকে পৃথক: বর্তমান সম্পাদনযোগ্য মেটাডাটা সেই উৎস থেকে পুনরায় সেট করা হয়েছে বলে দাবি না করে পরিচয় পরিবর্তন করা যেতে পারে।tracksসহtrack_artists, plusrelease_artist_rolesওtrack_artist_roles: ট্র্যাক-তালিকা ও কৃতিত্ব, প্রতিটি কৃতিত্ব তার উৎসসহ tagged।track_works,work_parts,work_artists: recording যে work perform করে তার সঙ্গে linked।audio_formatsওaudio_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-এ থাকে (নিচে দেখুন)।people,ratings,history,playlists,playlist_entries: প্রত্যেক মানুষের প্রোফাইল এবং তিনি নিজের জন্য যা record করেন। এগুলো owner টেবিল: শুধু লেখকের ডিভাইস এগুলো বদলাতে পারে।historyওplaylists-এর প্রতিটি সারি হয় পরিবারের ভাগ করা store-এ, নয়তো মানুষটির ব্যক্তিগত circle-এ থাকে।
সিঙ্ক হওয়া ও স্থানীয়
এই অংশের লিঙ্কউপরের প্রতিটি টেবিল নিঃশর্তভাবে সিঙ্ক হয়: একটি স্থানীয় রিলিজের সারি অন্য যেকোনো রিলিজের মতোই প্রতিটি ডিভাইসে পৌঁছায়, তাই প্রতিটি ডিভাইস জানে পরিবারের কী আছে, আর স্থানীয় রিলিজের কোনো ট্র্যাক নির্দেশ করা রেটিং বা প্লেলিস্ট entry এমন সারি নির্দেশ করে যা প্রতিটি ডিভাইস পড়তে পারে। শুধু রিলিজের অডিও, এবং তা যে path-এ আছে, ইম্পোর্টকারী ডিভাইসে থাকে। প্রতিটি টেবিল তার সারি-পরিচয়, পাঠক-পরিসর, owner টেবিল কি না এবং যে ফাইল বহন করে তা সহ জানানো হয়; একটি test জানানোগুলোকে ঠিক এই তালিকায় ধরে রাখে।
সম্পূর্ণ স্থানীয় টেবিল, coven-এ কখনও declared নয়:
playback_state: current track, position, queue, volume, shuffle ও repeat। Playback একটি device fact।- স্ক্যান ও ইম্পোর্ট টেবিল: নজরে রাখা ফোল্ডার, স্ক্যান, ইম্পোর্ট প্রার্থী ও তাদের খসড়া।
source_releaseও তার অধীনের টেবিলগুলো: bae যে প্রতিটি MusicBrainz ও Discogs release fetch করেছে তা থেকে extract করা তথ্য — album ও pressing-এর তথ্য, credits ও works সহ পুরো tracklist, cover-এর বিকল্প, আর অন্য catalog তাকে কী নামে চেনে — স্থানীয় release-এর বদলে প্রদানকারীর release দ্বারা keyed। raw JSON রাখা হয় না; যেকোনো ডিভাইস release আবার fetch করতে পারে।local_release_files: এই ডিভাইসে একটি স্থানীয় রিলিজের ফাইল path ও পরিবর্তনের সময়।local_history: এই ডিভাইসের মানুষের প্রোফাইল তৈরির আগের প্লে, প্রোফাইল তৈরি হলে যা তাঁর ব্যক্তিগত circle-এ সরানো হয়।
দুই ডিভাইসের সম্পাদনা ঘর ধরে মেলানো হয়, যে ঘর দুটিই বদলেছে সেখানে পরের সম্পাদনা জেতে। coven মেলানোর হিসাব নিজের টেবিলে রাখে, তাই bae-এর টেবিলে clock column থাকে না।
Blob
এই অংশের লিঙ্কঅডিও ও ছবি হলো coven ফাইল, প্রতিটি ধরন একটি namespace যার নিজের ডিভাইস ক্যাশে বরাদ্দ আছে: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB), এবং avatars (64 MiB)। একটি সারি coven ফাইলের id দিয়ে তার ফাইলকে reference করে: release_files, covers ও artist_images-এ file, আর people-এ avatar_id। ফাইলের মাপ, content hash ও অবস্থান coven-এর, যা coven_files-এর সঙ্গে join করে পড়া হয়।
রিলিজ-ফাইল ব্যবহারকারীর: স্থানীয় রিলিজের ফাইল হলো ব্যবহারকারীর নিজের ফাইল তার মূল path-এ, local_release_files-এ record করা, আর তার সারিগুলো কোনো coven ফাইলকে reference করে না। রিলিজ মেঘে সরালে একটি write-এ প্রতিটি ফাইল coven-এ প্রস্তুত হয় এবং প্রতিটি সারি তার ফাইলের দিকে নির্দেশ করে; শেষটি জমা হলে coven সবগুলোকে একসঙ্গে মেঘে স্থানান্তর করে, আর অন্য ডিভাইস প্রথম read-এ প্রতিটি ক্যাশে আনে। কভার, শিল্পীর ছবি ও অবতার bae-এর: bae বাইট তৈরি করে (কভার সর্বোচ্চ 600px চওড়া JPEG thumbnail হিসেবে আবার আঁকা হয়), আর একটি ডিভাইস প্রতিটি প্রথমবার দেখানোর সময় আনে এবং তার namespace-এর বরাদ্দ সেটিকে সরিয়ে না দেওয়া পর্যন্ত রাখে।
প্রতিটি ফাইল এলোমেলো নামের নিচে encrypted হয়ে আপলোড হয়, এমন path-এ যা প্রস্তুত হওয়ার সময় নির্দিষ্ট হয়, তাই পরে নাম বদলালে object নড়ে না। একটি ফাইলের বাইট কখনও বদলায় না: নতুন ছবি মানে নতুন ফাইল।
একটি rip-এর পরিচয়
এই অংশের লিঙ্কপ্রতিটি আমদানিতে নতুন এলোমেলো পরিচয়সহ একটি রিলিজ এবং তার নিজস্ব ট্র্যাক ও ফাইলের সারি তৈরি হয়। প্রতিটি ডিভাইস local_release_origin-এ তার প্রতিটি আমদানি যে ফাইলগুলো পড়েছে সেগুলোর সাজানো আপেক্ষিক পথ, আকার ও পরিবর্তনের সময়ের SHA-256 লিখে রাখে; এই রেকর্ড কখনও সিঙ্ক হয় না। যে ফোল্ডারের হ্যাশ এই ডিভাইস লিখে রেখেছে, সেটি যেখানেই সরানো হোক সম্পন্ন ট্যাবে থাকে, এবং তার সারি সেখান থেকে আমদানি করা একমাত্র রিলিজের নাম দেখায়। সেই ডিভাইসে একই ফাইল আবার আমদানি করলে তা ব্যর্থ হয়, এবং সম্পন্ন ট্যাবে পুনরায় আমদানির ব্যবস্থা থাকে না।