Commit Graph
231 Commits
Author SHA1 Message Date
Dark-Alex-17 a5b95c165a fix(readarr): send an empty images list when adding an author 2026-09-29 23:36:11 -06:00
Dark-Alex-17 9128e68d0a test(readarr): cover the CLI handler dispatch to each subcommand handler 2026-09-29 16:52:53 -06:00
Dark-Alex-17 4f78a5940f test(lidarr): give the track and history fixtures distinct ids
The shared track held id, artist id, track file id, and album id all
equal to 1, and the shared history item held id, album id, artist id,
and track id all equal to 1, so reading the wrong one of those fields
could not fail any test that uses them. Move the track to id 5, artist
id 3, and track file id 7 (with the shared track file moved to id 7 so
the album view still finds its quality and audio info), and move the
history item to id 13, artist id 3, and track id 5. Both album ids stay
at 1 so the fully populated album view still shows its track as
downloading. Update the seven assertions that named the old ids.
2026-09-17 18:16:17 -06:00
Dark-Alex-17 3e414f9f0c test: give the CLI indexer settings tests distinct field values
The Radarr, Sonarr and Lidarr tests for editing all indexer settings expected every numeric field to be 1 and returned every previous field as 2. Because the fields were mutually equal, transposing any two of availability_delay, maximum_size, minimum_age, retention and rss_sync_interval in the CLI parameter builder produced an identical request and no test could tell. Radarr additionally expected both boolean flags to hold the same value, hiding a transposition of those two.

Readarr already used distinct values and was the model followed here.

Verified by transposing minimum_age and retention in all four CLI parameter builders at once: before this change only the two Readarr tests failed, while Radarr, Sonarr and Lidarr stayed green. After it, the same mutation is caught by five tests across the three trees.
2026-09-09 16:43:25 -06:00
Dark-Alex-17 dbd84d929d feat(readarr): edit the shared indexer settings and expose the command on the CLI 2026-09-02 15:37:25 -06:00
Dark-Alex-17 0867ae918e feat(readarr): fetch the shared indexer settings and expose them on the CLI
The fetched settings are only written into app state when nothing is
already held there, so a refresh landing while the user has the settings
prompt open cannot overwrite edits in progress.

The fixtures give every field a distinct value. Settings whose fields
all share one value cannot detect two of them being mapped to each
other's keys.
2026-09-02 13:52:26 -06:00
Dark-Alex-17 cd5ef8e093 feat(readarr): test all indexers and expose the command on the CLI
Results come back keyed only by indexer id, so each one is joined
against the cached indexer list to recover a display name, and its
validation failures are flattened into a single line for the results
table.

The endpoint reports failures with a non-2xx status, so the request
ignores the status code and parses the body either way. When the
request itself fails the results table is replaced with an empty one
rather than being left showing the previous run.
2026-09-02 13:46:36 -06:00
Dark-Alex-17 f4fd8516a6 feat(readarr): test an indexer and expose the command on the CLI
Fetch the indexer's full details, then post them back verbatim to the
test endpoint. The payload round-trips through serde_json::Value so the
fields Indexer does not model, such as infoLink and the per-field label
and type metadata, survive the round trip intact.

