Ir al contenido
AudioBook Manager
Español
GitHubInstalar
Aún no publicado

ABM todavía no ha salido

Todavía estoy preparando AudioBook Manager para su primera versión pública, así que los pasos de instalación de este sitio aún no funcionan. Echa un vistazo y sigue el proyecto en Discord o GitHub para enterarte de cuándo sale.

Pendiente de revisión por la comunidad¿Ves un error? Ayuda a corregirlo

Ayuda

Actualizaciones

Notas de cada versión de ABM.

0.16.0

2026-08-31
1 changed · 11 fixed

Folders only when you want them.

Empty book folders are now opt-in, and a run of fixes stops ABM losing track of files after imports, upgrades and moves.

Antes de actualizarIf you ever saved Settings > Media Management, empty folders keep being created. Fresh installs start with it off.

Changed

  • empty book folders are now created only if you ask for them, matching how Sonarr works. Settings > Media Management > Create Empty Book Folders, off by default. It covers all three places a folder gets made: adding a book, changing its root folder, and a disk scan. As in Sonarr, turning on “delete empty folders” suppresses it — creating a folder something else is set to sweep away only churns it.

    If you had previously saved the Media Management page, your existing behaviour is preserved and the new setting comes up on. A fresh install, or one that never saved that page, will have it off.

Fixed

  • a file’s folder and its name are stored in separate places, and one importer was writing the whole file path into the folder column. Anything that later looked for that file built a path that could not exist, so a refresh treated it as missing and dropped the record. Fixed, and a repair pass runs once at startup to correct any record already written that way — it reports what it changed on the Tasks page and does nothing at all when there is nothing wrong.

  • re-importing the same download created a second, duplicate record of every file, because the check for “do I already have this?” compared a full file path against a column holding folders and so never matched.

  • an upgrade whose new file landed at exactly the same path as the one it replaced could leave the book with no file records at all, and could keep re-running the same upgrade indefinitely because the record still described the old file’s audio.

  • moving a book kept its files’ sub-folders (Disc 1, CD2) in one place and flattened them in three others, so after some moves those files could no longer be found. All four now behave the same way.

  • if a move succeeded on disk but the database write that followed it failed, the folder stayed at its new location while ABM still pointed at the old one. The folder is now put back.

  • bulk edits that move books now save each book as it goes, so one failure part way through no longer leaves every folder already moved unaccounted for.

  • the root folder removal dialog described two things that do not happen: that removing a folder leaves everything else untouched, and that deleting its files also deletes the books. It now says what actually happens, and the book count it shows is correct — a root folder whose name began with another one’s name was counting the other folder’s books as its own.

  • a scan skipped reconciling any book whose folder was missing, so a book whose files had gone was never noticed.

  • a converted book kept reporting the quality it had before conversion. The conversion refreshed the file’s format but left the audio properties read from the original, and the quality classifier trusts those over the extension — so an upgraded-by-conversion book could look like it still needed upgrading.

  • a background task that failed while saving recorded its own failure against a session that first needed resetting, so the failure could go unrecorded.

  • the startup file-path repair was registered as safe to retry after a database lock but could never actually retry, because it reported the lock as a result rather than raising it.

0.15.5

2026-08-29
4 fixed

Moving books actually moves them.

Moving books between root folders said it worked while moving nothing. Now it moves them, and says how many moved and why any didn't.

Antes de actualizarAdding a book now needs at least one root folder set up. ABM says so instead of adding a book with nowhere to go.

