Skip to content

fix: use Radarr bulk exclusions endpoint to avoid duplicate 400 failure#3012

Merged
enoch85 merged 2 commits into
developmentfrom
fix/radarr-duplicate-import-exclusion
Jun 2, 2026
Merged

fix: use Radarr bulk exclusions endpoint to avoid duplicate 400 failure#3012
enoch85 merged 2 commits into
developmentfrom
fix/radarr-duplicate-import-exclusion

Conversation

@enoch85

@enoch85 enoch85 commented Jun 2, 2026

Copy link
Copy Markdown
Collaborator

When a collection rule unmonitors a movie with Add import list exclusions enabled, Maintainerr added the exclusion via Radarr's singular POST /api/v3/exclusions. That endpoint runs a validator (ImportListExclusionExistsValidator) that rejects an already-excluded tmdbId with 400 Bad Request ("This exclusion has already been added").

The 400 was swallowed to undefined, so updateMovie returned false, the whole collection run was marked failed, and users got a generic "Oops! Something went wrong" notification on every re-run — even though nothing was actually wrong.

  • Switch to POST /api/v3/exclusions/bulk. That endpoint skips the uniqueness validator and de-dupes server-side (ImportListExclusionService.Add(List<>)DeDupeExclusions), so re-adding an existing exclusion is a no-op instead of a 400.
  • This matches the idempotent server-side de-dupe already relied on by Radarr's movie-delete path (MoviesDeletedEvent) and Sonarr's exclusion handling (SeriesDeletedEvent) — Maintainerr's Sonarr helper only adds exclusions via the delete path, which is why it was never affected.

@enoch85 enoch85 force-pushed the fix/radarr-duplicate-import-exclusion branch 2 times, most recently from a3b3210 to 2f99348 Compare June 2, 2026 16:49
@enoch85 enoch85 changed the title fix: skip duplicate Radarr import list exclusion to avoid 400 failure fix: use Radarr bulk exclusions endpoint to avoid duplicate 400 failure Jun 2, 2026
@enoch85 enoch85 force-pushed the fix/radarr-duplicate-import-exclusion branch from 2f99348 to 473dab7 Compare June 2, 2026 17:29
Comment thread apps/server/src/modules/api/servarr-api/helpers/radarr.helper.ts Fixed
@enoch85 enoch85 force-pushed the fix/radarr-duplicate-import-exclusion branch from 473dab7 to 00d28a1 Compare June 2, 2026 17:39
@enoch85 enoch85 force-pushed the fix/radarr-duplicate-import-exclusion branch from 00d28a1 to 75df764 Compare June 2, 2026 17:43
@enoch85 enoch85 merged commit 0155500 into development Jun 2, 2026
14 checks passed
@enoch85 enoch85 deleted the fix/radarr-duplicate-import-exclusion branch June 2, 2026 18:13
maintainerr-automation Bot added a commit that referenced this pull request Jun 2, 2026
* docs(changelog): add v3.13.0 breaking-changes notice

Mirrors the PLEASE NOTE block published on the v3.13.0 GitHub release
(global vs scoped exclusions, per-group exclusion scoping, section
operator default).

