Локальный каталогизатор и читалка для библиотек в формате INPX. Tauri 2 (Rust) + React + TypeScript + Vite.
- Импортирует
.inpxв локальную SQLite-базу с FTS5 (полнотекстовый поиск) - Поиск по авторам, сериям и книгам — с подсветкой количества совпадений
- Фильтры под кнопкой: язык, жанр (на русском), автор с автодополнением, папка/архив. Активные фильтры висят чипсами под строкой поиска
- Алфавитный указатель авторов и серий с двухбуквенными префиксами (А → Аб → авторы). Кириллица всегда сверху, заглавные/строчные/ведущие скобки игнорируются
- Каталог жанров с переводом FB2-кодов на русский и группировкой по категориям (Фантастика / Проза / Детективы …)
- Каталог языков с человеческими названиями
- Карточка автора: hero c количеством книг/серий, табы «Серии / Все книги / Без серий», экспорт всего, добавление в списки
- FB2 / EPUB ридер в отдельном окне: оглавление (TOC), темы (светлая / сепия / тёмная), выбор шрифта (serif / sans / mono), масштаб, восстановление позиции чтения, навигация стрелками/PageUp/Down
- Пользовательские списки (Избранное, К прочтению, кастомные): мультивыбор книг/серий/авторов, bulk-добавление, удаление
- Внешние метаданные: подгружаются в фоне с Google Books и OpenLibrary, кешируются по
lib_idна 30 дней - Экспорт книг из спутниковых
.zipв выбранную папку с прогрессом - OPDS-шаринг локального каталога (опционально через ngrok) — открывается любым OPDS-ридером
- SWR-кеш на фронте: счётчики жанров/языков/букв обновляются в фоне, страница не моргает
- Rust ≥ 1.77 (
rustup default stable) - Node ≥ 20 и pnpm (
brew install pnpmилиcorepack enable) - macOS: Xcode Command Line Tools (
xcode-select --install) - Linux:
libwebkit2gtk-4.1-dev,libgtk-3-dev,libsoup-3.0-dev,librsvg2-dev(и аналоги) - Windows: MSVC Build Tools, WebView2 Runtime (есть в Windows 11; на 10 — устанавливается отдельно)
pnpm install
pnpm tauri devПервая сборка Rust-зависимостей займёт несколько минут.
pnpm tauri buildАртефакты появятся в src-tauri/target/release/bundle/:
- macOS:
.appи.dmg - Windows:
.msiи.exe(NSIS) - Linux:
.debи.AppImage
Готовые инсталляторы для каждой платформы автоматически собирает GitHub Actions на пуш тега v* — забирать из Releases.
База library.db + кеши лежат в системной папке пользовательских данных приложения (идентификатор org.legostin.mylib):
| Платформа | Путь |
|---|---|
| Windows | %APPDATA%\org.legostin.mylib\library.db |
| Linux | ~/.config/org.legostin.mylib/library.db |
| macOS | ~/Library/Application Support/org.legostin.mylib/library.db |
В этой же папке хранятся:
library.db— индекс + пользовательские списки + позиции чтения + кеш внешних метаданныхlibrary.db-wal,library.db-shm— служебные WAL-файлы SQLite
Чтобы сбросить всё (например, чтобы перенести библиотеку с нуля) — удалите эту папку перед запуском.
Пути к спутниковым .zip хранятся внутри library.db (поля inpx_path, books_dir); сам приложение их не копирует.
mylib/
├── src/ # React-фронтенд
│ ├── App.tsx # Layout + роутинг по разделам
│ ├── components/ # Sidebar / BookList / BookDetail / Reader / …
│ └── lib/ # API-обёртка, типы, кеш, словарь жанров
├── src-tauri/ # Rust-бэкенд
│ ├── src/
│ │ ├── lib.rs # Tauri builder + регистрация команд
│ │ ├── commands.rs # #[tauri::command] точки
│ │ ├── library.rs # импорт INPX → индекс, прогресс-события
│ │ ├── inpx.rs # парсер .inpx (zip + .inp табл-записи)
│ │ ├── index.rs # SQLite-индекс с FTS5, UDF для алфавита
│ │ ├── reader.rs # FB2/EPUB → ReaderBook (главы, TOC, обложка)
│ │ ├── fb2.rs # FB2 preview (annotation + cover)
│ │ ├── fb2_epub.rs # Конвертация FB2 → EPUB
│ │ ├── external_meta.rs # Google Books + OpenLibrary
│ │ ├── opds.rs # OPDS-фид (atom XML)
│ │ ├── share.rs # ngrok-туннель для шаринга
│ │ ├── export.rs # извлечение книг из спутниковых zip
│ │ ├── model.rs # модели данных
│ │ └── error.rs # ошибки + serde
│ ├── capabilities/ # пермишены Tauri
│ └── tauri.conf.json
└── .github/workflows/ # CI + кросс-платформенный release
.inpx— ZIP-архив с файлами*.inp,collection.info,version.info, опциональноstructure.info- Каждая
*.inp-запись — одна строка, поля разделены байтом0x04(исторически — иногда\t) - Поля по умолчанию:
AUTHOR;GENRE;TITLE;SERIES;SERNO;FILE;SIZE;LIBID;DEL;EXT;DATE;LANG;LIBRATE;KEYWORDS AUTHOR— список через:, каждый авторLast,First,MiddleGENRE— список через:- Имя соседнего
.zipс книгами берётся из имени.inp(fb.foo.001-100.inp→fb.foo.001-100.zip)