Fixed

  • moving books to a different root folder reported success while moving nothing. Every book was sent with the same hardcoded source path, taken from a field the server has never returned, so the move either failed outright or skipped every book — and the result was reported as “Successfully moved N books” regardless, because the response was never read. Each book’s source is now worked out from where that book actually is, so a selection spanning several root folders moves correctly in one go, and the result now says how many books moved and why any were left behind.

  • moving a book whose files sit in sub-folders (Disc 1, CD2) rewrote every file’s recorded location to the book folder itself, so those files could no longer be found after the move. Sub-folders are now preserved.

  • a book added to a root folder other than the default recorded that choice but had nowhere to record where its folder would be, unless the folder happened to be created at the same moment. A book’s destination is now always recorded when it is added, and creating the folder on disk is a separate step — the same split Sonarr uses. Adding a book now requires at least one root folder to be configured, and says so plainly rather than creating a book with no destination.

  • the root folder list counted every book whose path merely began with the same characters, so a root folder named as a prefix of another reported the other one’s books as its own — including in the confirmation shown before removing a root folder. Counts are now bounded at a folder boundary.

0.15.4

2026-08-28
1 fixed

Fixed

  • adding a book to a root folder other than the default recorded that choice but built the book’s folder under the default root anyway, so the book’s recorded location and its actual location disagreed from the moment it was created. The folder is now built under the root folder that was actually chosen.

0.15.3

2026-08-28
3 fixed

Fixed

  • a library scan or a book’s refresh read an unreachable library folder as the book’s files having been deleted. It removed every tracked File row for that book and marked it wanted — which is what tells Audiobook Manager to go re-acquire it from indexers. A dropped network mount (NFS, SMB) presents on disk exactly like a folder someone emptied or deleted, and nothing distinguished the two, so an outage during a scan could wipe file records and queue an entire library for re-download.

    A book is now judged against the root folder it actually lives under rather than whichever root the scan happened to be walking, which is what made this worse the more root folders you had. A root that is missing is never trusted. A root that is merely empty only blocks the destructive path when that book already has tracked files — so a brand-new, empty root folder can still have its first folder created on it without being mistaken for an outage. A root that cannot be listed at all (a stale mount handle, an I/O error) is now treated as missing rather than healthy, which is the most common way a failing mount actually behaves.

    The same false reading reached three further places, all now fixed: applying fetched metadata set a book to wanted on an unreachable path before the scan’s own check ever ran; refreshing a book reported “Refreshed book” on success when nothing had been touched; and a batch refresh counted every skipped book as a successful one.

  • a scan no longer creates a missing library root folder. It used to create the folder and carry on, which is the same blind spot — an unmounted share is indistinguishable from a folder that was never made, and creating it destroys the evidence that anything was wrong. A missing root now stops the scan instead. If you relied on a scan to create your library folder, create it yourself first; adding a root folder already required the path to exist, so this only affects a scan against a root whose folder later went missing.

  • the Health page reported root folders as accessible when a mount had dropped. It only checked whether the folder existed, so an empty mountpoint — the usual symptom — read as healthy. It now reports an empty root that still has books recorded under it as an error, while a new root folder with nothing in it yet stays healthy.

    A scan that skips books now says so on the Tasks page, rather than reporting no changes.

    Not covered: a mount that fails below a configured root folder — where the root itself is local and an inner folder is the mount point — still looks healthy from the root, and is handled as before.

0.15.2

2026-08-28
2 fixed

Fixed

  • 0.15.1 got the ownership model backwards. It made an Audiobookshelf edit the way to opt a book out: ABM saw a metadata.json with no "abm" block and left that book alone from then on. That hands the source of truth to Audiobookshelf for any book you touch there, which is the opposite of what ABM is for. ABM now writes its own value and re-stamps the "abm" block every time, for any book in its catalogue, whatever the file contained before. The block is a provenance stamp, not a permission gate — ownership is decided by the book being in ABM’s library, not by what is in the file.

    If you edited a book’s metadata in Audiobookshelf while 0.15.1 was running: ABM stopped managing that book and will now resume. Your Audiobookshelf edit will be replaced with ABM’s value on that book’s next add, import, or refresh. There is no per-book opt-out yet; if you need one for a particular book, keep it out of ABM’s library for now.

  • a book correctly filed under a real, configured root folder that was not the default — and whose root_folder_id was never set to it — was refused by its directory listing, a manual import’s conflict check, a manual import itself, and creating any of cover.jpg, reader.txt, desc.txt, or title.opf. Each of those resolved a single library path (the book’s assigned root folder, or the default one) before ever looking at where the book’s folder actually was, so a book filed correctly anywhere else came back “No root folder configured” while its files sat right there.

    Those seven checks now share one lookup that asks where the book’s folder actually is before asking which root folder it was assigned to. A root folder is still required to work out where a book should go; it is no longer consulted to find a folder that already exists.

