github vavallee/bindery v1.28.1

4 hours ago

A bug-fix release, and most of it is one bug wearing different hats: two sides
of a string comparison were being reduced through different alphabets, so they
could never match. That single shape made accented and non-Latin books
unfindable, split authors into duplicate rows, stopped the library scan
reconciling files it had already imported, and merged unrelated series
together. Those folds now live in one place, with a test suite that fails the
build when two of them disagree rather than waiting for the bug report.
Alongside that: the install-wide Default monitor mode is finally honoured
by the bulk importers that were ignoring it, the Search page stops offering
movie rips and usenet fragments with a Grab button next to them, and every
Settings field confirms when it saves.

Fixed

  • Accented and non-Latin titles and authors return results again (#1642) —
    searches for a book whose title or author had a diacritic at the start or end
    of a word ("Ölümün Sonu", "El mundo que Jones creó", "Édition collector"), or
    that used a non-Latin script (Chinese, Cyrillic, Greek, Hebrew, Arabic),
    matched nothing at all — even when an indexer returned a release named exactly
    like the book. Measured against a real library, 110 of 382 books with a
    non-ASCII title could never be found, and they stayed in the wanted list being
    re-searched on every sweep. The matcher's word-boundary rule only understood
    ASCII letters, so a keyword touching a non-ASCII character was impossible to
    match; it now understands the full Unicode alphabet. Single-word titles by an
    author with a non-Latin name (for example "Circle" by 刘慈欣) were affected
    too, because those searches require the author to match. Accents inside a
    word ("Miéville", "Stanisław") were never affected.
  • Authors with dotted initials match releases again (#1608) — a name like
    "J.R.R. Tolkien" produced an author token ("j.r.r") that can never appear in a
    normalized release name, so searches for single-keyword titles ("The Hobbit")
    returned zero results even when indexers found dozens. Author names are now
    normalized the same way release titles are before tokenizing; hyphenated first
    names ("Mary-Kate") are fixed by the same change.
  • Books with an apostrophe or umlaut in the title no longer waste indexer
    queries
    (#1643) — a search for a title like "Ender's Game", "The Handmaid's
    Tale" or "Der Prozeß" threw away a perfectly good indexer response, misreading
    it as an irrelevant category feed, and then re-queried the same indexer three
    more times. This happened on every search for those books, and on a
    rate-limited indexer it could turn into a hard failure that returned no
    results at all despite the correct release having already been found. The
    check now compares both sides of the match in the same form.
  • "Default monitor mode" now applies to every way an author gets added, not
    just the Add Author button
    (#1666) — the setting says "Applied to newly
    added authors", but only the manual Add Author form ever read it. Every import
    created the author with no mode at all, which the database quietly turned into
    "all books", so the one setting people reach for before a bulk import did
    nothing on exactly the paths they were trying to protect. Two reports: a
    Calibre library imported from scratch with the default set to None still
    produced authors monitoring everything, and a CSV author import queued about
    1250 books for download. Calibre, Audiobookshelf, CSV, Readarr and Goodreads
    imports, the series backfill and the author created behind a manual Add Book
    all honour the setting now, including the latest-book count. Anything that
    already picks a mode on purpose keeps it, so Hardcover list sync still
    monitors only the books on the list, and existing authors are untouched.
  • The Search page no longer offers movies and usenet junk to grab — the
    video and non-book guards added for #1591, and later extended to the
    search-details pipeline in #1644, were missing from the freeform search behind
    the Search page. A query could return movie rips (1080p, x265,
    S01E02, releases the indexer itself filed under Movies/TV) and raw
    per-article usenet postings (.part03.rar, [12/22], yEnc), each with a
    Grab button next to it — and grabbing one imports the wrong file. The same two
    content guards the book searches use now apply here. Relevance filtering is
    deliberately not applied: a freeform query has no book to score against, so
    which results are relevant stays the user's call.
  • Interactive search no longer shows video releases the automatic grabber
    rejects
    (#1644) — the guard that keeps movie and TV releases out of book
    results was applied to scheduled searches but was missing from the search you
    run yourself, which is the one the UI uses. Releases tagged 1080p/x264/WEB-DL,
    or filed by the indexer under Movies, TV or similar, could therefore appear in
    manual search results and be grabbed by hand. The search details panel now
    also reports how many results that stage removed.
  • Library scan reconciles books whose author folder writes initials without
    spaces
    (#1646) — a folder named "J.R.R. Tolkien" never matched the
    catalogue's "J. R. R. Tolkien", because the run-together form produced a token
    no author name can contain. Audiobook releases write initials this way almost
    universally, so those books stayed unmatched across every rescan. Manual
    import was unaffected, which is why it looked like only the scan was broken.
  • Library scan matches accented names and titles regardless of how they are
    encoded
    (#1646) — macOS reports filenames with accents stored separately
    from the letter they sit on, while every metadata provider returns them
    combined. Nothing in the scanner reconciled the two, so "Björn Andersen" on
    disk never met "Björn Andersen" in the catalogue. Titles had a worse version
    of the same bug: "Die Höhle" was being reduced to "die hle" before comparison.
  • Library scan matches German titles spelled either way (#1646) — "Die
    Hoehle" on disk now matches "Die Höhle" in the catalogue, and "Der Prozess"
    matches "Der Prozeß", the same way the indexer already matched them.
    Apostrophes too, so an "Enders Game" file finds "Ender's Game".
  • Bulk folder import matches transliterated author names (#1646) — "Boell,
    Heinrich" now resolves to "Heinrich Böll" instead of scoring far too low to be
    considered a match.
  • Calibre import stops creating duplicate authors (#1647) — Calibre compared
    author names byte for byte, so an author already in your library from
    Audiobookshelf or OpenLibrary got a second row whenever Calibre spelled the
    name differently ("J.R.R. Tolkien" against "J. R. R. Tolkien", or an accented
    name written in a different Unicode encoding, which Calibre on macOS
    produces). The books then showed up split across two author pages, and every
    later import recreated the split.
  • Missing descriptions, covers, ratings and genres get backfilled again
    (#1647) — the enrichment step matched candidate books by comparing raw author
    and title strings from two different providers, so any book whose providers
    disagreed about initial spacing or accent encoding was never enriched. Because
    the comparison always failed the same way, it never recovered on retry.
  • A German author from DNB no longer ends up alongside a duplicate from
    OpenLibrary
    (#1647) — the check that exists to merge those two rows compared
    "Tolkien, J. R. R." against "Tolkien, J.R.R." and found no match, so it
    created exactly the duplicate it was meant to prevent. Case handling for
    non-English letters was broken in the same query.
  • German and Scandinavian authors no longer end up duplicated or stuck in the
    review queue
    (#1647) — author matching stripped accents ("Müller" →
    "muller") while every title matcher expands them ("Müller" → "mueller"), so a
    name spelled with accents in one place and ASCII-ised in another ("Jörg
    Müller" vs "Joerg Mueller") scored just under the auto-accept threshold. The
    same gap affected "Nesbø"/"Nesbo" and "Łukasz"/"Lukasz". Both spellings now
    resolve to one author.
  • Non-Latin series no longer collapse into one shared series (#1645) — a
    series whose title had no Latin letters (Japanese, Chinese, Russian, Greek,
    Hebrew, Arabic) produced an empty identity, so the first such series imported
    claimed a shared row and every unrelated non-Latin series afterwards was filed
    under it. Accented Latin could collide the same way ("Ödland" and "Ådland"
    were treated as the same series). Series identities are now built from the
    full Unicode alphabet, with accents folded to their base letters, and a title
    with no letters or digits at all is skipped instead of being given a
    placeholder identity. Creating a series with an empty identity is now rejected
    outright, so no future import can reintroduce the same merge.
  • Japanese, Hindi and Greek series no longer merge into each other
    (follow-up to #1645) — the fix above folded accents by stripping every
    combining mark, which is only correct for Latin. In Japanese those marks are
    part of the letter, so "ハード" (hard) and "ハート" (heart) both became
    "ハート" and shared one series row. Hindi vowel signs are spacing marks, so a
    Devanagari title was chopped into fragments instead of being kept whole. And a
    Greek title in all-caps keyed differently from the same title in mixed case,
    splitting one series in two. Accents now fold for Latin and Greek only — the
    two scripts where they really are accents — and every other script keeps its
    letters intact. Latin letters that carry no accent to strip (ß, ø, ł, æ, œ, þ,
    ð) now fold in slugs too, so a series is no longer split by spelling
    ("Straße-Serie" and "Strasse-Serie" are one series). Existing ASCII series
    identities are unchanged.
  • Accented titles no longer produce two different indexer searches (#1648) —
    the same title could be sent to indexers in two different encodings depending
    on where it came from, which also gave it two different deduplication keys.
    Found by the new consistency test, not by a bug report.
  • Books stored with a format tag in the title stop getting a duplicate row
    (#1648) — a book saved as "Title [Unabridged]" was not recognised as the same
    work as OpenLibrary's "Title", so an author sync created a second row for it.
  • Series named "... Series" or tagged "[Audiobook]" can be upgraded to full
    Hardcover data
    (#1648) — the lookup and the upgrade check disagreed about
    what counts as the same series name, so some series matched one and failed the
    other.
  • Every settings field now confirms when it saves (#1668) — the little green
    "Saved ✓" only appeared on some fields. Saving the book naming template, the
    audiobook folder template, the per-track audiobook template, either API key,
    or the log retention days gave no feedback at all, so there was no way to tell
    a save had gone through short of reloading the page. All of them confirm now,
    and there is one shared button behind them rather than a copy per field, so
    the next one can't quietly go missing. Failed saves show "Error" instead —
    three of those fields were swallowing the failure entirely, which would have
    shown a green tick on a save that never happened.
  • OIDC callback URLs behind trusted proxies — redirect auto-detection now
    retains the original trusted proxy identity after real-client-IP resolution,
    preventing HTTPS callbacks from incorrectly falling back to HTTP.

Changed

  • A non-Latin word now breaks phrase matching the same way an English one
    does
    (#1642) — previously a "contiguous" title phrase would silently skip
    over an intervening Cyrillic or CJK word, because the matcher treated every
    non-ASCII letter as punctuation. Such titles are now handled by the same
    gap-tolerant path that already handled their English equivalents, so nothing
    is lost.
  • Normalization rules are defined in one place (#1648) — the character
    folding used to compare titles and release names was copy-pasted into three
    packages and had started to drift, which is what caused #1643 and made #1642
    possible. It now lives in a single shared helper, with the four
    legitimately-different comparison alphabets (title matching, author identity,
    sort keys, slugs) documented alongside it. No change to how releases match.
  • Author name handling is defined in one place (#1648) — several helpers
    that build author search queries and sort names existed as identical copies in
    four packages. They now live in one, and a new test suite compares every
    normalization rule in the codebase against a corpus of awkward names and
    titles (dotted initials, possessives, umlauts, Nordic and Polish letters, CJK,
    Cyrillic, Greek, Hebrew) so that two of them disagreeing is a build failure
    rather than a bug report months later.

Don't miss a new bindery release

NewReleases is sending notifications on new releases.