v4.0.56 — OPDS overhaul + drag-and-drop book merge
Two coordinated improvements landed this release: a fix for anonymous OPDS clients getting English-only catalogs, the long-requested OPDS shelf-visibility filter, and a community contribution that adds drag-and-drop book merge with per-format conflict resolution.
docker pull ghcr.io/new-usemame/calibre-web-nextgen:v4.0.56
docker pull ghcr.io/new-usemame/calibre-web-nextgen:latest
Fixes (user-facing)
-
OPDS locale resolver for anonymous clients (closes #160, continuation of #121). Clients that don't send
Accept-Language(Readest, KOReader, some Kobo readers) no longer get English-only catalogs. New precedence chain:?lang=xxURL override → user.locale → Accept-Language → new operator-tunableOPDS Default Locale for Anonymous Clientsadmin setting →en. The new setting is scoped to/opdspaths so it doesn't affect the web UI. Thanks @droM4X for the careful repro + four-quadrant test specification. -
Per-user OPDS shelf visibility filter (closes #153, backport of CWA #1258 + #1259 + #1260). Mirrors the existing Kobo-sync shelf filter on OPDS. Toggle "Only expose selected shelves to OPDS" on your user profile, then per-shelf check "Expose this shelf in my OPDS feed". Magic shelves get the same treatment. 16 upstream regression tests imported and pass against the cherry-picked state. Thanks @jgoguen for the original CWA stack.
Features
- Drag-and-drop book merge with per-format conflict resolution (PR #161, community contribution from @Amjad50). Drag one book cover onto another in the grid to merge their formats; the dragged book is the source (deleted after merge), the drop target is the keeper. When both books share a format, a modal surfaces per-format radios (Keep existing / Replace with source). Gated behind
role_edit()server-side and client-side — view-only users never see the surface. Thanks @Amjad50.
Verification
Live-verified end-to-end on cwn-local Docker:
- All four OPDS quadrants (anon-on/off × creds valid/invalid) return the correct HTTP status + catalog content
?lang=de/?lang=hu/?lang=zzzzper-request overrides exercise the resolver- Hungarian / German / French rendering via Accept-Language verified
- OPDS shelf exposure: 2 public shelves → flip
opds_only_shelves_sync=1→ 0 shelves; insert exposure row → exactly one shelf surfaces - Drag-merge end-to-end with Playwright: single-conflict modal, two-conflict modal, replace-confirm flow, viewer-role blocked at endpoint (403)
CHANGES rows
See CHANGES-vs-upstream.md for the per-PR detail, including the conflict-resolution decisions for the OPDS shelf-filter backport (preserves allow_show_hidden from #64 and the series-outerjoin fix from #38).