প্রকল্প সম্পর্কে

Tandem একটি প্রি-রিলিজ (0.1.0, এখনও কোনো ট্যাগড রিলিজ নেই) সেলফ-হোস্টেড প্রজেক্ট যার লক্ষ্য খুব স্পষ্ট: একটি বই পড়া, একই বই শোনা এবং কখনোই আপনার পড়ার অবস্থান হারিয়ে না ফেলা। একটি সার্ভার PostgreSQL এবং ওয়েব অ্যাপের পাশাপাশি Docker-এ চলে, যেখানে একটি React PWA এবং একটি Kotlin/Jetpack Compose অ্যান্ড্রয়েড অ্যাপ থিন ক্লায়েন্ট হিসেবে কাজ করে। সার্ভার সমস্ত স্টেটফুল কাজের দায়িত্ব নেয় — এটি ই-বুক এবং অডিওবুক ভলিউম স্ক্যান করে, মেটাডেটা এবং কভার এক্সট্রাক্ট করে, একটি ই-বুকের সাথে তার অডিওবুক জোড়া দেয়, একটি ট্রান্সক্রিপশন কিউ চালায়, সিঙ্ক ম্যাপ তৈরি করে এবং পড়ার অবস্থানের একমাত্র রাইটার হিসেবে কাজ করে। ক্লায়েন্টগুলো JWT অথেন্টিকেশন সহ REST এন্ডপয়েন্টের মাধ্যমে পজিশন পড়ে এবং লেখে এবং শুধুমাত্র ডিভাইস-লোকাল ক্যাশ সংরক্ষণ করে। এর বিশেষ ক্ষমতা হলো ফরম্যাটের মধ্যে বাক্য-স্তরের হ্যান্ডঅফ। পড়া থেকে শোনার দিকে (বা উল্টো দিকে) পরিবর্তন করলে এটি ডিভাইসের সীমানা ছাড়িয়ে আপনি যে বাক্যে ছিলেন সেখানেই আপনাকে পৌঁছে দেয়, অধ্যায়ের শুরুতে নয়। এর জন্য একটি ট্রান্সক্রিপ্টের প্রয়োজন: অডিওবুকটি ট্রান্সক্রাইব করা হয় এবং EPUB টেক্সটের সাথে সারিবদ্ধ করা হয়। ঐচ্ছিক লোকাল স্ট্যাক দিয়ে তৈরি সার্ভার ইমেজে Whisper লোকালি চলতে পারে, অথবা ডিফল্টভাবে কাজগুলো একটি আলাদা Jetson ওয়ার্কারের (faster-whisper; Orin Nano 8 GB হলো রেফারেন্স ডেপ্লয়মেন্ট, ডিফল্টভাবে medium মডেল) কাছে পাঠানো হয়। এর সাথে রিট্রাই সুবিধা সম্পন্ন একটি ট্রান্সক্রিপশন কিউ, একটি অফ-আওয়ারস উইন্ডো এবং একটি ট্রান্সক্রিপ্ট এডিটর রয়েছে; ট্রান্সক্রিপশন ঐচ্ছিক, এবং এটি ছাড়া আপনি লাইব্রেরি এবং দুটি রিডার পাবেন কিন্তু ক্রস-ফরম্যাট সিঙ্ক পাবেন না। অন্যান্য বর্ণিত বৈশিষ্ট্যগুলোর মধ্যে রয়েছে সিরিজ গ্রুপিং এবং স্বয়ংক্রিয় ই-বুক/অডিওবুক পেয়ারিং সহ একটি লাইব্রেরি স্ক্যানার, লক-স্ক্রিন কন্ট্রোল সহ একটি PWA ওয়েব রিডার/প্লেয়ার (আইফোনের জন্য, যেহেতু কোনো iOS অ্যাপ নেই), অফলাইন ডাউনলোড, ব্যাকগ্রাউন্ড প্লেব্যাক এবং Android Auto সহ একটি অ্যান্ড্রয়েড রিডার/লিসেনার, রোল সহ মাল্টি-ইউজার অ্যাকাউন্ট এবং ডিফল্টভাবে ইনভাইট-অনলি রেজিস্ট্রেশন, অপ্ট-ইন ইন্টিগ্রেশন (Audiobookshelf, Google Books, Open Library মেটাডেটা এবং বিশেষ ইমেজ বিল্ডের প্রয়োজন এমন ACSM/Audible ইমপোর্ট), এবং নাইটলি Postgres ডাম্প এবং কভার স্ন্যাপশট যা UI থেকে রিস্টোর করা যায়। ডেপ্লয়মেন্ট Docker Compose-এর মাধ্যমে করা হয়। README-তে অস্বাভাবিকভাবে স্পষ্টভাবে বলা হয়েছে যে সিক্রেটগুলো এনভায়রনমেন্ট ভেরিয়েবলের পরিবর্তে ফাইলে থাকা উচিত (JWT key, Postgres password, secrets/ এর অধীনে Fernet ক্রেডেনশিয়াল-এনক্রিপশন কি), সার্ভারটিকে একটি একক প্রসেস হিসেবে চলতে হবে কারণ কিউ এবং শিডিউলারগুলো প্রসেস-লোকাল, এবং একটি নতুন ইনস্টলেশন একটি র‍্যান্ডমলি জেনারেটেড পাসওয়ার্ড সহ সুপারঅ্যাডমিন তৈরি করে যা লগে লেখা থাকে, যা প্রথম লগইনে পাসওয়ার্ড রিসেট করতে বাধ্য করে। রিভার্স-প্রক্সি সেটআপের জন্য FORWARDED_ALLOW_IPS সেট করা প্রয়োজন এবং একটি হার্ডেনড Caddyfile উদাহরণ দেওয়া হয়েছে। বিস্তারিত এনভায়রনমেন্ট-ভেরিয়েবল টেবিলে বাধ্যতামূলক, ঐচ্ছিক, auth-throttle, upload-limit এবং sync-tunable সেটিংস কভার করা হয়েছে; প্রোডাকশনে API ডক্স (/docs, /redoc) ইচ্ছাকৃতভাবে ডিজেবল করা থাকে। নথিভুক্ত সীমাবদ্ধতাগুলো অকপট: সিঙ্কের জন্য শুধুমাত্র EPUB (PDF জোড়া লাগানো যায় কিন্তু অ্যালাইন করা যায় না; MOBI/AZW3 কনভার্ট করতে হবে), অডিওবুক অবশ্যই একক ফাইল হতে হবে (মাল্টি-ফাইল রিপগুলো বাদ দেওয়া হয়, প্রথমে .m4b-এ মার্জ করতে হবে), একবারে একটি ট্রান্সক্রিপশন, কোনো হরিজন্টাল স্কেলিং নেই, কোনো iOS অ্যাপ নেই, হার্ডওয়্যারে Android Auto untested, কোথাও কোনো ক্র্যাশ রিপোর্টিং নেই, সম্প্রতি ডাউনলোড/স্ট্রিমিং পাথ যুক্ত করা হয়েছে এবং কোনো অ্যাপ স্টোরে এটি নেই। প্রজেক্টটিকে একজন একক মেইনটেইনারের প্রচেষ্টা হিসেবে বর্ণনা করা হয়েছে যা বাস্তব টেস্ট স্যুট সহ দৈনন্দিন ব্যবহারে রয়েছে, তবে লেখকের নিজস্ব হার্ডওয়্যার এবং লাইব্রেরি লেআউট ছাড়া অন্যান্য ক্ষেত্রে এর এক্সপোজার সীমিত।