* build(deps-dev): bump turbo from 2.9.15 to 2.9.16 (#3005)

Bumps [turbo](https://github.com/vercel/turborepo) from 2.9.15 to 2.9.16.
- [Release notes](https://github.com/vercel/turborepo/releases)
- [Changelog](https://github.com/vercel/turborepo/blob/main/RELEASE.md)
- [Commits](vercel/turborepo@v2.9.15...v2.9.16)

---
updated-dependencies:
- dependency-name: turbo
  dependency-version: 2.9.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(rules): clarify libItem.id is the media server ID in resolve-failure warning

Both the Radarr and Sonarr getters logged "Failed to resolve external IDs
for 'X' with id 'Y'" where Y is libItem.id — the media server's internal
item id (Plex ratingKey, Jellyfin item id), not a TMDB/external id.
Multiple readers have misread it as a wrong stored TMDB id (issue #2990).
Reword to "(media server ID 'Y')" so the field is self-explanatory.

No behaviour change.

* build(deps): bump nodemailer from 8.0.9 to 8.0.10 (#3006)

Bumps [nodemailer](https://github.com/nodemailer/nodemailer) from 8.0.9 to 8.0.10.
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](nodemailer/nodemailer@v8.0.9...v8.0.10)

---
updated-dependencies:
- dependency-name: nodemailer
  dependency-version: 8.0.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump react-router-dom from 7.15.1 to 7.16.0 (#3007)

Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 7.15.1 to 7.16.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@7.16.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-version: 7.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(dev): add fake Radarr mock and wire seed for arr-action testing (#3014)

* fix: make collection handling failure notifications name the failing collection (#3013)

* fix: use Radarr bulk exclusions endpoint to avoid duplicate 400 failure (#3012)

* fix(collections): don't force-delete Seerr requests for episode rules (#3015)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: maintainerr-automation[bot] <261505141+maintainerr-automation[bot]@users.noreply.github.com>
Co-authored-by: enoch85 <mailto@danielhansson.nu>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
@maintainerr-automation

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.14.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

doonga pushed a commit to greyrock-labs/home-ops that referenced this pull request Jun 6, 2026
… ➔ 3.14.0) (#207)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/maintainerr/maintainerr](https://github.com/Maintainerr/Maintainerr) | minor | `3.13.0` → `3.14.0` |

---

### Release Notes

<details>
<summary>Maintainerr/Maintainerr (ghcr.io/maintainerr/maintainerr)</summary>

### [`v3.14.0`](https://github.com/Maintainerr/Maintainerr/blob/HEAD/CHANGELOG.md#3140-2026-06-05)

[Compare Source](Maintainerr/Maintainerr@v3.13.0...v3.14.0)

#### Highlights

- Added `/api/health` endpoints with liveness and readiness checks for monitoring and integration with tools like Kubernetes and Docker Compose ([#&#8203;3029](Maintainerr/Maintainerr#3029)).
- Collection handler now skips media currently being streamed to avoid disrupting active viewers ([#&#8203;3027](Maintainerr/Maintainerr#3027)).
- Fixed issue where saving log settings would overwrite an active `LOG_LEVEL` environment variable override ([#&#8203;3053](Maintainerr/Maintainerr#3053)).

#### Features

- Added `/api/health` endpoints with liveness and readiness checks ([#&#8203;3029](Maintainerr/Maintainerr#3029)).
- Collection handler now skips media currently being streamed ([#&#8203;3027](Maintainerr/Maintainerr#3027)).
- Logging system now honors the `LOG_LEVEL` environment variable on startup ([#&#8203;3030](Maintainerr/Maintainerr#3030)).

#### Fixes

- Fixed issue where saving log settings would overwrite an active `LOG_LEVEL` environment variable override ([#&#8203;3053](Maintainerr/Maintainerr#3053)).
- Validated webhook URL schemes to prevent invalid or potentially harmful requests ([#&#8203;3031](Maintainerr/Maintainerr#3031)).
- Fixed issue where rule groups lost collection links and visibility on partial updates ([#&#8203;3045](Maintainerr/Maintainerr#3045), [#&#8203;3046](Maintainerr/Maintainerr#3046)).
- Fixed issue with manual collections not being found across libraries on Jellyfin/Emby ([#&#8203;3026](Maintainerr/Maintainerr#3026), [#&#8203;3042](Maintainerr/Maintainerr#3042)).
- Resolved issue where deleted media remained stuck in Jellyfin/Emby collections and caused repeated processing errors ([#&#8203;3023](Maintainerr/Maintainerr#3023), [#&#8203;3024](Maintainerr/Maintainerr#3024), [#&#8203;3040](Maintainerr/Maintainerr#3040)).
- Fixed issue where Seerr requests for episode rules incorrectly deleted entire season requests ([#&#8203;3015](Maintainerr/Maintainerr#3015)).
- Improved error notifications for collection handling failures to include the name of the failing collection ([#&#8203;3013](Maintainerr/Maintainerr#3013)).
- Used Radarr bulk exclusions endpoint to avoid duplicate 400 errors when adding exclusions ([#&#8203;3012](Maintainerr/Maintainerr#3012)).

#### Performance

- Pruned media that no longer exists on the media server to improve collection handling efficiency ([#&#8203;3023](Maintainerr/Maintainerr#3023), [#&#8203;3040](Maintainerr/Maintainerr#3040)).

#### Internal

- Refreshed README with updated features, deployment examples, and credits ([#&#8203;3048](Maintainerr/Maintainerr#3048)).
- Clarified that a missing `yarn` command indicates a stale `node_modules` directory.

#### Dependencies

- Updated 20 dependencies, including `@typescript-eslint/parser`, `react-router-dom`, `axios`, and `vite`.

#### New Contributors

- [@&#8203;Arvuno](https://github.com/Arvuno) made their first contribution in [#&#8203;3029](Maintainerr/Maintainerr#3029)

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMDYuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIwNi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://git.greyrock.io/greyrock-labs/home-ops/pulls/207
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants