226 lines
13 KiB
Markdown
226 lines
13 KiB
Markdown
# Changelog
|
||
|
||
## v0.1.12 — 2026-04-15
|
||
|
||
### New features
|
||
|
||
- Reader: **font size slider** in the reading settings drawer — adjust text size from 80% to 150%; setting is saved per device so iPad and desktop each remember their own preference
|
||
|
||
---
|
||
|
||
## v0.1.11 — 2026-04-13
|
||
|
||
### Bug fixes
|
||
|
||
- Edit metadata: pasting or typing a comma-separated list in the genre, subgenre or tag input now adds each value as a separate tag instead of one combined tag
|
||
|
||
---
|
||
|
||
## v0.1.10 — 2026-04-12
|
||
|
||
### New features
|
||
|
||
- Reader: **prev/next volume buttons** in the header for books that are part of a series — buttons appear automatically when the book has adjacent volumes; tooltip shows the volume number and title; marking a book as read redirects directly to the next volume in the reader instead of the book detail page
|
||
- Comics: **series_volume field** for annual series where issue numbers restart each year (e.g. Donald Duck (1982) [15]) — stored in the database and EPUB OPF; displayed as `(year)` after the series name on the book detail page; sorting respects `series_volume` before `series_index`; supported in Bulk Import via `%series_volume%` placeholder and a "Year/Vol." shared field
|
||
- Library: **archive a series in one click** — "Archive series" / "Unarchive series" button in the series detail view; updates all books in the series via a single SQL UPDATE and recalculates sidebar counters without a page reload
|
||
|
||
### Bug fixes
|
||
|
||
- TedLouis scraper: title extraction no longer includes the "Back" button text or the author byline — only direct text nodes of the title heading are used
|
||
|
||
---
|
||
|
||
## v0.1.9 — 2026-04-08
|
||
|
||
### New features
|
||
|
||
- New scraper: **Nifty.org (classic)** — scrapes plain-text email-format stories; email headers stripped, boilerplate paragraphs auto-detected and hidden, scene-break patterns converted to break images
|
||
- New scraper: **new.nifty.org** — scrapes the Next.js version of Nifty; reads chapter content from the RSC payload when the static HTML does not include it; boilerplate detection shared with classic Nifty
|
||
- New scraper: **codeysworld.org** — single-file and multi-chapter stories; title and author extracted from heading elements; category from URL path stored as tag; navigation links and audio links stripped from chapter content
|
||
- New scraper: **iomfats.org** — all stories are listed on a single author page; provide any chapter URL and the scraper finds the correct story automatically; supports single stories and multi-part series (series name, book title, and series index derived from the page structure)
|
||
- New scraper: **tedlouis.com** — all pages use opaque token-based routing (`?t=TOKEN`); provide the story index URL and the scraper collects all chapter links from the three-column chapter list
|
||
- Settings: break image upload — upload a custom PNG/JPG/WebP to use as the scene break image in all converted books; stored in the imagestore and applied to both DB-stored and EPUB-format books
|
||
- Settings: develop mode toggle — shows a DEVELOP banner and updates the page title across all pages when enabled
|
||
|
||
### Bug fixes
|
||
|
||
- Break images were not displayed in DB-stored books — the image path `../Images/break.png` is a relative EPUB path that does not exist for DB content; DB mode now uses `/static/break.png`
|
||
- Break images were silently lost during import — the image was decomposed before `element_to_xhtml` ran, leaving an empty wrapper; the wrapper is now replaced with `<hr>` so the break is correctly rendered
|
||
|
||
---
|
||
|
||
## v0.1.8 — 2026-04-06
|
||
|
||
### Bug fixes
|
||
|
||
- Library: cover upload now works for DB-stored books — the upload endpoint previously returned "File not found" because DB books have no file on disk; the cover is now stored directly in the cover cache
|
||
|
||
### Improvements
|
||
|
||
- Book detail: rating moved from clickable stars to a dropdown in the Edit metadata panel — avoids touch-input issues on iPad where hover state caused all stars to appear filled
|
||
|
||
---
|
||
|
||
## v0.1.7 — 2026-04-06
|
||
|
||
### New feature
|
||
|
||
- Search: filter on unread novels or unread shorts — a second toggle row (All / Unread novels / Unread shorts) restricts results to books with no reading history; filter is preserved in the URL
|
||
|
||
### Bug fixes
|
||
|
||
- Backup: files larger than 148 MB now upload correctly — chunked upload session (100 MB per chunk) replaces the single-call upload that hit Dropbox's payload size limit
|
||
|
||
### Improvements
|
||
|
||
- File paths: spaces in new filenames are now replaced with underscores (publisher, author, title, series segments); series separator changed from ` - ` to `_-_`
|
||
|
||
---
|
||
|
||
## v0.1.6 — 2026-04-05
|
||
|
||
### Bug fixes
|
||
|
||
- Export EPUB: double chapter titles fixed — same heading-stripping logic as the reader now applied before passing content to `make_chapter_xhtml`
|
||
- Library: authors and publishers with only archived books now remain visible in the Authors and Publishers list views
|
||
|
||
---
|
||
|
||
## v0.1.5 — 2026-04-04
|
||
|
||
### Bug fixes
|
||
|
||
- Reader: double chapter titles for pandoc-converted books — headings wrapped in a `<section>` element were not stripped by the previous regex; now also removes the first heading found directly inside an opening `<section>` or `<div>`
|
||
- Search: multi-word queries no longer match chapters where the words appear far apart — switched to `phraseto_tsquery` so all words must appear in order
|
||
|
||
---
|
||
|
||
## v0.1.4 — 2026-04-04
|
||
|
||
### Bug fixes
|
||
|
||
- Reader: double chapter titles in DB-stored books — the chapter endpoint now strips all leading headings from stored content before prepending its own chapter title; affects books scraped before front-matter stripping was added
|
||
- Library: archived books were missing from author and publisher detail views — detail views now include all books (active and archived); archived books have a badge on their cover so they remain distinguishable
|
||
|
||
---
|
||
|
||
## 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
|
||
- 1–5 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 (30–100 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
|