From 3b3e791a2be0491e978675301bb6d0be11a0c254 Mon Sep 17 00:00:00 2001 From: Yozora Date: Mon, 22 Jun 2026 16:42:47 +0100 Subject: [PATCH 1/2] Add support for paginated `ImportListExclusion` --- arrapi/raws/radarr.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/arrapi/raws/radarr.py b/arrapi/raws/radarr.py index d09fd3c..124714c 100644 --- a/arrapi/raws/radarr.py +++ b/arrapi/raws/radarr.py @@ -58,8 +58,24 @@ def get_movie_lookup(self, term): return self._get("movie/lookup", **{"term": term}) def get_exclusions(self): - """ GET /exclusions """ - return self._get("exclusions") + """ GET /exclusions/paged """ + if not self.new_codebase: + return self._get("exclusions") + + page = 1 + page_size = 250 + records = [] + while True: + response = self._get("exclusions/paged", page=page, pageSize=page_size) + page_records = response.get("records", []) + records.extend(page_records) + total_records = response.get("totalRecords") + if total_records is not None: + if len(records) >= total_records: + return records + elif len(page_records) < page_size: + return records + page += 1 def post_exclusions(self, json): """ POST /exclusions """ From 2876c63c836a87ab1ce7530f2573a6e32a1e2965 Mon Sep 17 00:00:00 2001 From: Yozora Date: Tue, 23 Jun 2026 13:52:27 +0100 Subject: [PATCH 2/2] Address soh comments --- arrapi/apis/radarr.py | 2 +- arrapi/objs/simple.py | 20 ++++++++++++++++++++ arrapi/raws/radarr.py | 27 ++++++++++----------------- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/arrapi/apis/radarr.py b/arrapi/apis/radarr.py index 81e73b3..c04b264 100644 --- a/arrapi/apis/radarr.py +++ b/arrapi/apis/radarr.py @@ -98,7 +98,7 @@ def _validate_ids(self, ids): def respect_list_exclusions_when_adding(self): """ Stores all List Exclusions so whenever :func:`~arrapi.objs.reload.Movie.add` or :func:`~arrapi.apis.sonarr.RadarrAPI.add_multiple_movies` is called the additions will be checked against the Exclusion List """ - self.exclusions = [RadarrExclusion(self, ex).tmdbId for ex in self._raw.get_exclusions()] + self.exclusions = [ex.tmdbId for ex in RadarrExclusion.all(self)] def get_movie(self, movie_id: Optional[int] = None, tmdb_id: Optional[int] = None, imdb_id: Optional[str] = None) -> Movie: """ Gets a :class:`~arrapi.objs.reload.Movie` by one of the IDs. diff --git a/arrapi/objs/simple.py b/arrapi/objs/simple.py index 721c456..a6eaa33 100644 --- a/arrapi/objs/simple.py +++ b/arrapi/objs/simple.py @@ -169,6 +169,26 @@ class RadarrExclusion(SimpleObj): year (int): Year of the Excluded Movie. """ + @classmethod + def all(cls, arr): + if not arr._raw.new_codebase: + return [cls(arr, data) for data in arr._raw.get_exclusions()] + + page = 1 + page_size = 250 + exclusions = [] + while True: + response = arr._raw.get_exclusions_paged(page=page, pageSize=page_size) + records = response.get("records", []) + exclusions.extend(cls(arr, data) for data in records) + total_records = response.get("totalRecords") + if total_records is not None: + if len(exclusions) >= total_records: + return exclusions + elif len(records) < page_size: + return exclusions + page += 1 + def _load(self, data): super()._load(data) self.tmdbId = self._parse(attrs="tmdbId", value_type="int") diff --git a/arrapi/raws/radarr.py b/arrapi/raws/radarr.py index 124714c..8aa50f5 100644 --- a/arrapi/raws/radarr.py +++ b/arrapi/raws/radarr.py @@ -58,24 +58,17 @@ def get_movie_lookup(self, term): return self._get("movie/lookup", **{"term": term}) def get_exclusions(self): + """ GET /exclusions """ + return self._get("exclusions") + + def get_exclusions_paged(self, page=1, pageSize=10, sortKey=None, sortDirection=None): """ GET /exclusions/paged """ - if not self.new_codebase: - return self._get("exclusions") - - page = 1 - page_size = 250 - records = [] - while True: - response = self._get("exclusions/paged", page=page, pageSize=page_size) - page_records = response.get("records", []) - records.extend(page_records) - total_records = response.get("totalRecords") - if total_records is not None: - if len(records) >= total_records: - return records - elif len(page_records) < page_size: - return records - page += 1 + params = {"page": page, "pageSize": pageSize} + if sortKey is not None: + params["sortKey"] = sortKey + if sortDirection is not None: + params["sortDirection"] = sortDirection + return self._get("exclusions/paged", **params) def post_exclusions(self, json): """ POST /exclusions """