github vavallee/bindery v1.51.0

one hour ago

Torrent results show seeders and peers, the Series page finds and merges duplicate series, authors without a quality profile are now visible and fixable, and qBittorrent behind a reverse proxy can log in. /metrics gains grab, download client, import, indexer and queue metrics. There are no database migrations and no new settings. One upgrade note for Helm users is below.

Upgrade notes

  • The Helm chart now refuses replicaCount above 1. Bindery keeps its data in a single SQLite file and runs its scheduler inside the process with no leader election, so a second pod would duplicate grabs and imports and can corrupt the database. helm install and helm template now fail with a message explaining this instead of rendering two pods. A value of 1 (the default) or 0 is unaffected. If you had set a higher value, set it back to 1. The liveness probe restarts a stuck pod and the readiness probe takes an unhealthy one out of the Service.
  • PUT /api/v1/author/{id} treats an explicit "qualityProfileId": null as clearing the profile (#3831). Leaving the field out still keeps the profile the author has.
  • Nothing else changes on upgrade: no migrations, no renamed or removed settings, and the chart's probes and NetworkPolicy defaults are as in v1.50.0 apart from the smoke pod labels below.

Added

  • Seeders and peers on torrent search results (#3819, #3820). Interactive search on the book page, the Wanted page and the Search page now shows a torrent release's seeders and peers next to its grab count, read from the torznab seeders and peers attributes Prowlarr and Jackett send. Grabs is a lifetime count, so this is what tells a well seeded release from a dead one; a release with 0 seeders is shown in red. Usenet results and indexers that do not report the counts look as before. Thanks Chadlenberg for the request and NopeCharon for the change.
  • Find and merge duplicate series in bulk (#2173, #3828). Libraries that ran both the Calibre and the Audiobookshelf import often hold the same series twice, and the Audiobookshelf import can't link a Hardcover series to items whose series title matches two rows. The Series page now tells admins how many titles appear more than once and lists them with book counts, authors and Hardcover links. Merge a group through the usual preview, or merge every group whose authors match in one go after a dry run summary. Groups with different authors are left for you to check by hand. Titles match regardless of case, punctuation, accents, a leading "The" or a format tag like [Audiobook], but any other bracket or parenthesis counts, so sub series like "Discworld (Witches)" and "Discworld (City Watch)" are never offered as duplicates or merged in bulk. Any merge also lets the next normal Audiobookshelf import retry the items it reported as seriesLinkFailed, so no full import is needed. Thanks gavinmcfall for the report.
  • Default quality profile for new authors (#3831, #3834). Settings, Quality Profiles has a new default that every newly added author gets when nothing else picks one: adding a book, series fill, the ABS, Calibre and CSV imports, Hardcover lists without their own profile, and the Add Author and request approval dialogs when you leave their picker alone. It starts empty, which means none. If the default profile has upgrades on, authors created by an ABS or Calibre import join the upgrade sweep straight away.
  • Fix existing authors in one go (#3831, #3834). Please open Settings, Quality Profiles after updating. If some authors have no quality profile, a notice says how many and lets you give them one with a confirm step. It covers every author in the library with no profile, including ones added by approving a request. Only authors with no profile change, and nothing happens until you press Apply.
  • Operational metrics (#3851, #3862). /metrics now also reports grabs, download client requests and their latency, import outcomes with a failure reason, indexer searches and their latency, the download queue by state, and when each scheduled job last finished cleanly. Every label comes from a small fixed set, so nothing about your library ends up in a label. See docs/metrics.md for the full list.
  • Readiness endpoint that checks the database (#3849, #3858). GET /api/v1/health/ready answers 503 when Bindery's database connection is closed or unusable or the driver returns an error, and 200 otherwise, with no credentials needed. A database that is only busy with a long scan, import or VACUUM still counts as ready, so those jobs never take Bindery offline. The Helm chart's readiness probe stays on /api/v1/health in this release and moves to the new route in the next one, so a chart newer than your image never points at a route the image lacks. Liveness and the Docker healthcheck stay on the static /api/v1/health, so a slow disk never triggers a restart.

Changed

  • Authors with no quality profile no longer hide it (#3831, #3834). An author with no quality profile accepts every format, at grab and at import, so a PDF can land under what looks like an epub only setup. Authors added from the Add Author dialog never got a profile, and Edit Author showed the first profile as if it were picked. Both dialogs now have a "None (accepts every format)" choice that shows the real state, and Add Author (and request approval) let you pick the profile. Thanks to sladester for the detailed report.
  • SABnzbd and NZBGet now share one NZB download (#3795, #3838). The two clients each carried a copy of the code that fetches an NZB from an indexer. It now lives in one place, so a fix to the address checks, size limit or error handling applies to both. Behaviour is unchanged. Thanks NopeCharon.

Fixed

  • qBittorrent behind a reverse proxy can log in again (#3668, #3793). Bindery's login sent Origin and Referer headers that qBittorrent's CSRF check compares with the host it receives, so a seedbox or any other proxied qBittorrent turned the login away with HTTP 401: Unauthorized while the *arr apps connected fine with the same settings. The login now sends neither header, like those clients, the base URL leaves out a default port (443 for https, 80 for http) so the Host header matches what a proxy expects, and a remaining 401 explains that it comes from a proxy login or qBittorrent's Host header validation, not the username and password. Thanks Duckburg-Net for the report and NopeCharon for the fix.
  • Approving a request for a book that is already in the library works again (#3835, #3837). If someone else added the book while the request waited, approving used to answer that the book is already in the library, and nothing else could be done with the request. Now, if the request asked for a format the book does not have or monitor yet, approving monitors that format on the existing book and searches for it. If the book already has everything that was asked for, approving adds nothing and simply resolves the request, and the Requests page tells you so. Pending requests the library already covers get an "Already in the library" badge. Approving a format on a book its owner skipped makes that format wanted again. With multiple accounts, a book another account added no longer blocks the request when it already covers what was asked; only a missing format on someone else's book is still refused, and the request can be declined. Declining always worked. Author requests are unchanged. Thanks to flaevers for the report.
  • One half of a two part audiobook is no longer grabbed as the whole book (#3417, #3822). A dramatized recording posted as two releases, titled like Morning Star (1 of 2) and Morning Star (2 of 2), used to be grabbed as one half and the book marked done. Releases that say they are one slice of a set, written (N of M), [N of M] or Part N of M, are now skipped for audiobook searches, including two part sets, and the complete release is picked instead. They are listed with the reason in the search debug view. A series position such as Book 1 of 6, a name with Complete or All parts, and ebook searches are not affected. Reported by King on Discord.
  • Importing from Calibre no longer creates a second copy of a series that already exists (#2173, #3827). The Calibre import now files a book into the existing series of the same title when that series holds books by the same author or none yet, preferring one that already holds the author's books. A same titled series holding only other authors' books is left alone, as is an empty one linked on Hardcover to another author, and sub series like "Discworld (Witches)" and "Discworld (City Watch)" stay apart. Those duplicate copies were what made the Audiobookshelf import log ambiguous existing series match and skip the Hardcover series link. Copies an earlier import already made stay until you merge them on the Series page. Thanks gavinmcfall.
  • ABS import runs list now pages (#2173, #3826). GET /api/v1/abs/import/runs ignored limit and offset and always gave back the newest 10 rows. Runs are stored one per library, so a big import over many libraries only showed its last 10. It now honours both (default 10, max 200). The ABS import guide has a new Big Libraries section. Thanks to gavinmcfall for spotting it.
  • Helm chart: the PostSync smoke hook works with the NetworkPolicy enabled (#3848, #3855). The smoke Job's pod no longer carries the Bindery Service selector labels, so it is not swept into the NetworkPolicy's egress lockdown or listed as a Service endpoint. The NetworkPolicy now also admits the smoke and log alert pods when networkPolicy.ingressSelector is set.

Security

  • Built with Go 1.26.11 (GO-2026-6859). The Go standard library had a bug where an HTTP/1 server using MaxBytesReader could crash with a runtime panic if a handler read the request body while writing the response. The release images and binaries now use the fixed Go version.

Don't miss a new bindery release

NewReleases is sending notifications on new releases.