Added
- Subpath / reverse-proxy hosting (
BINDERY_URL_BASE) (#516) — New env var strips incoming URLs to their path, validates the prefix, injects<base href>andwindow.__BINDERY_BASE__into the servedindex.htmlat runtime, and mounts all chi routes under the prefix. Vite is built withbase: './'for relative asset URLs; the React router and API client readwindow.__BINDERY_BASE__for the basename and prefix. - Re-bind book to a different metadata record (#519) — New
POST /api/v1/books/{id}/rebindendpoint accepts a provider (openlibrary|hardcover) and a foreign ID, validates the upstream record, warns on author mismatch (withforce_required:true) unlessforce:trueis sent, clears and re-links series membership, and writes abookReboundaudit entry to History. A Re-bind dialog is accessible from the Book Detail page. - DNB as primary metadata provider (#521) — DNB's SRU endpoint now supports
GetAuthorWorks()and can be selected as the primary provider in Settings → General → Metadata Provider. OpenLibrary remains the default. When DNB is primary, roles are swapped at startup.
Fixed
- Library scan: sort-suffix folders now reconciled (#517) — Files stored in librarian sort-suffix form (
Title, The/Title, A) are correctly matched during library scan. A newnormalizeTitle()helper handles, the/, an/, acomma-suffix inversion and is applied in bothtitleMatch()and the JW-similarity comparison inScanLibrary(). - Hardcover lists fetch repaired (#518) — Three response structs (
GetUserWishlist,GetUserLists,getShelfBooks) incorrectly expected a singleMeobject; they now unmarshalMeas an array with alen==0guard, matching the actual API response shape.
Changed / Refactored
- Post-create wanted-book logic centralised (#520) —
handleNewWantedBook()extracted ininternal/api/authors.goand called fromFetchAuthorBooks,RecommendationHandler.Add, andSeriesHandler.ensureHardcoverCatalogBook, eliminating three copies of the same file-exists / auto-search dance.