You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
New Features
Fix Series -- a cross-book bulk-edit dialog for correcting series metadata (name, author, genre, narrator, explicit, language) across every book in a detected series group at once. Two detection passes group books by title pattern (no series tag yet) or by normalizing existing series-tag variants (trailing space, ", Book N", reading-order qualifiers like "(Chronological Order)"/"(Publication Order)"), surfaced as group cards in both the Suspicion Report and Match Report widgets.
Enrichment Forge -- a new page that finds a series already in your Audiobookshelf library, pulls genre and narrator from Audible and Goodreads across every book in it, and applies the compiled result to the whole series at once. Explicit content evidence is shown alongside but never pre-checked, since neither provider's signal is reliable proof a book is clean, only a hint that it might not be.
Folder Forge: customizable naming template -- an optional template controlling how the organizer names destination folders and, for single-file books, the audio filename, via tokens for author, series, order/number, title, edition, narrator, publisher, year, and ASIN. It stays on "Use ABS default structure scheme" by default -- destination folders are laid out exactly as before -- and turning it off lets you define your own layout, with a live preview and worked example scenarios (fetched in parallel, so switching between them is instant). Loose single-file names now also get a tidy-up under either scheme: a name that is pure release junk or a jumbled restatement of the metadata (a doubled series name, an underscore-mangled dump) is rebuilt as a clean "Book N - Title" while already-clean names are left untouched. For full control, two filename tokens cover the "keep the file's own name, just tidy it" workflow: {filename} cleans the source name while {original} keeps it verbatim -- and anything placed after either token is appended, so stamping an ASIN onto a messy filename is a single edit. An ASIN that conflicts with one already in the name is flagged for review instead of being silently duplicated.
Manual Review: search for any book -- a new search box in Manual Review's "Load any book" section finds any book anywhere in your library by name and opens it directly, instead of being limited to the books flagged in the current Suspicion/Match report. It's backed by a filesystem index that builds in the background on startup and refreshes when the library changes, so results come up live as you type.
Collapsible advanced run settings, plus side navigation on every tool page -- the less-common run options on Metadata Forge, Folder Forge, and the M4B Tool now sit behind an "Advanced settings" toggle so the common path stays uncluttered, and the M4B Tool gained the same in-page side navigation as the other tool pages (with section jumps that land the heading just below the fixed header instead of behind it).
Refreshed, crisper UI -- tightened border-radius, spacing, and the type scale across the whole app onto a shared set of design tokens; recolored the default dark/light theme to a warmer palette; added a new "Wood" dark surface option alongside the existing theme choices.
M4B Tool: discovery-cache status indicator -- a persistent marker shows whether the cached multipart/non-M4B search for the current root and fixer script is ready (with a file count), stale (the fixer script changed since it was last built), or still building/updating, instead of only finding out after clicking Find and waiting.
Fixes
Security: removed a debug toggle that silently disabled connection and auth gating -- a "Show developer links" debug mode added one developer link, but also silently bypassed every "no metadata provider connected" redirect and the page-load auth check across the whole app. Left enabled in a browser from earlier testing, it would quietly turn those guards off; it has been removed entirely.
Security: patched known CVEs -- updated the Alpine base image and Python dependencies to close known vulnerabilities.
Security: hardened file and URL handling -- book cover lookups are now restricted to the configured audiobook library; file:// cover URLs are only accepted from LibraForge-managed uploads; cover images are capped at 10 MiB and validated as real JPEG/PNG; ABS/abs-agg/abs-tract service URLs must use http:///https://. Closes off unintended local file access and unsafe URL schemes in cover/service-URL handling.
Organizer: title corruption from bracketed annotations -- fixed a family of bugs where bracketed narrator/series annotations leaked into the cleaned title instead of being stripped (a 3-segment bracketed filename, a redundant "(Series Book N)" parenthetical, one level of nested parenthetical, a bare "(Book N)"/"(Vol. N)" annotation). Also fixed a stray ampersand-truncation regression from the same title-cleaning pass.
Fixer: batch runs silently reprocessing manually-applied books -- the marker-skip check trusted an incomplete written_fields list for grouped/json-sidecar books, so a book you'd already manually applied could get silently reprocessed on the next batch run. Fixed at the source instead of special-casing the check.
Fixer: wrong recovery target for grouped books -- grouped (multi-part) books' recovery flow now resolves the correct meta_target from the multi-part group map instead of a wrong/partial one.
Light-theme contrast/readability -- the default accent color and the success/warning/danger status colors had no light-theme-specific variants and were reusing dark-theme hex values verbatim, making several text/background combinations (especially the default accent's button text, and status badges throughout the app) fail basic readability in light mode. Audited every theme x surface x accent combination and fixed all of them.
Match Report: series-grouping cards vanished after changing the status filter -- selecting any status filter (including switching back to "All statuses") permanently dropped the series-group suggestion cards from the list, since they were inserted outside the normal filtered render cycle. Also added a "Series groups" filter option to view them on their own.
Match Report: failed books mislabeled "Not Matched" -- the status badge checked for a status string the backend never actually sends, so genuinely failed/errored books were silently shown as "Not Matched" instead of "Error" (invisible in practice since both badges happened to share identical styling).
Manual Review: duplicate "Manually Applied" badge -- Manual Review rendered its own separate reason chip for a fact already covered by the Match Report card's badge (both come from the same marker field); it now reuses that same badge instead of showing it twice, differently styled.
Start Here: reworked and completed the badge legend -- restructured into one table with labeled sections, fixed a stale/incorrect cross-reference between two badges, and added the previously-undocumented Multi-file, Suspect Report severity/trigger, and series-group ("no series"/"series drift") badges. Also added CSS for the "critical" suspect severity, which had no styling at all.
Settings redirect for a missing Audible/ABS connection lacked clarity -- clicking Start run or a search action with no metadata provider connected used to fail unclear, or land you on Settings with no explanation of what was missing. Now shows a clear notice explaining what to fix and highlights the relevant Settings section. Where there's a sensible fallback (Audible and ABS can substitute for each other), it automatically switches to whichever one is actually connected instead of failing; GraphicAudio/SoundBooth Theater and Goodreads/Kindle selections get the same clear redirect-and-explain treatment, without a false auto-switch since neither has an equivalent fallback.
A hidden "Batch provider" setting silently overrode the visible "Metadata provider" picker -- whole-library runs actually used a separate field tucked away in Advanced settings, easy to never notice, instead of the "Metadata provider" picker already visible on the page. Removed it; "Metadata provider" now drives both single-book search and whole-library runs consistently.
Cancel button did nothing for most of a run's lifetime -- the fixer only actually checked for a cancel request once it reached the write phase; clicking Cancel during the search/match phase (the search-per-book pass that makes up the large majority of a whole-library run's total time) was silently ignored and the run just kept going to completion, with no way to stop it short of killing the process directly on the server. Now checked in the search/match loop too, so Cancel takes effect within one in-flight search call, typically a few seconds, no matter which phase the run is in.
abs-agg (GraphicAudio, SoundBooth Theater, and more) had no Settings section -- unlike Goodreads/Kindle (abs-tract), there was nowhere to configure or verify its URL from Settings despite the backend already supporting it. Added one with the same live "Save and verify" check, and documented its full real provider list (11 total, including Goodreads and Hardcover once the abs-agg service itself is configured for them).
Unified library scanning across Manual Review, M4B, and Folder Forge -- Manual Review's "Load any book" search, the M4B Tool's multipart/non-M4B discovery, and Folder Forge's dashboard scan now share one folder-existence and per-folder-signature index instead of three separate, inconsistent staleness checks. Fixes two real bugs this uncovered: Folder Forge's scan trusted a too-coarse fingerprint that could keep serving stale dashboard tiles for up to an hour after a real change, and that same coarse fingerprint was blind to a book added or changed in a deep subfolder, so it silently never showed up. Folder Forge's scan results also now persist to disk, so they survive a container restart instead of starting cold.
GraphicAudio/SoundBooth Theater matches lost publisher and could get a fake ASIN -- dramatized editions matched to a GraphicAudio or SoundBooth Theater production could end up with no publisher and, in the M4B Tool's interactive search, a synthetic placeholder ASIN indistinguishable from a real one if saved into the sidecar. Fixed on both paths: the automated fixer run now reads the provider actually resolved by the match instead of guessing publisher from local file clues alone, and interactive search leaves ASIN blank when there isn't a real one while populating publisher for every abs-agg provider, not just these two. The metadata comparison table had its own separate copy of the same guess-from-local-clues logic and still showed the wrong publisher even after the backend fix landed; it now reads the same resolved value instead of recomputing its own.
Grouped books could lose their written-fields record under --metadata-json-only -- a grouped (multi-part) book's sidecar write path zeroed out its written_fields list when running in JSON-sidecar-only mode, which could make a fully up-to-date book look reprocessable or incomplete on the next run.
M4B discovery cache could serve stale results for multi-disc books -- the cache-freshness check only looked at each "Disc 1"/"Disc 2" subfolder's own top-level listing, so rewriting a file one level inside a disc folder didn't register as a change; the cached search kept serving the old result instead of picking up the edit.
Manual Review search index: false "library changed" reports, and the index marker vanishing on every search -- three related bugs in the index behind Manual Review's "Load any book" search. The shared index bumped its generation counter (used as the "something changed" signal) on every background walk even when nothing had actually changed, producing a spurious "library change detected, updating..." status on an untouched library. The persistent "Search index: N books" marker read the wrong field from the search response, so it silently fell back to hidden and disappeared the instant you searched instead of staying visible. And the index could briefly report "ready" with 0 books immediately after a restart, before the very first background library walk had actually finished.
Start Here's tool cards didn't match their own page's icon style, and looked small -- the "go straight to a stage" cards wrapped each icon in a bordered box that none of the tools' own pages use. Removed the box and enlarged the icons now that they have the room, including a further size bump for the M4B Tool icon specifically, since its artwork has more built-in padding than the others and looked smaller than its siblings at a matching size.
Docs
README overhaul -- split the single 248-line README into a short overview (features, roadmap, install, safety, reporting, and a new Credits section crediting the open-source projects LibraForge builds on and integrates with) plus docs/features.md (full per-tool depth) and docs/development.md (test/dev commands). Also fixed real gaps found in the process: Enrichment Forge was a live page completely undocumented in the README, "Suspect Report" was used throughout when the in-app UI says "Suspicion Report," and Fix Series wasn't mentioned anywhere.