Repository navigation
🎉 Release v1.3.0
Before you update:
- Sign in once after updating. The new sign-in limits remember browsers that have signed in with the password since the update, and such a browser can still sign in while its account is at its limit.
- Behind a reverse proxy, make sure it passes the client address (
X-Forwarded-For), or all visitors share one address limit.- Scripts that call the sign-in endpoints must send
Content-Type: application/json.- Scripts that read job payloads or stored download links from the request detail, request list or recent-requests responses will no longer find them.
- Nothing changes for file placement or metadata until you pick a new option, and the Explicit mark is off until you turn it on.
Features:
- ✅ a Library page for everything in your library and everything requested
- #177
- #572
- #578
- linked from the header for every signed-in user: every book in your Plex or Audiobookshelf library and every audiobook requested through RMAB, each book once, as a cover grid with search, filters for status, source and requester, sort and group by author. Books on the way update live.
- click a book for its details. Admins and the requester also see the error, the download size, the request history and the actions; everyone else sees the book and who asked for it.
- ✅ hard links and metadata.opf for Audiobookshelf imports
- #68
- #597
- in Audiobookshelf mode, Settings > Paths has a new Library files section. File placement: Copy (as before), Hard link (copy if not possible) or Hard link only (don't import if not possible). Metadata: Tags in the audio files (as before), OPF file (metadata.opf) or None. A hard link puts the book in your library without a second copy on disk, so the download keeps seeding from the same file. Ebooks still copy, and Plex mode is unchanged.
- with hard links the audio files are never changed: choose OPF file or None, and turn chapter merge off. When a book can't be linked, "Hard link (copy if not possible)" copies it and the Paths page shows the last book that was copied instead; "Hard link only" imports nothing and the request says why.
- one mount: hard links only work when the downloads folder and the media folder are on the same filesystem and reach RMAB through one mount, such as one
/datavolume holding both/data/downloadsand/data/media. Two separate volumes, even on the same disk, can't be linked; neither can separate ZFS datasets, btrfs subvolumes or Unraid pools. - caution: don't use Audiobookshelf's Embed Metadata on linked books. It writes into the shared file, so it changes the download too.
- in every mode, deleting a request now also removes a
metadata.opfleft alone in the book folder, as it already did forcover.jpg
- ✅ an admin adds a magnet link or a .torrent file to a request
- #596
- #290
- Thanks https://github.com/zpersichetti !
- Add Torrent in the admin request menu, on audiobook requests that are pending, awaiting search, awaiting release or failed, with qBittorrent, Transmission and Deluge. The download, import and notifications then run as usual.
- once it finishes, a torrent added this way seeds until you remove it in your client; cancelling the request while it is still downloading removes it. Admin sessions only: API tokens can't use it.
- ✅ select several requests in the admin table and approve, deny, cancel or delete them together
- #212
- #589
- a checkbox on each row and one in the header for the whole page. Each button shows how many selected requests it applies to, with a Stop button while it runs and a result that lists what was skipped and why.
- bulk delete never touches a book that is in your library or being imported. A deleted request comes back if a watched author or series, or a synced shelf, still lists it: remove that first, or cancel instead.
- ✅ choose the download client category
- #46
- #587
- #239
- Thanks https://github.com/DarthDobber !
- each download client can use its own category (qBittorrent, SABnzbd, NZBGet) or label (Deluge; Transmission uses the typed name as its label) instead of
readmeabook, set in the client's settings or the setup wizard, with the client's own names suggested after Test - RMAB creates and manages only the category it made itself. A category that already exists in the client is used as it is and marked "(existing, left as is)": qBittorrent still downloads to RMAB's folder, while SABnzbd and NZBGet use that category's folder and settings, so RMAB must be able to read it.
- cleanup after import in such a category removes only the imported files. If another app's sorting or scripts put its own audio files in the same folder as RMAB's job, RMAB imports them into the book and removes them with the download.
- ✅ change a book's match on the Bulk Import review screen
- #189
- #588
- #590
- each row has "Change match" (or "Find match" when nothing matched): search Audible or type an ASIN, with Undo to go back to the scan's match
- rows that would import the same book are marked and not imported, a row sent without an ASIN is refused instead of matching an arbitrary book, and the finished screen lists any book that could not be queued, with the reason
- ✅ a processing request shows what it is doing, with a progress bar while chapters merge
- #216
- #585
- "Organizing files", or "Merging chapters" with a real progress bar while a multi-file book is merged into one M4B, on My Requests, the admin request table and the Library page
- for API users: while a request is processing,
progressis 100 except during the chapter merge, when it runs from 0 to 99
- ✅ mark a request Explicit so Audiobookshelf marks the book explicit
- #542
- #582
- off by default: turn on "Explicit mark on requests" in Settings, on the Audiobookshelf tab. Then tick Explicit when you request a book, or later on My Requests, and RMAB marks the book explicit in Audiobookshelf when it arrives (or at once if it is already there), which hides it from accounts that can't see explicit content.
- the requester or an admin can mark a request; only an admin can remove the mark, and removing it doesn't un-flag the book in Audiobookshelf. The Audiobookshelf API key's user needs "Can access explicit content", or nothing is marked and the log says why.
- ✅ tag the requester on the Audiobookshelf item when a request is delivered
- #199
- #229
- #567
- #232
- Thanks https://github.com/NichCodes !
- a new setting, off by default: "Tag items with the requester's username" in Settings > Audiobookshelf. Each delivered book's item gets
req:<username>, so Audiobookshelf can limit each user to their own books with its tag permissions. Other tags on the item are kept. - turning it on tags the books that are already available, once, and a later scan puts back a requester tag an item lost. Requests completed without approval are never tagged.
- ✅ admins can add a local user from the Users page
- #77
- #568
- Add User takes a username and a starting password and creates an approved account with the User role, whatever the self-registration and approval settings are. The button shows while local login is enabled (Audiobookshelf mode), and the new user can change the password from the account menu.
- ✅ admins can delete Plex and OIDC users
- ✅ choose System, Light or Dark from the user menu
- ✅ a delivered request shows the book Audiobookshelf matched it to
- #325
- #562
- after the next library scan, an available request's card shows the title, author and cover of the Audiobookshelf item it is linked to, and follows a later rematch. The requested book is kept, so folder names and the ebook search are unchanged.
- this is one part of #325; the request details window still shows the requested edition
Fixes:
- ✅ a shared torrent is kept until every request that owns it is done seeding
- #545
- #569
- request delete, the seeding cleanup and cancel now follow one rule: an active request keeps the torrent until it is finished and done seeding, and a deleted or cancelled request keeps a finished torrent until its own indexer's seed rule is met
- the first cleanup after the update may remove torrents that were kept only by cancelled requests whose seed rule is already met. Usenet is unchanged.
- ✅ a failed download tries the next release before the request fails
- #332
- #570
- when a download client reports that an automatic grab failed, RMAB adds that release to the blocklist and searches again, for up to 3 releases in a row. Hand-picked and ebook grabs fail as before.
- a failure of the client's storage or setup (full disk, permissions, a missing mount) no longer puts the release on the blocklist. The request and its notifications show the client's name and a short reason; the client's own text stays in the job log.
- ✅ a queued search skips a request that has already started downloading
- ✅ approving an unreleased book waits for its release date instead of searching
- ✅ replacing a book from a reported issue keeps its requester
- ✅ an ebook import scans its own Audiobookshelf library when one is set
- #561
- #550
- Thanks https://github.com/RatonDeRepoteca !
- a new optional Ebook Library setting under Settings > Audiobookshelf picks the library to scan after an ebook import. Left on "Same as audiobook library", the audiobook library is scanned as before.
- ✅ a failed download-link fetch names the server that answered
- ✅ a failed chapter merge reports ffmpeg's reason, not its whole progress history
- ✅ the app shuts down cleanly when the container stops
- ✅ the Library Scan is scheduled as soon as setup completes
- ✅ SABnzbd: the category is no longer re-sent on every download
- ✅ the admin login form shows the message on a wrong password
- ✅ the setup wizard's download client cards no longer overlap
Security:
-
✅ sign-in and sign-up limit repeated attempts
- #575
- password sign-in allows 10 attempts per 15 minutes per account and 20 per client address, and sign-up allows 5 per hour per address. A refused attempt gets a 429 with
Retry-After, and a container restart clears the counters. - a browser that has signed in to an account with the password since the update can still sign in while that account is at its limit (see the notes at the top)
-
✅ request detail responses return a short job summary to every role, and stored download links have the indexer key removed
- #592
- applies to the request detail, the admin request list and the retry answer; the recent-requests list returns no download fields (see the notes at the top)
-
✅ a downloaded .torrent file is checked for a well-formed structure before it is read
- #594
- for qBittorrent, Transmission and Deluge; a malformed file fails that download with a clear error
Upgrade:
docker pull ghcr.io/kikootwo/readmeabook:latest docker compose down docker compose up -d
What's Changed
- chore(deps): bump docker/login-action from 4.7.0 to 4.8.0 in the github-actions-minor-patch group by @dependabot[bot] in #559
- feat: a delivered request shows the book Audiobookshelf matched it to by @kikootwo in #562
- feat: admins can delete Plex and OIDC users by @kikootwo in #503
- fix: an ebook import scans its own Audiobookshelf library when one is set by @kikootwo in #561
- fix: a failed download-link fetch names the server that answered by @kikootwo in #563
- fix: approving an unreleased book waits for its release date instead of searching by @kikootwo in #564
- feat: admins can add a local user from the Users page by @kikootwo in #568
- fix: the app shuts down cleanly when the container stops by @kikootwo in #566
- feat: tag the requester on the Audiobookshelf item when a request is delivered by @kikootwo in #567
- fix: a shared torrent is kept until every request that owns it is done seeding by @kikootwo in #569
- chore: the #545 e2e spec type-checks by @kikootwo in #573
- feat: library API for the upcoming Library page by @kikootwo in #572
- feat: choose System, Light or Dark from the user menu by @kikootwo in #565
- fix: a failed download tries the next release before the request fails by @kikootwo in #570
- fix: replacing a book from a reported issue keeps its requester by @kikootwo in #574
- fix: sign-in and sign-up limit repeated attempts by @kikootwo in #575
- fix: the admin login form shows the message on a wrong password by @kikootwo in #577
- feat: a Library page for everything in your library and everything requested by @kikootwo in #578
- fix: the Library Scan is scheduled as soon as setup completes by @kikootwo in #584
- fix: the setup wizard's download client cards no longer overlap by @kikootwo in #586
- feat: choose the download client category by @kikootwo in #587
- feat: change a book's match on the Bulk Import review screen by @kikootwo in #590
- feat: a processing request shows what it is doing, with a progress bar while chapters merge by @kikootwo in #585
- fix: request detail returns the job summary to every role by @kikootwo in #592
- feat: select several requests in the admin table and approve, deny, cancel or delete them together by @kikootwo in #589
- feat: mark a request Explicit so Audiobookshelf marks the book explicit by @kikootwo in #582
- fix: a failed chapter merge reports ffmpeg's reason, not its whole progress history by @kikootwo in #593
- fix: check a downloaded .torrent file's structure before parsing it by @kikootwo in #594
- fix: a queued search skips a request that has already started downloading by @kikootwo in #595
- feat: an admin adds a magnet link or a .torrent file to a request by @kikootwo in #596
- feat: hard links and metadata.opf for Audiobookshelf imports by @kikootwo in #597
- chore: release v1.3.0 by @kikootwo in #598
Full Changelog: v1.2.13...v1.3.0