11# Cleans the download queue
2+ import requests
3+
24from src .jobs .remove_bad_files import RemoveBadFiles
35from src .jobs .remove_done_seeding import RemoveDoneSeeding
46from src .jobs .remove_failed_downloads import RemoveFailedDownloads
@@ -24,12 +26,25 @@ def __init__(self, settings):
2426 async def run_jobs (self , arr ):
2527 self .arr = arr
2628 logger .info (f"*** Running jobs on { self .arr .name } ({ self .arr .base_url } ) ***" )
27- await self .removal_jobs ( )
28- await self .search_jobs ( )
29+ await self ._run_arr_job_group ( "Removal Jobs" , self . removal_jobs )
30+ await self ._run_arr_job_group ( "Search Jobs" , self . search_jobs )
2931
3032 async def run_download_client_jobs (self ):
3133 """Run jobs that operate on download clients directly."""
32- if not await self ._download_clients_connected ():
34+ try :
35+ if not await self ._download_clients_connected ():
36+ return None
37+ except requests .exceptions .RequestException as err :
38+ logger .error (
39+ f"Download client connectivity check failed with request error: { err } " ,
40+ exc_info = True ,
41+ )
42+ return None
43+ except Exception as err : # noqa: BLE001
44+ logger .error (
45+ f"Download client connectivity check failed: { err } " ,
46+ exc_info = True ,
47+ )
3348 return None
3449
3550 items_detected = 0
@@ -56,7 +71,9 @@ async def run_download_client_jobs(self):
5671
5772 for download_client_job in download_client_jobs :
5873 if download_client_job .job .enabled :
59- items_detected += await download_client_job .run ()
74+ items_detected += await self ._run_download_client_job (
75+ download_client_job , client
76+ )
6077
6178 return items_detected
6279
@@ -143,6 +160,37 @@ async def _check_client_connection_status(self, clients):
143160 return False
144161 return True
145162
163+ async def _run_arr_job_group (self , label , job_runner ):
164+ """Run one ARR job group and keep the main loop alive on failures."""
165+ try :
166+ await job_runner ()
167+ except requests .exceptions .RequestException as err :
168+ logger .error (
169+ f"{ label } : request error on { self .arr .name } ({ self .arr .base_url } ): { err } " ,
170+ exc_info = True ,
171+ )
172+ except Exception as err : # noqa: BLE001
173+ logger .error (
174+ f"{ label } : unexpected error on { self .arr .name } ({ self .arr .base_url } ): { err } " ,
175+ exc_info = True ,
176+ )
177+
178+ async def _run_download_client_job (self , download_client_job , client ):
179+ """Run one download-client job and keep the loop alive on failures."""
180+ try :
181+ return await download_client_job .run ()
182+ except requests .exceptions .RequestException as err :
183+ logger .error (
184+ f"Download-client job '{ download_client_job .job_name } ' failed on { client .name } ({ client .base_url } ) due to request error: { err } " ,
185+ exc_info = True ,
186+ )
187+ except Exception as err : # noqa: BLE001
188+ logger .error (
189+ f"Download-client job '{ download_client_job .job_name } ' failed on { client .name } ({ client .base_url } ): { err } " ,
190+ exc_info = True ,
191+ )
192+ return 0
193+
146194 def _get_removal_jobs (self ):
147195 """
148196 Return a list of enabled removal job instances based on the provided settings.
0 commit comments