github vavallee/bindery v1.40.0

2 hours ago

Separate import handling for audiobooks, torrent cleanup and seed limits, and stricter search matching

Audiobooks can now have their own import mode and drop folder, so a Calibre-Web-Automated plus Audiobookshelf library finally works without hardlinks, and the default audiobook folder can be picked in Root Folders instead of an environment variable. qBittorrent and Transmission can remove a torrent once it imports, indexers carry a seed time and an inactive seed time next to the seed ratio, and the per indexer seed ratio now actually reaches Transmission. A magnet that never gets its metadata is failed and searched again instead of sitting at downloading for ever.

Automatic and interactive search now run the same relevance checks as the fallback path, so a longer book that contains your title or a different volume is no longer grabbed, while "Vol" and "Volume", zero padded numbers, "(Light Novel)" style notes and "Series 4: Title" names now match. The book page can delete a single file, the Series page gains filters, the author page keeps your selection across bulk actions, and Reconcile catalogue lists the rows it kept. Audiobook grabs from a combined search now use the audiobook category, a numbered series volume no longer picks up another volume's files when a title carries a subtitle, and importing an audiobook's tracks from a folder keeps them together. This release adds two database migrations, both additive, which run on their own at startup.

Added

  • Audiobooks can have their own import mode and drop folder (#1632): Settings, General, File Naming has a new Audiobook import mode under the Import Mode buttons. It defaults to Same as ebooks, so nothing changes until you set it. With Calibre-Web-Automated and Audiobookshelf you can now set Import Mode to External with CWA's ingest folder as the drop folder, and the audiobook mode to Copy, Hardlink or Auto: ebooks go to CWA, audiobooks land in your audiobook folder and Bindery triggers the Audiobookshelf scan, instead of CWA filing the m4b into the Calibre library. Copy works on storage that cannot hardlink, such as an Unraid mergerfs pool. When audiobooks are External too, an optional Audiobook drop folder sends them somewhere other than the ebook drop folder. Thanks SturmB, seraphx2 and brianramseyau.
  • Remove a torrent from the download client after it imports (#2046): a new per client toggle, Remove torrent after import, for qBittorrent and Transmission. It is off by default. When on, Bindery removes the finished torrent from the client once the book is imported and leaves the downloaded files on disk, so a hard linked or copied import is unaffected. Leave it off on private trackers where you need to keep seeding. Deluge and rTorrent do not offer it yet. Thanks ccarpinteri for building it.
  • Pick a default audiobook folder in the UI (#2166): Settings, Root Folders now has a Default audiobook root folder next to the ebook one, so you no longer need the BINDERY_AUDIOBOOK_DIR environment variable to choose where audiobooks go. That is mostly a relief on the Windows build. When both are set the UI choice wins, and an author's own audiobook root folder still comes first. The Add Author dialog gains an Audiobook root folder picker, shown when the media type includes audiobooks and preselected with the new default. Thanks Fear Vector for raising it.
  • Per indexer seed time and inactive seed time (#2206): a torrent indexer can now carry a total seeding time and an inactive seeding time, in minutes, next to its seed ratio, and both are sent to the download client when a release is grabbed. qBittorrent honors both (the inactive limit needs qBittorrent 4.6 or later), Transmission honors the inactive limit as its idle limit, and Deluge and rTorrent have no per torrent time limits so they keep their own rules. Indexers synced from Prowlarr pick up Prowlarr's per indexer seed time until you edit them. Thanks ThatDeltaGuy for the request.
  • Delete one file of a book from disk (#2485): each tracked file on the book page now has Delete this file in its More menu, under Forget this file. It deletes only that file, removes its tracking row, prunes the folder if it is left empty, and records the deletion in history; other files on the book are untouched. The same library root and ownership checks as the other delete actions apply, and if the file cannot be safely removed Bindery says so instead of pretending it worked. Forget this file still only stops tracking without touching the disk. Thanks trevorswanson for building it.
  • Series page filters (#2871): narrow the Series page to series with missing books, complete series, series not linked to Hardcover, or your shortlist. Missing and complete use the same count as each card's missing badge, combine with the title search, and stay in the page address so a reload or the back button keeps them. Filtering never marks, monitors, searches or fills anything. Thanks darkymehdi for the request.
  • Reconcile catalogue now lists the rows it kept for lack of evidence (#2892): rows kept because provider or profile evidence was incomplete used to show up only as a count. Each one is now listed with its title, provider and the reason, such as language could not be confirmed, so you can review them yourself. They still can never be removed automatically. Thanks kevinatlee.

Changed

  • Easier multi select on the author page (#2456, #2457): picked books now stay picked after a bulk action, so you can run several actions on the same books in a row and clear them with the Clear button when you're done. While books are selected, clicking anywhere on a book card or row adds or removes it instead of opening the book. Deleted books drop out of the selection on their own. Thanks flaevers for both requests.
  • Ranking normalises the audiobook size bonus by the book's runtime, and caps the grabs bonus (#2740): the size term rewarded total bytes, so of two releases of the same book the larger file always gained more, whatever its bitrate. When a book has a stored runtime an audio release is now scored by its density in MiB per minute at the same points-per-MiB the flat term used for a ten-hour book, so a ten-hour book is scored exactly as before and a shorter or longer one is no longer rewarded or punished for its length. The grabs term is capped at 100 grabs, so a release with thousands of downloads can no longer dominate the format and size terms. A book with no stored runtime scores exactly what it scored before, and duration_seconds is only filled from Hardcover, Audible, Audnexus with an ASIN, or an Audiobookshelf import, so on a default install the normalised path is rarely reached. Thanks tunglambk for building it and magrhino for the request.
  • Forks no longer run upstream only workflow jobs: image publishing, GoReleaser, the Discord release post, and the nightly telemetry backup, ping drift and backlog sweep jobs are now skipped outside vavallee/bindery instead of failing on every sync. Thanks magrhino.

Fixed

  • Per indexer seed ratio now reaches Transmission (#2206): the ratio was sent with the add request, which Transmission ignores, so torrents kept the global ratio. It is now applied right after the torrent is added.
  • A magnet that never gets its metadata is now failed instead of sitting at downloading for ever (#2709): a torrent your client accepted but never resolved has no files, no size and no progress, and no client calls that an error, so nothing ever cleaned it up. Once it is older than the stall timeout (2 hours by default) Bindery removes it from the client, fails the queue row saying the metadata never resolved, and searches again, skipping that release so the search can pick another one. Works with Transmission, qBittorrent, Deluge and rTorrent, and Transmission audiobook downloads are now checked for stalls too. The release is not blocklisted, because a magnet with no metadata usually says more about the connection than the release, and if most of a client's unfinished torrents look that way Bindery logs a warning and leaves them all alone. Thanks ccarpinteri for the report.
  • Transmission audiobook downloads are picked up again when the client has an audiobook category (#2712): with an audiobook category set on a Transmission client, audiobook grabs were saved there but Bindery only checked the ebook category, so finished audiobooks stayed at downloading and never imported. Both categories are checked now, the same as the other clients. Thanks ccarpinteri.
  • Hardcover refresh keeps concurrent book edits (#2758): a book edit made while Hardcover editions are being fetched, including a language detected from an imported EPUB, is no longer overwritten by the refresh. Thanks magrhino for the fix.
  • Search after a Hardcover refresh uses current book state (#2758): monitoring and ASIN values are reloaded before searching, even when the edition fetch is empty, unchanged, or fails.
  • Automatic search no longer grabs a longer book that contains your title (#2812): the check added in v1.35 that stops "The Power of Writing It Down" passing for "Power Down", or "Beyond Order: 12 More Rules for Life" for "12 Rules for Life", only ran on a fallback path, so automatic search and the interactive Search button never used it. The same check also turns away a release for the wrong volume when both spell it the same way, such as "Volume 16" for a book titled "Volume 17". A number padded with zeros still counts as the same number, so "Vol 07" or "Book 07" matches a book numbered 7, while "17" or "70" does not. The relevance filter is now one piece of code shared by every search, so a check cannot reach one path and miss the other again. The interactive search panel also says which check dropped a release: a different author for this title, or the title's words with other words or numbers among them.
  • Books stored as "Series 4: Title" now match releases that name only the title (#2813): a book whose title carries its series and position ahead of a colon, like "Feral Mage 4: The Mining Company Contract", was only ever matched on the whole name or on the series half, so a release called "The Mining Company Contract by Chase Kilgore" was dropped by both automatic and interactive search. The book's own title is now tried as well when the part before the colon ends in a number ("Feral Mage 4", "Book 8", "Discworld #3"), after the stricter readings fail, and it has to be at least two meaningful words, keep its words in order, and not name a different author. An ordinary "Title: Subtitle" is unaffected. Thanks OMegaliterosMalakas for the report.
  • A book titled "Volume 17" now finds releases named "Vol 17": search used to drop the right release whenever the book and the release spelled the volume differently (Volume, Vol, Vols, Volumes). It works both ways now, and a release for a different volume number is still turned away. A format note in the middle of a title, such as "(Light Novel)" or "(Manga)" in "The Rising of the Shield Hero (Light Novel) Vol. 17", is also left out of the search and the match, since release names never carry it and some indexers returned nothing because of it. Thanks Fear Vector for the report.
  • No more Content Security Policy error in the browser console on every page (#2911): the small script that picks light or dark mode before the first paint sat inline in index.html, and Bindery's own script-src 'self' policy refused to run it. The UI still loaded, but the error was logged on every page and the dark theme could flash light for a frame. The script now loads as theme-bootstrap.js from Bindery itself, which the policy allows, including under BINDERY_URL_BASE. Thanks ractive1974 for the report.
  • Audiobooks grabbed from a combined search go to the audiobook category (#2933): on a book that wants both formats, grabbing a release from the Audiobooks group of "Search ebook + audiobook indexers" sent it to your download client's ebook category and download folder. It now uses the audiobook category, the same as "Search audiobook indexers" always did. The Wanted page and force grabbing a held release had the same problem and are fixed too. Automatic search was never affected. Thanks fearvector for the report.
  • An audiobook no longer lands on a later book in its series (#2934): when one book in a series is titled like "The Primal Hunter 3" and another like "The Primal Hunter 17: A LitRPG Adventure", Bindery could not tell the two numbers apart once a subtitle followed the number, so volume 3's files were attached to volume 17. Volume 3 then stayed Wanted with an import in its history and nothing on the book. Library scans, Import from a folder and adding new books to an author now compare the series number wherever it sits in the title. Files already attached to the wrong book stay where they are: use Forget this file on the wrong book, then run a library scan and it goes to the right one. Thanks fearvector for the report.
  • Importing an audiobook's tracks from a folder keeps them all in one place (#2935): scanning an audiobook's own folder lists every track as a row, and importing those rows for one book ran each track as a separate audiobook. Running together, the tracks split across "Title" and "Title (2)" folders, could overwrite each other when an audiobook file template was set, and every track after the first was marked imported without being moved. Tracks imported together for the same book now land in one audiobook folder, named from the audiobook file template, the same as a downloaded multi part audiobook. A row now offers to use its book for the other tracks in the same folder, so the book is picked once instead of once per track, and importing onto a book that already has an audiobook is refused with a reason instead of reporting a success that moved nothing. Thanks fearvector on Discord for the report.

Don't miss a new bindery release

NewReleases is sending notifications on new releases.