A successful test returns an empty JSON object and clears
indexer_test_errors; a failure returns an array whose first entry
carries the error message. The test endpoint reports failures with a
non-2xx status, so the request ignores the status code and parses the
body either way.
2026-09-02 13:39:29 -06:00
Dark-Alex-17 aea7fd2607 feat(readarr): delete an indexer and expose the command on the CLI 2026-09-01 17:16:23 -06:00
Dark-Alex-17 daf991d1eb feat(readarr): edit an indexer and expose the command on the CLI 2026-09-01 17:11:32 -06:00
Dark-Alex-17 be5826f2c4 feat(readarr): fetch all indexers and expose them on the CLI 2026-09-01 16:59:57 -06:00
Dark-Alex-17 c94b2a40d0 feat(readarr): clear the blocklist and expose the command on the CLI 2026-09-01 16:44:07 -06:00
Dark-Alex-17 fb91c2edd6 feat(readarr): delete an item from the blocklist and expose the command on the CLI 2026-09-01 16:38:09 -06:00
Dark-Alex-17 5c593b3770 feat(readarr): fetch the blocklist and expose it on the CLI 2026-09-01 16:32:13 -06:00
Dark-Alex-17 5a730f2f05 feat(readarr): manually download a release and expose the command on the CLI 2026-08-28 14:22:57 -06:00
Dark-Alex-17 999a22a37f feat(readarr): fetch releases for an author and expose them on the CLI 2026-08-28 14:15:28 -06:00
Dark-Alex-17 666084a30f feat(readarr): fetch releases for a book and expose them on the CLI 2026-08-28 14:07:15 -06:00
Dark-Alex-17 1edceba056 feat(readarr): mark a history item as failed and expose the command on the CLI 2026-08-28 13:46:39 -06:00
Dark-Alex-17 40be5714e9 feat(readarr): fetch Readarr history and expose it on the CLI 2026-08-28 13:40:40 -06:00
Dark-Alex-17 f5bcb7d83a feat(readarr): refresh Readarr downloads and expose the command on the CLI 2026-08-28 13:23:26 -06:00
Dark-Alex-17 5c9fead725 feat(readarr): delete a download and expose the command on the CLI 2026-08-28 13:18:53 -06:00
Dark-Alex-17 6139b48d90 feat(readarr): fetch Readarr downloads and expose them on the CLI 2026-08-28 13:14:07 -06:00
Dark-Alex-17 3569bcc036 feat(readarr): delete a book file and expose the command on the CLI 2026-08-28 12:58:41 -06:00
Dark-Alex-17 fbfd64eb2a feat(readarr): delete a book and expose the command on the CLI
The delete flags travel as query parameters rather than a request body,
and Readarr spells the exclusion key addImportListExclusion, not the
addImportExclusion that Radarr uses.
2026-08-27 16:19:49 -06:00
Dark-Alex-17 e30d4dbd0c feat(readarr): toggle book monitoring and expose the command on the CLI
The PUT body round-trips through serde_json::Value rather than the typed
Book, so the fields Readarr returns but Book does not declare survive the
toggle instead of being silently dropped. BOOK_JSON now carries a few of
those undeclared fields so a regression to a typed round-trip fails the
tests rather than passing unnoticed.
2026-08-27 16:12:50 -06:00
Dark-Alex-17 f2787560d6 feat(readarr): trigger an automatic book search and expose the command on the CLI 2026-08-27 15:52:44 -06:00
Dark-Alex-17 b48ce5db2e feat(readarr): fetch Readarr book history and expose it on the CLI 2026-08-27 15:40:08 -06:00
Dark-Alex-17 634d1fc1b1 feat(readarr): fetch Readarr book files and expose them on the CLI 2026-08-27 15:22:50 -06:00
Dark-Alex-17 4c6a9ece4e feat(readarr): fetch Readarr book editions and expose them on the CLI 2026-08-27 14:58:47 -06:00
Dark-Alex-17 817ebeaf90 feat(readarr): fetch Readarr book details and expose them on the CLI 2026-08-27 14:51:40 -06:00
Dark-Alex-17 41830cc072 feat(readarr): fetch Readarr books and expose them on the CLI 2026-08-27 14:38:51 -06:00
Dark-Alex-17 8752a85db5 feat(readarr): fetch Readarr author history and expose it on the CLI
Add the GetAuthorHistory event, backed by GET /history/author?authorId=N,
which returns a flat array of history records for a single author. The
fetcher mirrors the artist-history equivalent, sorting by id and carrying
the sort-prompt route guard so a refresh landing while the sort prompt is
open cannot clobber an in-progress sort selection.

Expose it as `readarr list author-history --author-id N`.
2026-08-27 11:11:24 -06:00
Dark-Alex-17 9572b68f97 feat(readarr): refresh all Readarr authors and expose the command on the CLI
Posts the RefreshAuthor command to the command endpoint with no author ID, which is how Readarr distinguishes a library wide refresh from a single author refresh. The response is returned verbatim and no app state is mutated.
2026-08-27 10:50:53 -06:00
Dark-Alex-17 c82006862e feat(readarr): refresh and rescan a Readarr author and expose the command on the CLI
Posts the RefreshAuthor command to the command endpoint with the author ID, queueing a metadata refresh and a disk scan for that author. The response is returned verbatim and no app state is mutated.