0.15.1

2026-08-27
1 fixed

Fixed

  • the metadata.json ownership marker 0.15.0 shipped as a separate hidden .abm.json file inverted the behavior that marker was supposed to produce. Audiobookshelf never reads or writes .abm.json, so ABM believed it owned metadata.json forever regardless of what happened to it — meaning an edit made directly inside Audiobookshelf would be silently reverted the next time ABM touched the book, exactly backwards from the 0.15.0 entry below’s claim that editing in Audiobookshelf was how you’d opt a book out. The marker is now an "abm" block written inside metadata.json itself. Audiobookshelf ignores that block on read and always discards it on its own rewrite, so editing a book’s metadata in Audiobookshelf is now what tells ABM to back off: ABM sees a metadata.json with no block and leaves it alone from then on. Deleting the block by hand does the same thing. .abm.json is no longer read or written at all.

    If ABM wrote a book’s metadata.json while 0.15.0 was running: that file has no "abm" block, so as of this release ABM treats it as foreign and will not touch it again on its own. If you want ABM to keep managing that book, delete its metadata.json (and the now-unused .abm.json beside it, if present) — the next import or refresh regenerates it correctly. If you’re fine with what 0.15.0 wrote and don’t want it changed, no action is needed; that’s now the same outcome as having edited it in Audiobookshelf.

0.15.0

2026-08-27
1 added · 4 fixed

Added

  • ABM now writes Audiobookshelf’s own metadata.json into every book’s folder — the file at the very top of Audiobookshelf’s metadata precedence, above everything else ABM has ever contributed (embedded tags, .opf, reader.txt, even the folder name itself). Title, subtitle, authors, narrators, series, genres, publication year and date, publisher, description, ASIN, and language go in using Audiobookshelf’s own schema, with author and narrator names written verbatim — this is the one channel that doesn’t have to mangle a name to dodge Audiobookshelf’s own splitting rules the way tags and reader.txt do. A hidden .abm.json marker sits beside it so ABM can tell its own file apart from one Audiobookshelf wrote or a user edited by hand: a later refresh only overwrites metadata.json when that marker is present, and leaves a foreign one alone.

    metadata.json always writes on add, import, and refresh — none of the four “Create metadata files” toggles or three trigger settings in Settings > Metadata govern it, and there is currently no way to turn it off. If you edit a book’s metadata directly inside Audiobookshelf, that edit will be overwritten the next time ABM touches the book, because metadata.json now outranks it. If you don’t want ABM controlling a particular book’s metadata this way, delete .abm.json from its folder — ABM treats a folder without that marker as foreign from then on.

