diff --git a/src/job_manager.py b/src/job_manager.py index bd058a6..6f091f8 100644 --- a/src/job_manager.py +++ b/src/job_manager.py @@ -68,6 +68,7 @@ class JobManager: ) return True else: + self.arr.tracker.reset_trackers() logger.verbose(">>> Queue is empty.") return False diff --git a/src/jobs/removal_handler.py b/src/jobs/removal_handler.py index 079b67c..9244e01 100644 --- a/src/jobs/removal_handler.py +++ b/src/jobs/removal_handler.py @@ -46,7 +46,7 @@ class RemovalHandler: async def _tag_as_obsolete(self, queue_item, download_id): logger.info(f">>> Job'{self.job_name}' triggered obsolete-tagging: {queue_item['title']}") for qbit in self.settings.download_clients.qbittorrent: - await qbit.set_tag(tags=[self.settings.general.obsolete_tag], hashes=[download_id]) + await qbit.set_tag(tags=[self.settings.general.obsolete_tag], hashes=[download_id]) async def _get_handling_method(self, download_id, queue_item): @@ -62,5 +62,5 @@ class RemovalHandler: if download_id in self.arr.tracker.private: return self.settings.general.private_tracker_handling - + return self.settings.general.public_tracker_handling diff --git a/src/jobs/removal_job.py b/src/jobs/removal_job.py index 531cad9..8e0a98f 100644 --- a/src/jobs/removal_job.py +++ b/src/jobs/removal_job.py @@ -21,32 +21,24 @@ class RemovalJob(ABC): self.settings = settings self.job_name = job_name self.job = getattr(self.settings.jobs, self.job_name) - self.max_strikes = getattr(self.job, "max_strikes", 0) self.queue_manager = QueueManager(self.arr, self.settings) - self.strikes_handler = StrikesHandler(job_name=self.job_name, arr=self.arr, max_strikes=self.max_strikes) - async def run(self): if not self.job.enabled: return 0 logger.debug(f"removal_job.py/run: Launching job '{self.job_name}', and checking if any items in {self.queue_scope} queue.") self.queue = await self.queue_manager.get_queue_items(queue_scope=self.queue_scope) - + # Handle empty queue if not self.queue: - if self.max_strikes: - self.strikes_handler.all_recovered() return 0 - + self.affected_items = await self._find_affected_items() self.affected_downloads = self.queue_manager.group_by_download_id(self.affected_items) # -- Checks -- self._ignore_protected() - - self.max_strikes = getattr(self.job, "max_strikes", None) - if self.max_strikes: - self.affected_downloads = self.strikes_handler.check_permitted_strikes(self.affected_downloads) + self._check_strikes_handler() # -- Removal -- await RemovalHandler( @@ -57,6 +49,12 @@ class RemovalJob(ABC): return len(self.affected_downloads) + def _check_strikes_handler(self): + max_strikes = getattr(self.job, "max_strikes", None) + if max_strikes: + strikes_handler = StrikesHandler(job_name=self.job_name, arr=self.arr, max_strikes=max_strikes) + self.affected_downloads = strikes_handler.check_permitted_strikes(self.affected_downloads) + def _ignore_protected(self): """ Filters out downloads that are in the protected tracker. @@ -70,4 +68,4 @@ class RemovalJob(ABC): @abstractmethod # Imlemented on level of each removal job async def _find_affected_items(self): - pass \ No newline at end of file + pass diff --git a/src/jobs/strikes_handler.py b/src/jobs/strikes_handler.py index 211aaa4..a8b5f9a 100644 --- a/src/jobs/strikes_handler.py +++ b/src/jobs/strikes_handler.py @@ -14,14 +14,6 @@ class StrikesHandler: return self._apply_strikes_and_filter(affected_downloads) - def all_recovered(self): - if self.tracker.defective.get(self.job_name): - self.tracker.defective[self.job_name] = {} - logger.info( - ">>> No downloads any longer marked as %s (None in queue)", - self.job_name, - ) - def _recover_downloads(self, affected_downloads): recovered = [ d_id for d_id in self.tracker.defective[self.job_name] @@ -74,4 +66,4 @@ class StrikesHandler: logger.info( '>>> [Tip!] Since this download should already have been removed in a previous iteration but keeps coming back, this indicates the blocking of the torrent does not work correctly. Consider turning on the option "Reject Blocklisted Torrent Hashes While Grabbing" on the indexer in the *arr app: %s', title, - ) \ No newline at end of file + ) diff --git a/src/settings/_instances.py b/src/settings/_instances.py index d5a3066..7b0d73a 100644 --- a/src/settings/_instances.py +++ b/src/settings/_instances.py @@ -22,6 +22,17 @@ class Tracker: self.deleted = [] self.extension_checked = [] + def reset(self) -> None: + for attr in ( + self.protected, + self.private, + self.defective, + self.download_progress, + self.deleted, + self.extension_checked, + ): + attr.clear() + async def refresh_private_and_protected(self, settings): protected_downloads = [] private_downloads = [] @@ -65,7 +76,7 @@ class Instances: "detail_item_id_key", "detail_item_ids_key", "detail_item_search_command", - } + } outputs = [] for arr_type in ["sonarr", "radarr", "readarr", "lidarr", "whisparr"]: @@ -151,8 +162,8 @@ class ArrInstance: self.detail_item_key = getattr(DetailItemKey, arr_type) self.detail_item_id_key = self.detail_item_key + "Id" self.detail_item_ids_key = self.detail_item_key + "Ids" - self.detail_item_search_command = getattr(DetailItemSearchCommand, arr_type) - + self.detail_item_search_command = getattr(DetailItemSearchCommand, arr_type) + async def _check_ui_language(self): """Check if the UI language is set to English.""" endpoint = self.api_url + "/config/ui"