Переплёт сервис онлайн книг. Онлайн библиотека. помогает решать несколько связанных задач: хранить книги в форматах FB2 и EPUB, открывать их без интернета, запоминать место чтения, связывать заметки с фрагментами текста и давать выбранным людям доступ к общей полке. Удобство такой системы зависит не от числа функций, а от согласованности данных. Файл книги, карточка издания, прогресс, закладки и права доступа должны сохраняться раздельно, но оставаться связанными.

FB2 и EPUB различаются устройством. FB2 содержит структурированный текст и сведения о книге в XML. EPUB представляет собой контейнер с текстовыми файлами, стилями, изображениями и описанием издания. Читалка должна учитывать эти различия, не сводя оба формата к набору страниц. В электронном тексте номер страницы меняется вместе со шрифтом, шириной экрана и межстрочным интервалом, поэтому надежная позиция строится по разделу и фрагменту документа, а не по условной странице.
Устройство каталога
Каждая книга получает внутренний идентификатор, не зависящий от имени файла. В карточке хранятся название, автор, язык, серия, номер в серии, обложка, формат, размер и контрольная сумма. Контрольная сумма — короткий цифровой отпечаток содержимого — помогает обнаруживать дубликаты даже после переименования файла.
Метаданные из FB2 и EPUB требуют проверки при импорте. В одном файле имя автора записано полностью, в другом — с инициалами, название серии порой отсутствует, обложка бывает встроенной либо вынесенной в отдельный ресурс. Редактируемая карточка устраняет расхождения без изменения исходной книги. Если библиотека хранит несколько изданий одного произведенияпроизведения, их лучше объединить на уровне произведения, сохранив отдельные файлы и сведения о каждом издании.
Каталог удобнее строить на сочетании поиска, фильтров и полок. Поиск охватывает название, автора, серию и пользовательские метки. Фильтры отбирают книги по формату, языку, статусу чтения или доступности на устройстве. Полки отражают назначение подборки: «Читаю», «На потом», «Справочники», «Общая». Одна книга способна находиться на нескольких полках без копирования файла.
При импорте система проверяет формат, извлекает метаданные и обложку, вычисляет контрольную сумму, ищет совпадения и предлагает действие при обнаружении дубликата. Полезны три варианта: пропустить файл, заменить прежнее издание или сохранить отдельную версию. Автоматическая замена опасна: новая копия иногда содержит другую структуру текста, из-за чего старые заметки теряют привязку.
Чтение и заметки
Экран чтения должен сохранять настройки отдельно от содержимого книги. Размер и гарнитура шрифта, поля, цветовая схема, выравнивание и межстрочный интервал относятся к предпочтениям читателя. Стили издателя допустимо оставить для сложной верстки, но у пользователя нужен выбор между исходным и упрощенным оформлением.
Прогресс фиксируется после перехода между разделами, сворачивания приложения и закрытия книги. Частая запись при каждом движении экрана расходует ресурсы, а редкая грозит потерей позиции. Практичный вариант — краткая задержка после остановки прокрутки и обязательное сохранение при завершении сеанса.
Закладка отмечает позицию, заметка содержит пользовательский текст, выделение сохраняет цитату и диапазон исходного документа. Эти сущности не стоит объединять в одну. Раздельная модель упрощает поиск: закладки отвечают на вопрос «куда вернуться», выделения собирают нужные фрагменты, заметки фиксируют мысли и пояснения.
Для устойчивой привязки заметки полезно хранить идентификатор раздела, начальную и конечную позицию, саму цитату и небольшой контекст вокруг нее. Если файл обновился, система сначала ищет прежнюю позицию, затем совпадение цитаты, после — сочетание цитаты с соседними словами. При неудаче заметка остается в списке с пометкой о потерянной привязке, удалять ее нельзя.
Заметкам пригодятся цвет, метки, дата изменения и ссылка на книгу. Полнотекстовый поиск по собственным записям превращает библиотеку в рабочий архив. Экспорт в обычный текст или другой открытый формат защищает записи от привязки к одной программе. В экспорт входят название книги, автор, цитата, комментарий и обозначение раздела. Номер страницы уместен лишь для издания с фиксированной разметкой.
Офлайн и синхронизация
Офлайн-доступ означает, что заранее загруженные книги, обложки, оглавления, заметки и прогресс доступны без соединения. Простого кэширования файла недостаточно: кэш очищается системой и не дает читателю ясной гарантии. Для каждой книги нужен явный режим «Хранить на устройстве» и видимый статус загрузки.
Локальная база служит основным источником данных во время чтения. Сервер получает изменения после восстановления связи. Каждая операция — новая заметка, исправление текста, перенос книги на полку, обновление прогресса — записывается в очередь синхронизации. У операции есть уникальный номер, время создания и состояние отправки. Повторная передача не должна создавать копии.
Конфликты обрабатываются по типу данных. Для прогресса разумно выбирать позицию из последнего завершенного сеанса, а не самую дальнюю: читатель мог вернуться к предыдущей главе. Две заметки, созданные на разных устройствах, сохраняются обе. Если одна и та же заметка изменена параллельно, безопаснее показать две версии или предложить ручное объединение. Автоматический выбор последней записи способен уничтожить содержательную правку.
Удаление требует отдельной записи, иначе объект вновь появится после синхронизации со старым устройством. Такая запись сообщает остальным устройствам, что книга снята с полки либо заметка удалена. Для случайных действий пригодится корзина с ограниченным сроком восстановления, причем срок задается явно в настройках.
Объем локального хранилища контролируется по книгам, а не скрытыми правилами. Пользователь видит размер загруженных файлов и удаляет локальную копию, не затрагивая карточку, заметки и серверный экземпляр. Обложки и служебные данные занимают отдельную категорию, которую допустимо очистить с последующим восстановлением.
Общая полка
Общая полка — подборка книг с определенным кругом участников. Она не должна открывать всю личную библиотеку. Владелец выбирает книги и назначает права: просмотр, добавление, редактирование описаний или управление участниками. Чем короче набор ролей, тем понятнее последствия каждого действия.
Личные заметки по умолчанию закрыты, даже если книга лежит на общей полке. Публикация отдельной заметки требуот явного действия. Общая запись хранит автора и историю изменений, чтобы участники различали исходный текст и последующие правки. Если совместное редактирование не предусмотрено, комментарии лучше отделить от авторской заметки.
Удаление книги с общей полки не должно стирать файл из личных собраний участников. Оно прекращает общий доступ или убирает элемент из подборки — точное поведение зависит от источника файла и прав на него. Интерфейс обязан заранее назвать результат: «Убрать с общей полки», «Удалить локальную копию» или «Удалить из личной библиотеки».
Доступ по ссылке удобен, но требует срока действия и возможности отозвать ссылку. Для постоянной группы надежнее приглашения с учетными записями. Журнал действий помогает разобраться, кто добавил книгу, изменил карточку или убрал участника. В нем не нужно показывать личные позиции чтения и закрытые заметки.
Файлы книги резервные копии нуждаются в защите при передаче и хранении. Учетная запись должна поддерживать завершение чужих сеансов и дополнительное подтверждение входа. Экспорт всей библиотеки включает исходные файлы, карточки, структуру полок и заметки в читаемом формате. Резервная копия ценна лишь после проверки восстановления, поэтому полезно периодически открывать архив и сверять состав данных.
Рабочая библиотека не запирает читателя внутри одного приложения. Она принимает корректные FB2 и EPUB, сохраняет оригиналы, объясняет ошибки импорта, отдает заметки и каталог в переносимом виде. При выборе готового решения или проектировании собственного сервиса критерии остаются приземленными: книга открывается без сети, позиция не теряется, заметка переживает обновление файла, конфликт не стирает данные, а общая полка не раскрывает личное собрание.