Fixed

  • cover.jpg, title.opf, desc.txt, and reader.txt were never created for a book acquired the normal way — indexer search, grab, download client, import — no matter what Settings > Metadata said. The handler for that path never called the metadata service at all, so none of the four file toggles and none of the three trigger settings had any effect on it; only a manual “Create” button or a library-import run ever produced these files. It’s now wired into both a fresh import and a quality-upgrade replace, running after the transaction is committed and isolated from the import itself — a sidecar failure can never fail the import. If you’ve had these settings enabled and wondered why your books never got a cover.jpg or reader.txt: this is why. They’ll start appearing on the next import; existing books pick them up on their next refresh or a manual “Create” action.
  • the sidecar writer stopped creating a book’s folder as a side effect of writing files into it. Harmless on its own before this release, since the only caller that could reach it with a missing folder was gated off — but now that sidecar generation runs on every import, an unconditional mkdir here would have quietly defeated the “Skip Folder Creation” library setting. It now skips with a logged reason when the folder doesn’t exist instead of creating it.
  • sidecar files (cover, OPF, desc, reader.txt, and now metadata.json) silently failed to write for a book sitting in a perfectly valid on-disk folder whenever no default root folder was configured. The folder lookup resolved a library root before ever checking whether the book already had a folder on disk, so the one case that doesn’t need a root folder at all still needed one — and hit it. Fixed: the on-disk path is checked first.
  • a book’s .opf file and its embedded audio tags have always produced a malformed genre entry for any book with more than one genre. Book.genres is stored as one comma-joined string, but both the OPF writer’s <dc:subject> loop and the audio-tag writer’s TCON field wrapped that whole string in a single-item list instead of splitting it — so “Fantasy, Adventure” came out as one <dc:subject>Fantasy, Adventure</dc:subject> tag instead of two, and as a comma-separated TCON value instead of the slash-separated one Audiobookshelf’s tag reader expects. Both now split the column correctly. This doesn’t rewrite what’s already on disk — an already-written .opf or a file that’s already been tagged still carries the malformed genre value; regenerate the OPF or re-tag the file to pick up the fix.

0.14.4

2026-08-26
3 fixed

Fixed

  • author and narrator names written to tags, reader.txt, and .opf files could still be split apart by Audiobookshelf after 0.14.3’s fix for exactly that problem — 0.14.3 sanitized a name by replacing & with the literal word " and ", but " and " is Audiobookshelf’s own second split, right behind &. With two or more names the join’s own & still won and covered for it, but most books have only one name — with nothing to join, there was no & at all, so Audiobookshelf split on the " and " the sanitizer had just inserted. Anne & Todd McCaffrey came out of 0.14.3 as two authors, Anne and Todd McCaffrey. A name that legitimately contains the word “and” (Crosby and Nash) split the same way. Both are fixed the same way now: &, ,, ;, and the literal word " and " are all stripped out of a name before joining, so nothing Audiobookshelf treats as a separator is left inside a single name. If a name in your library contains & or the word “and”: that text is now dropped from what ABM writes for it — Anne & Todd McCaffrey is written as Anne Todd McCaffrey — because leaving any of it in is what caused the split. This doesn’t rewrite what’s already on disk; re-tag a book or regenerate its reader.txt / .opf to pick up the corrected name.

  • adding chapters to a book in place — Chapterize, and the in-place case of 0.14.3’s hardlink-safety fix — staged its temp file next to the real file with a real audio extension and no protection against a same-named collision. A library scan or the file watcher could see the half-written, multi-gigabyte remux mid-write and treat it as a new audio file; and because the file’s own name carried nothing more than a process ID, two chapter operations landing on same-extension files in the same folder at the same moment could stage to the identical path and race each other’s swap onto the live file. Staging now uses a collision-proof name that scans and the file watcher never mistake for real content, with ffmpeg told the container explicitly since the staged name no longer carries a usable extension. The swap also now carries the original file’s permissions across, which it didn’t before — the staged file was created more restrictively than the original, so a completed chapter add could quietly leave a file only ABM’s own user could read.

  • the hardlink-safety fix in 0.14.3 (copying a file to a private inode before an in-place tag or cover write) could leave a permanent orphan file behind in the library folder if ABM was interrupted between staging the copy and swapping it in — its temp file had no suffix a cleanup pass could recognize, so nothing ever came back for it. It now stages through the same collision-proof, sweepable temp file as the chapter fix above, and a leftover from an earlier interruption is cleaned up automatically the next time the same operation runs on that folder.

    If you already have a stray file from a crash before this fix: the automatic sweep only recognizes the new naming pattern. Look for a dotfile next to a book’s audio file that isn’t cover.jpg, reader.txt, or .opf — for chapters, named like .temp_chapters_<pid>_<time>.m4b or .chapters_temp_<pid>.m4b; for a tag or cover write, named like .<book file>.<random> with no extension at all. Safe to delete by hand; nothing in ABM will pick it back up.

0.14.3

