diff --git a/.dockerignore b/.dockerignore index 6da8f43..dbb616e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,4 +4,4 @@ config/config.conf test*.py ToDo .vscode - \ No newline at end of file +snip*.py \ No newline at end of file diff --git a/.gitignore b/.gitignore index c5e3e94..a4e09f2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ __pycache__/ .pytest_cache/ .vscode/ config/config.conf -ToDo \ No newline at end of file +ToDo +snip*.py \ No newline at end of file diff --git a/src/queue_cleaner.py b/src/queue_cleaner.py index 871b628..4971a51 100644 --- a/src/queue_cleaner.py +++ b/src/queue_cleaner.py @@ -1,7 +1,7 @@ # Cleans the download queue import logging, verboselogs logger = verboselogs.VerboseLogger(__name__) -from src.utils.rest import (rest_get, rest_delete) +from src.utils.rest import (rest_get, rest_delete, rest_post) import json from src.utils.nest_functions import (add_keys_nested_dict, nested_get) import sys, os @@ -12,6 +12,7 @@ class Deleted_Downloads: self.dict = dict async def get_queue(BASE_URL, API_KEY, params = {}): + await rest_post(url=BASE_URL+'/command', json={'name': 'RefreshMonitoredDownloads'}, headers={'X-Api-Key': API_KEY}) totalRecords = (await rest_get(f'{BASE_URL}/queue', API_KEY, params))['totalRecords'] if totalRecords == 0: return None @@ -53,6 +54,23 @@ async def remove_stalled(settings_dict, radarr_or_sonarr, BASE_URL, API_KEY, del await check_permitted_attempts(settings_dict, stalledItems, 'stalled', True, deleted_downloads, BASE_URL, API_KEY, defective_tracker) return len(stalledItems) +async def test_remove_ALL(settings_dict, radarr_or_sonarr, BASE_URL, API_KEY, deleted_downloads, defective_tracker): + # Detects stalled and triggers repeat check and subsequent delete. Adds to blocklist + queue = await get_queue(BASE_URL, API_KEY) + if not queue: return 0 + logger.debug('remove_stalled_test/queue: %s', str(queue)) + if settings_dict['QBITTORRENT_URL']: + protected_dowloadItems = await rest_get(settings_dict['QBITTORRENT_URL']+'/torrents/info',params={'tag': settings_dict['NO_STALLED_REMOVAL_QBIT_TAG']}, cookies=settings_dict['QBIT_COOKIE'] ) + protected_downloadIDs = [str.upper(item['hash']) for item in protected_dowloadItems] + else: + protected_downloadIDs = [] + stalledItems = [] + for queueItem in queue['records']: + stalledItems.append(queueItem) + await check_permitted_attempts(settings_dict, stalledItems, 'stalled', True, deleted_downloads, BASE_URL, API_KEY, defective_tracker) + return len(stalledItems) + + async def remove_metadata_missing(settings_dict, radarr_or_sonarr, BASE_URL, API_KEY, deleted_downloads, defective_tracker): # Detects downloads stuck downloading meta data and triggers repeat check and subsequent delete. Adds to blocklist queue = await get_queue(BASE_URL, API_KEY) @@ -106,7 +124,6 @@ async def check_permitted_attempts(settings_dict, current_defective_items, failT current_defective = {} for queueItem in current_defective_items: current_defective[queueItem['id']] = {'title': queueItem['title'],'downloadId': queueItem['downloadId']} - logger.debug('check_permitted_attempts/deleted_downloads: %s', str(deleted_downloads)) logger.debug('check_permitted_attempts/current_defective: %s', str(current_defective)) # 2. Check if those that were previously defective are no longer defective -> those are recovered try: @@ -137,7 +154,7 @@ async def remove_download(settings_dict, BASE_URL, API_KEY, queueId, queueTitle, logger.debug('remove_download/deleted_downloads.dict IN: %s' + str(deleted_downloads.dict)) if downloadId not in deleted_downloads.dict: logger.info('>>> Removing %s download: %s', failType, queueTitle) - if not settings_dict['TEST_RUN']: await rest_delete(f'{BASE_URL}/queue/{queueId}', API_KEY, {'removeFromClient': 'true', 'blocklist': blocklist}) + if not settings_dict['TEST_RUN']: await rest_delete(f'{BASE_URL}/queue/{queueId}', API_KEY, {'removeFromClient': True, 'blocklist': blocklist}) deleted_downloads.dict.append(downloadId) logger.debug('remove_download/deleted_downloads.dict OUT: %s' + str(deleted_downloads.dict)) @@ -166,6 +183,9 @@ async def queue_cleaner(settings_dict, radarr_or_sonarr, defective_tracker): deleted_downloads = Deleted_Downloads([]) items_detected = 0 + + #items_detected += await test_remove_ALL( settings_dict, radarr_or_sonarr, BASE_URL, API_KEY, deleted_downloads, defective_tracker) + if settings_dict['REMOVE_FAILED']: items_detected += await remove_failed( settings_dict, radarr_or_sonarr, BASE_URL, API_KEY, deleted_downloads) diff --git a/src/utils/rest.py b/src/utils/rest.py index 3b98825..57642ed 100644 --- a/src/utils/rest.py +++ b/src/utils/rest.py @@ -38,10 +38,10 @@ async def rest_delete(url, api_key, params=None): return None # POST -async def rest_post(url, data, headers, cookies=None): +async def rest_post(url, data=None, json=None, headers=None, cookies=None): if settings_dict['TEST_RUN']: return try: - response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.post(url, data=data, headers=headers, cookies=cookies)) + response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.post(url, data=data, json=json, headers=headers, cookies=cookies)) response.raise_for_status() if response.status_code in (200,201): return None