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/requeststakes an optionalforUseruser 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 sendsforUsergets 403, and nothing changes for requests made without it.GET /api/v1/system/statusnow reportsfeatures.requestsForUserso an app can tell whether this Bindery supports it; SeerrNG's Bindery backend checks it before sendingforUser. Adds database migration 113. Thanks to magrhino for the feature. - Configurable library directory mode (#3207, #3208).
BINDERY_DIR_MODEsets the mode of the author, book, audiobook, metadata-opf and drop-folder handoff directories the importer creates. Accepted values are0700,0750and0755, with the default staying0750. 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./activityopens 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
unexcludeaction onPOST /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 daylimit is now treated as the daily quota running out, whatever its reason field says. Google sends some of them with reasonrateLimitExceeded, 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 likeFrankenstein; or, The Modern PrometheusorThe Hobbit, or There and Back Againwere dropped with "title/author keywords did not match release name", so automatic search could only grab a release using the short title. Anorafter 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 asFoundation and EmpireforFoundationorTruth or DareforTruth, are still rejected, and so is anorthat 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 - Titlefile 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 toH.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
moveslist (#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 treatsBook OneandBook 1(book, volume, part, season and similar, one to twenty) as the same position while still rejectingBook 10andBook 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 m4bslipped 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
zodpackage to 4.6.7, which fixes a high severity memory exhaustion advisory (GHSA-mrhx-c7xc-m3w5) that was failing the frontendnpm auditcheck.
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.