2026-08-26
7 fixed · 1 changed

Fixed

  • writing a tag or embedding cover art into a book file that’s still hardlinked to a seeding torrent edited the seeding copy in place — ABM and the torrent client shared the same inode, since hardlinking is the default behavior when useHardlinks is on, and mutagen writes to a hardlinked file in place. The first tag write or cover embed after import could break that torrent’s hash check. ABM now checks for a shared link before writing and, if one exists, copies the file to a private one in the same directory first, so the seeding copy is never touched. This only protects writes going forward. If you’ve been running with hardlinks on, any torrent whose book got tagged or had a cover embedded after import may already have a broken hash — check your client for anything that’s stopped seeding or failed its recheck, and re-add it if so.

  • adding chapters to a book in place could damage a seeding torrent the same way, by a different route. The chaptered file was written to the system temp directory and then moved onto the library file — and when those sit on different filesystems, as they do in any normal Docker setup, that move becomes a copy that rewrites the existing file’s contents rather than replacing it, so the seeding copy’s bytes changed underneath it. The chaptered file is now written alongside the book and swapped in by renaming, so the seeding copy keeps exactly the bytes it was hashed against. The same caveat applies — this protects writes going forward, not ones already made.

  • creating cover.jpg for a book with a custom cover failed with “Cover URL rejected: URL scheme ‘’ not allowed”. A custom cover is stored inside ABM and referenced by an internal path rather than a web address, so the download step rejected it. It now copies the stored custom cover into the book folder instead — which matters when the folder’s cover.jpg has been deleted or the book has been reorganised, since that button is how you’d put it back.

  • a book’s .opf metadata file came out with malformed XML if its title, author, narrator, publisher, ASIN, genre, language, or series name contained &, <, or > — only the description was ever escaped. Audiobookshelf discards a .opf it can’t parse, silently, so any affected book’s OPF was never actually read. Every field is escaped now, and the series name and position are quoted properly. If you’ve generated an OPF for a book whose metadata contains one of those characters: regenerate it — this fix doesn’t rewrite files already on disk.

  • reader.txt listed narrators one per line, but Audiobookshelf only reads the file’s first line — every narrator after the first was silently dropped for any multi-narrator book. Narrators are now joined the way Audiobookshelf’s own parser expects, so all of them show up.

  • a book’s .opf listed narrators under <dc:contributor opf:role="nrt">, which matches the OPF spec but not what Audiobookshelf reads — its parser only looks at dc:creator. Every narrator ABM has ever written to an OPF file was invisible to Audiobookshelf. Narrators are now written as dc:creator opf:role="nrt", the same element authors use.

  • author and narrator names written to tags, reader.txt, and .opf files were joined with ; . Audiobookshelf splits those fields on its own precedence — & first, then and, then ; — so a name that itself contains one of those characters (an author credited as “Anne & Todd McCaffrey”, for example) got split apart instead of read as one name. Names are now joined with & with those characters stripped from each individual name first, so Audiobookshelf’s & split always wins and never fires in the wrong place.

    None of the four metadata fixes above rewrite what’s already on disk. They only change what ABM writes from now on. If you want an existing book’s tags, reader.txt, or .opf corrected, re-tag it or use the “Create reader.txt” / “Create .opf” actions to regenerate them.

Changed

  • all four /api/metadata endpoints that create files — cover.jpg, reader.txt, desc.txt and .opf — now reuse the same code library import and refresh already use, instead of second copies that carried the same metadata bugs independently. One visible side effect: creating an OPF for a book with no audio file on record now falls back to title.opf instead of <Book Title>.opf. Nothing in ABM reads that fallback name back, so this only matters if you were relying on the old filename yourself.

0.14.2

2026-08-25
3 fixed

