novela/docs/changelog.md
Ivo Oskamp e4d2e2c636 DB-stored books, full-text search, backup restore, and AO3 scraper
- DB-stored books (Fase 1–6): chapters and images stored in PostgreSQL; grabber writes to DB, EPUB→DB conversion, DB→EPUB export, FTS search page (/search)
- Chapter editor: Monaco editor supports DB-stored books; inline title editing
- Grabber: DB/EPUB storage toggle on Convert page
- Backup: restore from Dropbox snapshot (browse snapshots, restore individual or selected files)
- AO3 scraper: initial implementation
- Changelog: v0.1.2 and v0.1.3 entries added to changelog.py and changelog.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 15:13:08 +02:00

122 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Changelog
## v0.1.3 — 2026-04-03
### New feature
- DB-stored books: scraped books are now stored as chapters in PostgreSQL instead of EPUB files on disk — full-text search, content deduplication, and backup coverage are all handled automatically
- Grabber stores chapters in a `book_chapters` table and images in a content-addressed imagestore (sha256-based, automatic deduplication)
- EPUB → DB conversion: "Convert to DB" button on any EPUB book detail page — extracts chapters, migrates all metadata and child rows (tags, progress, bookmarks, cover), removes the EPUB file
- DB → EPUB export: "Export EPUB" button on DB-stored books — builds and streams a standards-compliant EPUB without writing a file to disk
- Full-text search (`/search`): searches across all DB-stored chapter content via PostgreSQL FTS (`tsvector` / `plainto_tsquery`), returns highlighted snippets with direct links to the chapter position in the reader
- Chapter editor supports DB-stored books: Monaco-based editor reads and writes `book_chapters` directly; chapter titles editable inline; title-only changes correctly included in Save All
- Grabber: storage toggle on the Convert page — choose between DB storage and EPUB file before converting
---
## v0.1.2 — 2026-04-02
### New feature
- Restore functionality on the Backup page: browse any available Dropbox snapshot, see which files are currently missing from disk, and restore individual books or a selection back to the library — file is written to disk and immediately re-indexed
---
## v0.1.1 — 2026-03-31
Bug fixes, volume-aware duplicate detection, shared code cleanup, and a new Changelog page.
### Bug fixes
- Duplicates view crashed on load due to a TypeError (`g.books.length` was undefined); counter was stale and the view never rendered
- Duplicate detection was too aggressive: different volumes of the same series (same title + author, different volume) were incorrectly grouped as duplicates — now keyed on title + author + volume
- Grabber preload: same volume-aware fix — only flags a duplicate when title, author, and volume all match; falls back to title + author when no volume is known
- Bulk Import duplicate check: different volumes of the same series are no longer flagged as duplicates
### Improvements
- Search changed from search-as-you-type (250 ms debounce) to Enter-to-search — prevents the iPad keyboard from locking up on large collections
- CBR reader: archive format now detected via magic bytes instead of file extension — `.cbr` files that are actually ZIP or 7-zip archives open correctly; added 7-zip support via `py7zr`
- Docker: replaced `unrar-free` with proprietary unrar (RARLAB v6.2.6) — fixes failures on RAR archives using newer compression methods
### New feature
- Changelog page (`/changelog`): structured release history with version, date, and categorised change lists
### Code quality
- Shared CSS (`theme.css`): single `:root` block with all global CSS custom properties; loaded on every page — no more duplicate inline `:root` blocks across templates
- Shared JS (`books.js`): book helpers (`bookTitle`, `bookAuthor`, `bookGenres`, `bookSubgenres`, `bookPlainTags`, `filterBooks`) and search input wiring extracted into one shared file
- Shared JS (`conversion.js`): SSE/EventSource logic (`connectConversionStream`, `addLog`) extracted from Convert and Grabber pages into one shared file
---
## v0.1.0 — 2026-03-29
First release of Novela: a self-hosted personal library for EPUB, PDF, CBR, and CBZ files.
### Library
- Grid and List view for all books and New books, with column visibility filter and persistent view mode
- Sidebar navigation: All books, Want to Read, New, Incomplete, Series, Authors, Publishers, Archived, Bookmarks, Rated, Duplicates, Statistics
- Sidebar counters for all sections, live-updated without page reload
- 15 star ratings stored in DB and written back to EPUB OPF / CBZ ComicInfo.xml
- Publication status: Complete, Ongoing, Temporary Hold, Long-Term Hold
- Status and want-to-read badges on grid covers, always readable regardless of cover colour
- Duplicate detection: groups books by title+author; counter in sidebar
- Incomplete view: all non-archived books where publication status is not Complete
- Rated view: non-archived books with a star rating, sorted by rating
- Bulk delete in All books List view with multi-select and Shift+click range selection
- Disk usage warning in sidebar (amber ≥ 85%, red ≥ 95% or low free space)
- Autocomplete for Author, Publisher, and Series in the book edit panel
- Series volume suffix support (e.g. "21a", "21b") and volume 0 for prequels/specials
- Cover upload for EPUB books; cover cache for fast subsequent loads
### Reader
- EPUB reader with chapter navigation, scroll progress, and bookmarks
- PDF reader with page-image rendering and page navigation
- CBR/CBZ reader with page-image rendering; format detection via magic bytes (supports ZIP, RAR, 7-zip archives)
- Reader text colour: 5 warm-tone presets, persisted per browser
- Content width slider (30100 vw), persisted per browser
- Bookmarks: save position with optional note; navigate back via sidebar or bookmark list
### Import & Convert
- Single-file import: drag-and-drop or file picker for EPUB, PDF, CBR, CBZ
- Bulk Import (`/bulk-import`): batch import with `%placeholder%` filename pattern parsing, shared metadata, live preview table, and duplicate detection
- Convert (`/convert`): scrape web fiction and convert to EPUB; warns if title+author already exists in library
- Grabber with credentials manager for site-specific login
### Book Builder
- Create EPUB books from scratch via a WYSIWYG editor (`/builder`)
- Chapters with contenteditable editing; toolbar: bold, italic, underline, blockquote, author note, scene break, normalize
- Autosave every 30 s and Ctrl+S; publish produces a standards-compliant EPUB 2.0 added directly to the library
### Following
- Following page (`/following`): track external author URLs
- Two tabs: Following (authors with URL set) and All Authors
- Inline URL editing with Enter/Escape support; Visit opens URL in new tab
- Sidebar counter shows number of followed authors
### Backup
- Dropbox backup with versioned snapshots and object-store deduplication
- OAuth2 refresh token flow (does not expire); legacy access token supported as fallback
- Configurable backup root, snapshot retention, and scheduled interval
- Live backup progress in sidebar (file count + phase); backup status dot with time-ago
- PostgreSQL dump included in each backup run
### Performance
- Library loads instantly for large collections: ETag `304 Not Modified`, `IntersectionObserver` lazy covers, single DOM pass rendering, `json_agg` SQL tag aggregation
- Fast-path `/api/library` (DB-only); full rescan only on demand
### Branding
- Favicon for browser tabs (16×16, 32×32, 256×256)
- Apple touch icon (180×180) with dark background for iOS home screen
- Logo in sidebar alongside the Novela wordmark