342 lines
20 KiB
Python
342 lines
20 KiB
Python
"""
|
||
Changelog data for Novela
|
||
"""
|
||
|
||
CHANGELOG = [
|
||
{
|
||
"version": "v0.1.12",
|
||
"date": "2026-04-15",
|
||
"summary": "Font size slider in the reader settings drawer.",
|
||
"sections": [
|
||
{
|
||
"title": "New features",
|
||
"type": "feature",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.11",
|
||
"date": "2026-04-13",
|
||
"summary": "Comma-separated values in genre, subgenre and tag inputs are now split into individual tags.",
|
||
"sections": [
|
||
{
|
||
"title": "Bug fixes",
|
||
"type": "bugfix",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.10",
|
||
"date": "2026-04-12",
|
||
"summary": "Series navigation in the reader, series_volume support for annual comics, archive a series in one click, and a TedLouis scraper fix.",
|
||
"sections": [
|
||
{
|
||
"title": "New features",
|
||
"type": "feature",
|
||
"changes": [
|
||
"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 'Year/Vol.' shared field",
|
||
"Library: archive or unarchive an entire 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",
|
||
],
|
||
},
|
||
{
|
||
"title": "Bug fixes",
|
||
"type": "bugfix",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.9",
|
||
"date": "2026-04-08",
|
||
"summary": "Five new scrapers (Nifty, codeysworld.org, iomfats.org, tedlouis.com), break image settings, and bug fixes.",
|
||
"sections": [
|
||
{
|
||
"title": "New features",
|
||
"type": "feature",
|
||
"changes": [
|
||
"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 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",
|
||
],
|
||
},
|
||
{
|
||
"title": "Bug fixes",
|
||
"type": "bugfix",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.8",
|
||
"date": "2026-04-06",
|
||
"summary": "Cover upload for DB-stored books, and rating moved to the Edit metadata panel.",
|
||
"sections": [
|
||
{
|
||
"title": "Bug fixes",
|
||
"type": "bugfix",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
{
|
||
"title": "Improvements",
|
||
"type": "improvement",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.7",
|
||
"date": "2026-04-06",
|
||
"summary": "Search filter for unread novels/shorts, Dropbox chunked upload fix, and underscores in new filenames.",
|
||
"sections": [
|
||
{
|
||
"title": "New feature",
|
||
"type": "feature",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
{
|
||
"title": "Bug fixes",
|
||
"type": "bugfix",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
{
|
||
"title": "Improvements",
|
||
"type": "improvement",
|
||
"changes": [
|
||
"File paths: spaces in new filenames are now replaced with underscores (publisher, author, title, series segments); series separator changed from ' - ' to '_-_'",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.6",
|
||
"date": "2026-04-05",
|
||
"summary": "Bug fixes: double chapter titles in exported EPUBs, and authors/publishers with only archived books now remain visible.",
|
||
"sections": [
|
||
{
|
||
"title": "Bug fixes",
|
||
"type": "bugfix",
|
||
"changes": [
|
||
"Export EPUB: double chapter titles fixed — same heading-stripping logic as the reader now applied before passing content to the chapter builder",
|
||
"Library: authors and publishers with only archived books now remain visible in the Authors and Publishers list views",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.5",
|
||
"date": "2026-04-04",
|
||
"summary": "Bug fixes: double chapter titles in pandoc-style EPUB content, and search now requires words in order (phrase match).",
|
||
"sections": [
|
||
{
|
||
"title": "Bug fixes",
|
||
"type": "bugfix",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.4",
|
||
"date": "2026-04-04",
|
||
"summary": "Bug fixes: double chapter titles in the reader for DB-stored books, and archived books now shown in author/publisher detail with an indicator badge.",
|
||
"sections": [
|
||
{
|
||
"title": "Bug fixes",
|
||
"type": "bugfix",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.3",
|
||
"date": "2026-04-03",
|
||
"summary": "DB-stored books: chapters stored in PostgreSQL with full-text search, EPUB conversion, export, and a storage toggle in the grabber.",
|
||
"sections": [
|
||
{
|
||
"title": "New feature",
|
||
"type": "feature",
|
||
"changes": [
|
||
"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 book_chapters and images in a content-addressed imagestore (sha256-based, automatic deduplication across all books)",
|
||
"EPUB-to-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-to-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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.2",
|
||
"date": "2026-04-02",
|
||
"summary": "Restore functionality on the Backup page.",
|
||
"sections": [
|
||
{
|
||
"title": "New feature",
|
||
"type": "feature",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.1",
|
||
"date": "2026-03-31",
|
||
"summary": "Bug fixes, volume-aware duplicate detection, shared code cleanup, and a new Changelog page.",
|
||
"sections": [
|
||
{
|
||
"title": "Bug fixes",
|
||
"type": "bugfix",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
{
|
||
"title": "Improvements",
|
||
"type": "improvement",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
{
|
||
"title": "New feature",
|
||
"type": "feature",
|
||
"changes": [
|
||
"Changelog page (/changelog): structured release history with version, date, and categorised change lists",
|
||
],
|
||
},
|
||
{
|
||
"title": "Code quality",
|
||
"type": "improvement",
|
||
"changes": [
|
||
"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",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"version": "v0.1.0",
|
||
"date": "2026-03-29",
|
||
"summary": "First release of Novela: a self-hosted personal library for EPUB, PDF, CBR, and CBZ files.",
|
||
"sections": [
|
||
{
|
||
"title": "Library",
|
||
"type": "feature",
|
||
"changes": [
|
||
"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 — all with live counters",
|
||
"1–5 star ratings stored in the database and written back to EPUB OPF and 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 and author with a sidebar counter",
|
||
"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 and specials",
|
||
"Cover upload for EPUB books with cover cache for fast subsequent loads",
|
||
],
|
||
},
|
||
{
|
||
"title": "Reader",
|
||
"type": "feature",
|
||
"changes": [
|
||
"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, and 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",
|
||
],
|
||
},
|
||
{
|
||
"title": "Import & Convert",
|
||
"type": "feature",
|
||
"changes": [
|
||
"Single-file import: drag-and-drop or file picker for EPUB, PDF, CBR, CBZ",
|
||
"Bulk Import: batch import with %placeholder% filename pattern parsing, shared metadata, live preview table, and duplicate detection",
|
||
"Convert: scrape web fiction and convert to EPUB; warns if title and author already exist in the library",
|
||
"Grabber with credentials manager for site-specific login",
|
||
],
|
||
},
|
||
{
|
||
"title": "Book Builder",
|
||
"type": "feature",
|
||
"changes": [
|
||
"Create EPUB books from scratch via a WYSIWYG editor",
|
||
"Chapters with contenteditable editing; toolbar: bold, italic, underline, blockquote, author note, scene break, normalize",
|
||
"Autosave every 30 seconds and Ctrl+S; publish produces a standards-compliant EPUB 2.0 added directly to the library",
|
||
],
|
||
},
|
||
{
|
||
"title": "Following",
|
||
"type": "feature",
|
||
"changes": [
|
||
"Track external author URLs on the Following page",
|
||
"Two tabs: Following (authors with URL set) and All Authors",
|
||
"Inline URL editing with Enter/Escape support; Visit opens URL in a new tab",
|
||
"Sidebar counter shows number of followed authors",
|
||
],
|
||
},
|
||
{
|
||
"title": "Backup",
|
||
"type": "feature",
|
||
"changes": [
|
||
"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 and phase); backup status indicator with time-ago",
|
||
"PostgreSQL dump included in each backup run",
|
||
],
|
||
},
|
||
{
|
||
"title": "Performance",
|
||
"type": "improvement",
|
||
"changes": [
|
||
"Library loads instantly for large collections: ETag 304 Not Modified, lazy cover loading via IntersectionObserver, single DOM pass rendering, SQL tag aggregation",
|
||
"Fast-path API (database-only); full disk rescan only on demand",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
]
|