Fixed

  • adding chapters to a file (Chapterize, and Convert’s step that embeds fetched chapter data into a source that had none) wiped every embedded global tag — title, author, narrator, ASIN, description — from the output. The ffmpeg command mapped metadata only from the chapters file, which carries chapter markers and nothing else, so the container ended up with none either. Convert and Merge run through the same step, but had it masked: a database re-tag runs after them regardless, so the file got its tags back anyway. Chapterize has no such re-tag step, so the loss was permanent — chapterizing a book actually stripped it of its tags, not just risked it. Fixed by keeping the source’s own global tags and layering the chapter markers on top instead of replacing everything. If you’ve chapterized a book, or converted one that picked up chapters this way, before this fix: its embedded tags are still gone and this fix won’t bring them back — re-tag the file with an external tool or replace it from wherever it originally came from.
  • the same metadata-wiping command ran on the Audible download decrypt path too, and nothing masked it there: write_audio_tags defaults to off for Audible downloads, so no re-tag step ever ran to put the title, author, and ASIN back. Every Audible book decrypted before this fix is missing those tags in the file itself. Same fix, same caveat: already- decrypted files won’t recover on their own.
  • adding chapters to a file in place could delete the very file it had just finished producing. The temp file ffmpeg wrote to and the final destination were tracked under the same variable once the move to its final location succeeded, so the cleanup step that’s supposed to remove the temp file removed the finished file instead — silently, right after reporting success. This hit the same three operations as above: Chapterize (single file and multi-file), and Convert’s post-conversion chapter-embed step.

0.14.1

2026-08-24
2 fixed

Fixed

  • the Library Import results screen never showed a publication year, for any folder, anywhere on the page. The frontend was reading a year field the backend has never sent — the parser emits release_year — so both the manual-search dropdown and the “Matched Audiobook” column came up blank. It was broken on the backend side too, independently: that column is populated automatically for every scanned folder as soon as the page loads, and none of the three ways a match gets built for it — ASIN, title search, series search — was copying release_year into the match data at all. Both are fixed.
  • a folder matched by ASIN never got cover art on the Library Import results screen. That lookup used Libex’s raw response directly instead of parsing it first, so the cover image field came back empty every time; title-search and series-search matches were unaffected. It’s now parsed the same way manual search already did.

0.14.0

2026-08-23
1 added · 2 changed · 12 fixed

Added

  • the Audible Library page can now show Virtual Voice and Subscription Plans icons on its books, matching Library and Discover. It could already sort and filter by that data, but the options modal had no toggle to display it, so there was no way to see it even if you owned the titles. Both are off by default, the same as on Library and Discover.

Changed

  • Libex’s metadata host is moving off libex.lostcartographer.xyz ahead of that host’s retirement; ABM now points at libexdb.com by default. If you had the LIBEX_BASE_URL environment variable set to override it: that variable is gone and no longer has any effect — ABM always uses libexdb.com now.
  • the “Release Date” column and toggle on Library, Series, and Audible Library only ever showed a year, never a full date. Relabeled to “Release Year” so the label matches what’s actually shown.

