- PDF reader: page-image rendering via /library/pdf/{filename}?page=N;
new /api/pdf/info/{filename} endpoint returns page count; reader.html
branches on FORMAT (epub/pdf) injected by server
- PDF metadata edit: PATCH /library/book now updates DB for all formats;
_sync_epub_metadata only called for .epub; non-EPUB formats skip file write
- Fix file path on metadata save: _make_rel_path now includes format prefix
(epub/, pdf/, comics/) matching common.make_rel_path used during import;
previously files were moved outside their format directory
- Fix empty dir cleanup: prune_empty_dirs always runs after successful
metadata save, not only when file was moved
- Hide Edit EPUB button for non-EPUB files in book detail
- Docs: TECHNICAL.md and changelog-develop.md updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5.6 KiB
5.6 KiB
Develop Changelog
This file tracks changes on the develop line.
changelog.md can later be used for release summaries.
2026-03-22
- Added blueprint/technical documentation structure in
docs/. - Completed router split and bootstrap structure (
main.py, routers, migrations, DB pool). - Expanded media support to EPUB/PDF/CBR/CBZ in import and scan flows.
- Expanded Home UI with:
- import dropzone for EPUB/PDF/CBR/CBZ
- search functionality
- alignment matching Library (search top-right, dropzone below)
- Updated Library import texts and drag/drop filtering for multi-format support.
- Expanded Library
Newview with:Grid/Listtoggle- column visibility filter in
List - multi-select + bulk
Remove from New - selection only in
Listmode Shift+clickrange selection on checkboxes
- Added route:
POST /library/new/mark-reviewed(bulk setneeds_review=false). - Improved library performance:
/api/libraryfast-path (no full rescan on every page load)- optional
rescan=true/include_file_info=true - SQL optimizations in
list_library_json() - additional DB indexes for scale
- Restored
/api/homefull dataset output:continue_readingshorts_unreadnovels_unreadshorts_readnovels_read
- Explicitly filtered series books out of Home sections.
- Corrected Home read ordering:
shorts_readandnovels_readnow show oldest first (ORDER BY MAX(read_at) ASC). - Restored Statistics page by returning the full
/api/statspayload required for charts, favorites, top books, and reading history. - Improved backup implementation:
- Dropbox token stored encrypted in DB
- Dropbox backup root configurable via web UI and stored encrypted in DB
- versioned snapshots + object-store deduplication in Dropbox (
library_snapshots/library_objects) - configurable snapshot retention (
snapshots to keep) via backup settings - object pruning based on retained snapshots
- scheduled backup (enable + interval in hours)
- backup runs as a background process, so page navigation does not block execution
- stale running state recovery after restart/crash (old running logs marked interrupted/error)
- dry-run support in the new flow
- Updated Docker image with
postgresql-clientforpg_dump. - Multiple test builds pushed to
gitea.oskamp.info/ivooskamp/novela:dev.
2026-03-25
- Fixed PDF metadata editing (PATCH /library/book):
_sync_epub_metadatais now only called for.epubfiles; PDFs update DB only_make_rel_pathnow includes the format prefix matching import: EPUB →epub/{publisher}/{author}/…, PDF →pdf/{author}/{title}.pdf, CBR/CBZ →comics/{author}/{title}{ext}; previously files were moved outside their format directory on metadata save
- Fixed PDF reader (infinite loading screen):
reader_pagenow passesformat(epub/pdf/cbr/cbz) toreader.html- Added
GET /api/pdf/info/{filename}endpoint returning{"page_count": N} reader.htmlbranches onFORMAT: PDFs render page images from/library/pdf/{filename}?page=N, EPUB flow unchanged- PDF progress tracked per page; keyboard and button navigation work identically to EPUB
Edit EPUBbutton in Book Detail hidden for non-EPUB files
2026-03-23
- Added
All booksGrid/List toggle in Library:- same columns as
Newview (Publisher, Author, Series, Volume, Title, Has cover, Updated, Genres, Sub-genres, Tags, Status) - column visibility filter in
Listmode - no selection checkboxes or bulk actions
- view mode and column visibility persisted separately in
localStorage(novela.all.viewMode,novela.all.visibleColumns)
- same columns as
- Added 1–5 star rating for books:
- stored in the database (
rating SMALLINT DEFAULT 0) - written to EPUB OPF as
<meta name="novela:rating" content="N"/>on rating change - written to CBZ
ComicInfo.xmlas<NovelaRating>N</NovelaRating>on rating change - CBR and PDF are DB-only (file format constraints)
- rating is recovered from file metadata during rescan/DB rebuild (
upsert_bookpreserves file rating over default 0) - stars displayed under the cover (outside
.book-info) in all grid views (Library, Home) - stars in grid cards are display-only (no click) to prevent accidental taps while scrolling
- stars in Book Detail are interactive (larger, 1.1rem), clicking same star removes rating
- star color: amber (
#c8a03a) for filled,rgba(200, 160, 58, 0.25)for unfilled — consistent across Library, Home, and Book Detail
- stored in the database (
- Added text colour setting to reader hamburger menu:
- 5 warm-tone presets from bright (
#e8e2d9) to dim (#938d86) - active preset shown with accent-coloured ring
- choice persisted in
localStorage(reader-text-colour) and restored on next open
- 5 warm-tone presets from bright (
- Increased spacing between hamburger button and back link in reader header (
margin-left: 1rem) to prevent accidental taps - Removed
Cover Missingauto-tag:- tag is no longer added on import, rescan, or grabber download
ensure_cover_missing_tag()removed fromcommon.py,library.py, andgrabber.py- startup migration removes all existing
Cover Missingtags from the database
- Fixed Tags/Genres/Sub-Genres not saving in book edit panel on desktop:
,(comma) now acts as a confirmation key alongside Enter inPillInputflush()added toPillInput: any text still in the input field is auto-confirmed when Save is clicked
- Fixed tag/genre search and tag-pill navigation being broken:
renderGenreViewwas filtering onb.genres(non-existent field); now usesbookGenres(),bookSubgenres(),bookPlainTags()renderSearchResultshad the same bug; search now covers title, author, genres, sub-genres, and tags