Об этом проекте
Tandem — это проект с self-hosting (версия 0.1.0, теговых релизов пока нет), цель которого сформулирована просто: читать книгу, слушать ту же книгу и никогда не терять место. Сервер работает в Docker вместе с PostgreSQL и веб-приложением, а React PWA и Android-приложение на Kotlin/Jetpack Compose выступают в качестве тонких клиентов. Сервер берет на себя всю работу с состоянием: сканирует тома электронных и аудиокниг, извлекает метаданные и обложки, связывает электронную книгу с аудиокнигой, управляет очередью транскрибации, генерирует карты синхронизации и является единственным источником записи позиции чтения. Клиенты считывают и записывают позицию через REST-эндпоинты с JWT-авторизацией и хранят только локальные кэши устройств.
Отличительной особенностью является передача между форматами на уровне предложений. Переключение с чтения на прослушивание (или наоборот) переносит пользователя на то предложение, на котором он остановился, а не в начало главы, причем это работает между разными устройствами. Для этого требуется транскрипт: аудиокнига транскрибируется и сопоставляется с текстом EPUB. Whisper может работать локально в образе сервера, собранном с опциональным локальным стеком, или, по умолчанию, задачи передаются отдельному воркеру Jetson (faster-whisper; эталонным развертыванием является Orin Nano 8 ГБ, по умолчанию используется модель medium). Это сопровождается очередью транскрибации с повторными попытками, окном работы в нерабочее время и редактором транскриптов; транскрибация опциональна, и без нее вы все равно получаете библиотеку и два ридера, но без кросс-форматной синхронизации.
Другие описанные функции включают сканер библиотеки с группировкой по сериям и автоматическим сопоставлением электронных и аудиокниг, веб-ридер/плеер PWA с элементами управления на экране блокировки (решение для iPhone, так как приложения для iOS нет), Android-ридер/плеер с офлайн-загрузками, фоновым воспроизведением и Android Auto, многопользовательские аккаунты с ролями и регистрацией только по приглашениям по умолчанию, опциональные интеграции (Audiobookshelf, Google Books, метаданные Open Library, а также импорт ACSM/Audible, требующий специальной сборки образа), а также ночные дампы Postgres и снимки обложек, восстанавливаемые через интерфейс.
Развертывание осуществляется через Docker Compose. В README необычайно четко указано, что секреты должны находиться в файлах, а не в переменных окружения (JWT-ключ, пароль Postgres, ключи шифрования учетных данных Fernet в папке secrets/), что сервер должен работать как один процесс, поскольку очередь и планировщики являются локальными для процесса, и что при чистой установке создается супер-администратор со случайно сгенерированным паролем, записанным в лог, что вынуждает сбросить его при первом входе. Настройка reverse-proxy требует установки FORWARDED_ALLOW_IPS, и предоставляется пример защищенного Caddyfile. Обширные таблицы переменных окружения охватывают обязательные, опциональные, настройки ограничения авторизации, лимиты загрузки и параметры синхронизации; документация API (/docs, /redoc) намеренно отключена в production-среде.
Документированные ограничения изложены откровенно: синхронизация только для EPUB (PDF сопоставляются, но не выравниваются; MOBI/AZW3 должны быть конвертированы), аудиокниги должны быть одним файлом (многофайловые рипы пропускаются, сначала объедините их в .m4b), одна транскрибация за раз, отсутствие горизонтального масштабирования, отсутствие приложения для iOS, Android Auto не протестирован на оборудовании, отсутствие отчетов о сбоях, недавно добавленные пути загрузки/стриминга и отсутствие в любых магазинах приложений. Проект описывается как работа одного разработчика, используемая ежедневно, с реальным набором тестов, но ограниченным опытом работы с оборудованием и структурой библиотек, отличными от авторских.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.