Fixed

  • System > Status always showed the database as “PostgreSQL (connected)” under Database, no matter what was actually running or whether it could be reached — the row was never checked, just always displayed that way. It now opens the database and reports what’s really there, e.g. “SQLite 3.45.1”, and if the database can’t be reached it says “unavailable” instead of claiming it’s connected.
  • interactive indexer search (the search dialog on the book detail page) no longer waits for indexers one at a time. Indexers within a tier are now queried at once instead of in sequence, so the wait is roughly the slowest indexer’s response time rather than the sum of every enabled indexer’s. A slow or failing indexer no longer holds up the rest — concurrency is capped at 5 at once, so a setup with several indexers behind the same proxy isn’t hit with a bigger burst than that.
  • “Add Series” could report success after adding only the first book. It created that book, then waited a fixed amount of time hoping the rest of the series had finished being set up before checking once — on a slower server, a large series, or a busy machine, that single check could land too early. When it did, the rest of the books were silently skipped, but the app still showed the add as successful and closed the dialog. It now keeps checking until the series is actually ready, for up to 10 seconds, before adding the rest.
  • “Add Series” now tells you when it fails instead of closing the dialog regardless. The dialog stays open while the series is being added, and if something goes wrong — most commonly a slow catalog build that hadn’t finished in time — it stays open with a message explaining what happened, and the buttons re-enable so you can just try again. When the failure happened after a log was already being written for the attempt, the message includes a “View Related Logs” link straight to it; if nothing had gotten far enough to produce a log, there’s no link.
  • the Virtual Voice and subscription-plan icons on Library, Discover, and Audible Library announced nothing to a screen reader — they were silently skipped over, so anyone relying on one had no way to know a book was AI-narrated or included with a subscription. They now announce as “AI-narrated (Audible Virtual Voice)” and “Included with Audible subscription plans: <plan names>”. This has been broken since these icons were introduced, not just on the new Audible Library toggle above.
  • Virtual Voice sorting and filtering on the Audible Library page could give the wrong answer for any book that was already in your library before that data started being tracked — it had been permanently recorded as AI-narrated whether or not it actually was, so filtering for non-Virtual-Voice titles could turn up nothing even though you own plenty. A normal library sync already corrects a book the next time it runs, but anything that hadn’t been re-synced since was still wrong. This is repaired for every remaining case automatically as part of upgrading, so the new toggle above shows the right icon for everyone from the start.
  • an Audible-library sync that fell back to the Audible API instead of Libex — which happens whenever Libex can’t be reached — could silently blank out a book’s series, genres, release date, rating, Virtual Voice status, subscription plans, and Audible ownership type. The fallback builder asserted a default for every field it had no data for, and a sync writes every field it builds, so a prior Libex sync’s real values got overwritten with those defaults. This is now closed for every field on that path: the fallback builder leaves a field alone instead of guessing at it when it has nothing to say, and extracts series and release date from the Audible payload where that payload does carry them. If your library synced while Libex was unreachable before this fix, the affected books won’t recover on their own — a normal sync refills them from Libex the next time it runs; trigger one manually if you don’t want to wait for the schedule.
  • a book’s release date could show as a day earlier than it actually is. Upstream sends a release date as a full timestamp even though it carries no time of day, and stored that way it reads as a UTC instant — any client behind UTC renders the day before. This came in through more than one path: normal metadata syncing, adding a book manually with a release date supplied directly, and the Audible fallback used when Libex has no date for the ASIN. Release dates are now stored and validated as a plain calendar date everywhere they’re written, with an invalid one rejected rather than stored, and any date already stored as a full timestamp is corrected automatically as part of upgrading.
  • the library-import manual-search and preview API endpoints (/api/library-import/search, /api/library-import/preview/{asin}) handed the raw Libex response straight to the response formatter instead of parsing it first. A direct ASIN search or preview came back with no cover, no release date, and no runtime; every search — ASIN, title, author, or series alike — came back with no publication year and no subtitle, because the formatter was reading those two under names the parser has never used. Both are corrected. Neither endpoint has a caller anywhere in ABM today — not the frontend, not any background handler — so this is a fix to the public API contract those endpoints advertise, not something you’ll see change on screen.
  • the Audible Library page’s release year could come out a year off for a book near a year boundary. Its release date was sent to the browser as a full UTC-tagged instant even though it’s only ever a calendar date, so a browser behind UTC could compute the wrong year from it — the year shown on poster and overview cards, and sorting by year, were both affected. Year is now read off the bare calendar date instead.
  • the Audible Library page showed a book as unmonitored, even when it wasn’t, whenever it matched your library by ASIN rather than through its stored link — that code path resolved the match but never read the matched book’s monitored flag. Fixed. Loading the page is also faster with a large Audible library: each book’s library match is now looked up in one batched query instead of one query per book, and the page no longer writes to the database as a side effect of loading it.
  • a saved filter created on the Library, Series, or Discover page showed up — and could be applied — on all three, because the three pages shared one stored-filters slot. Each page now keeps its own. If you have saved filters: they were stored under the old shared slot, which nothing reads anymore, so they won’t appear after upgrading — recreate the ones you want to keep on each page.