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

6.9 KiB
Raw Permalink Blame History

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