Adds the refresh subcommand group to the Readarr CLI.
2026-08-27 10:43:37 -06:00
Dark-Alex-17 e9b9aa3a14 feat(readarr): trigger automatic author searches and expose the command on the CLI
Posts the AuthorSearch command to the command endpoint with the author ID, queueing an indexer search for that author. The response is returned verbatim and no app state is mutated.

Introduces ReadarrCommandBody, the request body shared by the author and book command calls. Both ID fields are omitted from the payload when absent rather than sent as null.
2026-08-27 10:35:04 -06:00
Dark-Alex-17 f896b65fd9 feat(readarr): toggle Readarr author monitoring and expose the command on the CLI 2026-08-27 10:09:04 -06:00
Dark-Alex-17 ac8a11233f feat(readarr): delete Readarr authors and expose the command on the CLI 2026-08-27 09:54:38 -06:00
Dark-Alex-17 fcfc29894e feat(readarr): edit Readarr authors and expose the command on the CLI 2026-08-27 09:43:07 -06:00
Dark-Alex-17 e514e9b6cc feat(readarr): add authors to Readarr and expose the command on the CLI 2026-08-26 17:17:41 -06:00
Dark-Alex-17 9238c1b9d2 feat(readarr): search for new Readarr authors and expose the command on the CLI 2026-08-26 16:57:26 -06:00
Dark-Alex-17 5042dbdb3a feat(readarr): fetch Readarr author details and expose them on the CLI 2026-08-26 14:35:46 -06:00
Dark-Alex-17 84eba9beac feat(readarr): fetch Readarr authors and expose them on the CLI
Add ReadarrEvent::ListAuthors, mapping to GET /author, and wire it up as
`managarr readarr list authors`.

This is the first Readarr event that touches the library rather than
configuration, so it creates the library/authors module tree mirroring
Lidarr's library/artists layout.

list_authors mirrors Lidarr's list_artists, including the sort-prompt
route guard: a response landing while the user has the sort prompt open
must not clobber their in-progress sort selection. Both directions of
that guard are covered by tests.
2026-08-26 11:41:42 -06:00
Dark-Alex-17 e1be1df68a feat(readarr): delete Readarr root folders and expose the command on the CLI 2026-08-26 10:38:58 -06:00
Dark-Alex-17 3475660eb2 feat(readarr): add Readarr root folders and expose the command on the CLI 2026-08-26 10:31:40 -06:00
Dark-Alex-17 e8e3376327 feat(readarr): delete Readarr tags and expose the command on the CLI 2026-08-26 10:21:55 -06:00
Dark-Alex-17 b9fa3b36c0 feat(readarr): add Readarr tags and expose the command on the CLI 2026-08-20 22:47:41 -06:00
Dark-Alex-17 29186ea03c feat(readarr): fetch Readarr root folders and expose them on the CLI
Adds the GetRootFolders event backed by GET /rootfolder, storing the result
on the Readarr root folders table, and surfaces it as
"managarr readarr list root-folders".

Root folders reuse the shared RootFolder model. Readarr omits the
unmappedFolders key that the other servarrs return, and the field is
optional, so it deserializes to None without changing the shared type.

Only the read path is included here. Adding and deleting root folders
mutate the library layout, so they are left for separate work.
2026-08-20 22:32:16 -06:00
Dark-Alex-17 1d8ccd7ff6 feat(readarr): fetch Readarr tags and expose them on the CLI 2026-08-20 22:06:23 -06:00
Dark-Alex-17 de41d6fef7 feat(readarr): fetch Readarr metadata profiles and expose them on the CLI 2026-08-20 22:04:38 -06:00
Dark-Alex-17 4a7cf922e8 feat(readarr): fetch Readarr quality profiles and expose them on the CLI 2026-08-20 22:02:34 -06:00