Fixes the long-standing "short titles get junk results" problem (e.g. searching "The Sparrow" by Mary Doria Russell no longer returns unrelated sparrow-themed books, comics, and music releases). Inspired by matching patterns in Readarr, Sonarr, and LazyLibrarian.
Added
- Four-tier query fallback in
BookSearch:t=book→surname+title→author+title→ title-only. The new surname+title tier disambiguates short titles without the noise of full-name queries that some indexers fail to match. - Word-boundary keyword matching (
\b...\b) everywhere in the filter and language checks.sparrowno longer leaks intosparrowhawkorsparrows. - Contiguous-phrase matching for multi-word titles. A release must contain the title words together; scattered occurrences no longer pass.
- Subtitle handling for
Title: Subtitlebooks. "Dune: Messiah" accepts releases tagged as either "Dune" or "Dune Messiah". - Composite ranking score: quality × 100 + edition tag (RETAIL +50, UNABRIDGED +30, ABRIDGED −50) + year-match (±20/10/5) + log₁₀(grabs) × 10 + size tiebreaker + ISBN exact-match +200.
- Release parser (
internal/indexer/release.go): extracts year, format, RETAIL/UNABRIDGED/ABRIDGED flags, release group, and ISBN from NZB titles. - Blocklist consulted during search (both manual and auto-grab). The infrastructure existed but was never wired into the search flow.
- Download quality populated on grab via the new release parser.
- 23 new unit tests covering the matching and ranking pipeline.
Fixed
- Scheduler now resolves and passes the book's author name to
SearchBook(previously always empty, which silently disabled thet=booktier, theauthor+titletier, and the filter's surname anchor for every automated search). - Foreign-language tag filter now word-boundary-anchored. The tag
RUSSE(French for "Russian") was substring-matching insideRUSSELL, causing books by authors named Russell, Russ, Russo, etc. to be rejected as Russian-language releases.
Changed
Searcher.SearchBooksignature: now takesMatchCriteria{Title, Author, Year, ISBN}instead of(title, author)so ranking can use year and ISBN signals.
Deliberately out of scope
- qBittorrent grab path and
Download.Protocolhandling (bigger refactor planned separately). - Readarr-style user-facing Quality Profiles (overkill for a single-user tool; hardcoded weights serve 95% of cases).
Image: ghcr.io/vavallee/bindery:v0.4.0
Full changelog: https://github.com/vavallee/bindery/blob/main/CHANGELOG.md