github vavallee/bindery v1.46.0

7 hours ago

The library pages move to one shared table and filter bar, OPDS reading apps can search the catalogue, a request front end can file a request as the person who asked, the importer's directory mode is configurable, and a run of search, duplicate review and importer fixes from kennethp1015's reports

Added

  • OPDS catalogue search (#3463, #3493): The OPDS catalogue now offers search, so reading apps like KOReader and Moon+ Reader show their search button and can find a book by title or author without browsing. It uses the same matching as the Books page, only lists books you own, and pages like the other feeds. Thanks to kennethp1015 for the request.
  • Request front ends can file a request as the person who asked (#3337, #3389). POST /api/v1/requests takes an optional forUser user id from an admin session or the API key, so an app that keeps its own users can make each request as that person instead of as the first admin. The request is theirs: it shows on their My requests, counts against their pending limit, and approves itself only if their account has auto-approve on. Requests shows who actually made it, "made for them with the API key" or "made for them by" an admin. Anyone else who sends forUser gets 403, and nothing changes for requests made without it. GET /api/v1/system/status now reports features.requestsForUser so an app can tell whether this Bindery supports it; SeerrNG's Bindery backend checks it before sending forUser. Adds database migration 113. Thanks to magrhino for the feature.
  • Configurable library directory mode (#3207, #3208). BINDERY_DIR_MODE sets the mode of the author, book, audiobook, metadata-opf and drop-folder handoff directories the importer creates. Accepted values are 0700, 0750 and 0755, with the default staying 0750. Useful where storage rewrites client IDs server-side (NFS exports with squash/mapall) or other programs need to read the library. Thanks to Renox-1 for the contribution.
  • Sort and format filter on Wanted (#3440), kept in the URL, and a "Search this page" button that asks first. A sort picked while searching now applies on Wanted and Books; before, the best match order overrode it.
  • Series headings on the author page open that series (#3457, #3460). With Group by series on, a series heading links to the Series page with that series open. The Series page now scrolls the opened series into view, also when it is opened from the Authors page or the header search, so it no longer sits somewhere down a long list. Thanks to bhaveman for the suggestion.

Changed

  • One table and filter bar for library lists (#3435). Lists share square checkboxes, sortable headers, a header box that selects the page, rows that open from the keyboard, and a result count that is announced when a filter changes it. Wide tables scroll inside their own box with the first column pinned. The rest of this block is the pages moving onto it.
  • "In library" replaces "Imported" (#3436) as the badge for a book that has every format it wants, matching the Books filter. The status legend is a "?" next to the status filter, and format badges are translated.
  • One cover placeholder everywhere (#3437). A book without a cover gets the same muted colour tile on every list, the add book dialog included, with initials where the title is printed beside it. Initials handle emoji and Chinese or Japanese titles.
  • Authors page actions and table (#3438). Add author is the one primary button; Add book, Add series, Merge and Refresh all sit in a More menu. Grid cards show a Monitored badge and a card menu. The Sort popover lists every sort a column header can set. Sorting by rating, in either direction, now puts authors with no rating last instead of mixing them in.
  • Bulk bar keeps destructive actions behind a menu (#3439). At most four actions show inline on desktop and two on a phone; Delete and Blocklist are always under More bulk actions and ask first, naming the count. The three format buttons are one Set format menu.
  • One header search, and a failed downloads badge (#3441). The library search offers "Search indexers for ..." and opens the indexer search with the query, also when that page is already open with another query. Activity and Queue show how many downloads failed, refreshed every minute from a new GET /api/v1/queue/failed-count. /activity opens Wanted.
  • Book page (#3442). Genres show as tags, the switch reads "Monitored", every delete is in one More menu, Re-bind sits in the Metadata source section, and history rows lead with the event, the release name below it.
  • Import suggestions (#3443). Suggestions below 60% are collapsed under their own heading and never preselected. "Confirm N strong matches" lists every file and the book it goes to, stops at the first failure and says how far it got, and leaves alone any row decided in the meantime.
  • Queue shows All, Active or Failed (#3444), kept in the URL, on the shared bulk bar. Changing the view clears the selection, so Remove selected only removes rows you can see. The remove options are in the Remove confirmation.
  • Author page actions on a phone (#3446). Refresh and Edit move into More, so the action row stays on one line.
  • Books table no longer cuts off the Status column (#3447). The table scrolls inside its own box, status stays in the filter bar, Type and Monitored move under Filters, and the result count sits at the end of the filter row.
  • Author page book filters (#3448). The six dropdowns above an author's books are one filter bar, remembered across author pages. The bulk bar gains Search for the selected books, and bios no longer show leftover "[1]:https://..." lines or "(Source.)".

Fixed

  • Failed loads no longer read as empty lists (#3445). Series and History say when loading failed and offer Retry, and History says when a filter hides every event. Regenerate API key and Rotate session secret are outlined as destructive, the theme switch says Light or Dark, indexers synced from Prowlarr are marked, and release names on History and the book page decode HTML entities such as &.
  • Translatable interface (#3411, #3433): about 490 strings that were written straight into the interface, and so stayed in English in every language, can now be translated, among them most of Settings, the queue, the author page, the rename and series dialogs and the error page. They are translated into Norwegian Bokmål; other languages show them in English until a translator picks them up. A test now fails when new interface text is added without going through translation. Thanks to francisrath for the report and the fix.
  • Badges, chips, toggles and error text readable in the light theme (#3084, in #3396, #3397, #3432 and #3456): the Calendar's release badges, the Series page's status badges, the Metadata and Notifications toggles, the History page's actions, the queue's progress and two error messages used dark-theme colours that were close to invisible on light, and now have light-theme shades that meet WCAG AA. Red error and warning text meets AA contrast on light cards and pages. The "in Calibre" chip on a book and the imported badges in History were green text on a pale green tint at 4.2:1, under the 4.5:1 that text needs, and now use a darker green (5.8:1). Red, amber and sky chips such as failed and deleted events in History, the Excluded badges and the Calibre status chip were down to 2.5:1 and now use a darker shade (5.6:1 and up), with the contrast test guarding explicit hues too. The dark theme is unchanged throughout. Thanks to francisrath for all four parts.
  • Bulk Un-exclude on the author page (#3454, #3458). The Excluded view of an author page had a bulk Exclude and no way back. It now shows Un-exclude for the selected books, backed by a new unexclude action on POST /api/v1/book/bulk. Thanks to patspam for asking.
  • Google Books daily quota refusals are no longer retried (#3451, #3459). A 403 or 429 whose message names the Queries per day limit is now treated as the daily quota running out, whatever its reason field says. Google sends some of them with reason rateLimitExceeded, which was retried like a per minute throttle, so every lookup made three requests instead of one. The per minute limit is still retried. Thanks to TheOpsMgr for the debug log export that showed it.
  • Book search finds books by series name (#3462, #3495). Typing a series name on the Books page, such as Inspector Ian Rutledge, found nothing unless a book title happened to contain it, and adding it to an author search emptied the list. The search now also matches the names of the series a book is in, with title and author matches still listed first. The Requests page library search matches series names the same way. Adds database migration 114; existing series are indexed automatically on the first start after upgrading. Thanks to kennethp1015 for the report and orshih6 for the original fix.
  • Releases naming a book's alternate "or" title are no longer filtered out (#3402, #3496): For a one-word title such as Frankenstein, releases like Frankenstein; or, The Modern Prometheus or The Hobbit, or There and Back Again were dropped with "title/author keywords did not match release name", so automatic search could only grab a release using the short title. An or after a comma or semicolon, or followed by an article, is now read as the book's alternate title. Releases that run on into a different book, such as Foundation and Empire for Foundation or Truth or Dare for Truth, are still rejected, and so is an or that leads into another title in your library. Thanks to orshih6 for the fix.
  • Ebook content check now catches another book by the same author (#3461, #3489): with the check on, a file whose title is a different book of the wanted book's author, like the next volume in a series, used to pass because the author matched. It is now flagged when the file's title is another book in that author's catalogue, and refused in block mode when that book is at a different position in the same series. When Bindery cannot tell it from another edition of the wanted book it only notes it. Warn mode still only notes it, and translated or alternate titles that are not a separate book in the catalogue are left alone. Thanks to kennethp1015 for the report.
  • A library scan no longer matches an Author - Title file on the author's name (#3465, #3475). When the reversed reading of such a file in its author's folder finds no book, the scan used to take the author's name as the title and link the file to a catalogue row named after the author ("Stephen King 8"). It now goes on to the book folder's title, or leaves the file unmatched with the title side as its parsed title. Thanks to kennethp1015 for the report and pujitha24 for the fix.
  • Adding a book you already have under another edition answers at once (#3466, #3479). Adding "Ready Player One" when "Ready Player One (Movie Tie-In)" was in the library waited 15 seconds and then said "book not found after author sync, try again shortly", every time. It now answers right away with the existing book, the same "already in your library" reply as adding the same book twice. Thanks to kennethp1015 for the report.
  • A book with several ebook formats now serves the EPUB first (#3467, #3477). When a release held, say, AZW3, EPUB and MOBI, the book's main file was whichever was imported first, so OPDS and downloads handed out the AZW3. The main file now follows one order: EPUB, KEPUB, AZW3, MOBI, PDF, then anything else, and a library rescan fixes books already imported the old way. Every file is still kept. This is deliberately EPUB first, so the file served and offered follows EPUB first even where a quality profile ranks AZW3 higher for searching, and a Kindle focused order from the quality profile is a possible follow up. Thanks to kennethp1015 for the report.
  • Windows: a folder ending in a dot, or with other capitals, no longer shows as a new file (#3468, #3488). On Windows a book titled H.R.H. was moved into a folder Windows quietly renamed to H.R.H, and a move into an existing folder kept that folder's own capitals. The stored path still opened, but the next library scan counted one file fewer as tracked and listed the same file as unmatched. Bindery now leaves off the trailing dots and spaces Windows would drop when it builds a folder or file name, and the scan and the reorganize preview treat paths that differ only by capitals or a trailing dot as the same file on Windows. Libraries already stored this way need nothing rewritten, the next scan simply recognises them. Linux and macOS paths are unchanged. Thanks to kennethp1015 for the detailed trace.
  • Duplicate review no longer joins two different books through a bundle row (#3469, #3484, #3499, #3500). A row like "Carrie; Christine" used to pull "Carrie" and "Christine" into one group, which hid the one click cleanup of each book's own empty duplicates. A row with a semicolon that holds two titles that do not match each other is now treated as a bundle and does not show up in any duplicate group. A bundle whose first part has a subtitle, like "Mistborn: The Final Empire; The Well of Ascension", could still pull a bare "Mistborn" and "The Well of Ascension" into one group, so each part is now matched by its main title before the colon as well. That means a bundle row, even one with files, is not listed in duplicate review at all, so look for it in the author's book list. Thanks to kennethp1015 for the report.
  • Reorganize preview and apply return an empty moves list (#3470, #3486) instead of null when there is nothing to move, for example a book with no files. Thanks to kennethp1015 for the report.
  • Audiobook files showing up as ebook files (#3474, #3481): when a library scan found an existing m4b or mp3 for a book set to "both" formats, it was recorded as an ebook file. Files are now labelled by their extension, and a one time repair on startup relabels the ones already recorded wrong. Heads up: a book whose only "ebook" was really an audiobook file may go back to wanted after the repair, and some books may leave the wanted queue now that their audiobook is counted properly. Thanks to Timothy Canipe (Mysticwolf6) for the report.
  • Search finds "Book One" titles named "Book 1" (#3476, #3480). A book whose title spells a position out (Path of the Deathless Book One) never found a release that uses the digit on indexers that need every query word, such as MyAnonamouse. When a search finds nothing relevant, Bindery now sends one extra query with the digit form, and the relevance check treats Book One and Book 1 (book, volume, part, season and similar, one to twenty) as the same position while still rejecting Book 10 and Book 2. The debug panel shows the extra query per indexer. A book that stays unfound pays that one extra query per indexer on every scheduler cycle. Thanks to huepot for the detailed trace.
  • Language filter missing names joined to another word (#3497, #3501): a release like Dungeon Crawler Carl_EspañolNeutro m4b slipped past an English only metadata profile because the language word was glued to another word. A language name at the start or end of a capitalised joined word (EspañolNeutro, DeutschUngekürzt, ItalianoAudiolibro) is now read like a standalone one. Two letter codes are still never read inside a word. This covers the release name only; checking the language tag of an audiobook file at import is still to come. Thanks to jh11-web for the report.

Security

  • Web dependency update (#3471): raises the transitive zod package to 4.6.7, which fixes a high severity memory exhaustion advisory (GHSA-mrhx-c7xc-m3w5) that was failing the frontend npm audit check.

Upgrade notes

  • Two database migrations run automatically at startup: 113 records who a request was made for (#3389), and 114 adds the series search key behind the Books search (#3495). Both are additive and need nothing from you. The same first start also indexes your existing series for search (#3462) and relabels audiobook files that were recorded as ebook files (#3474), which can move a few books into or out of Wanted as described above.

Don't miss a new bindery release

NewReleases is sending notifications on new releases.