Skip to content

v1.3.0

Latest

Choose a tag to compare

@kikootwo kikootwo released this 11 Nov 02:50
b2bce11

🎉 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 /data volume holding both /data/downloads and /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.opf left alone in the book folder, as it already did for cover.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, progress is 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
    • #244
    • #503
    • their requests are kept, and if they sign in again they get a new account, which waits for approval where approval is on for that sign-in method. To keep someone out, remove their access at Plex or your identity provider too.
  • ✅ choose System, Light or Dark from the user menu
    • #557
    • #565
    • saved per browser. System is the default and follows the device setting, as before.
  • ✅ 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
    • #591
    • #595
    • a scheduled or RSS search no longer starts a second download or undoes your Interactive Search pick, and no longer downloads a book whose request is waiting for approval or was denied
  • ✅ approving an unreleased book waits for its release date instead of searching
    • #556
    • #564
    • with "Skip unreleased books in automatic searches" on, the approved request goes to Awaiting release and is searched on its release date, as a new request already is. The toast says so.
  • ✅ replacing a book from a reported issue keeps its requester
    • #571
    • #574
    • the replacement request belongs to the user whose request it replaces, so the book stays in their requests list and the notifications name them. The admin stays the requester when the book had no request or that user is deleted.
  • ✅ 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
    • #298
    • #563
    • the request message names Prowlarr when your configured Prowlarr address (or a reverse proxy in front of it) answered, with a reverse-proxy login hint on 401 or 403, and names the indexer "after a redirect" otherwise. The answering host is in the job log.
  • ✅ a failed chapter merge reports ffmpeg's reason, not its whole progress history
    • #580
    • #593
    • the message is ffmpeg's last few meaningful lines, at most 5 lines and 1,000 characters, in the logs, the request error and the failure notification
  • ✅ the app shuts down cleanly when the container stops
    • #540
    • #566
    • on a stop, restart or update the app stops taking new work, gives running jobs a few seconds and exits within about 5 seconds, inside Docker's default 10. A job still running then starts again from the beginning after the restart.
  • ✅ the Library Scan is scheduled as soon as setup completes
    • #583
    • #584
    • the Library Scan and Audible Data Refresh run on their schedules right after setup, instead of only after the first restart
  • ✅ SABnzbd: the category is no longer re-sent on every download
    • #579
    • #587
    • RMAB misread SABnzbd's category list and sent its category settings again with each download
  • ✅ the admin login form shows the message on a wrong password
    • #576
    • #577
    • instead of the text "AuthenticationError"
  • ✅ the setup wizard's download client cards no longer overlap
    • #581
    • #586
    • at desktop widths; the step now names Deluge among the supported clients

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