From cb066d3812d2ad2577620966b01627e3391741cb Mon Sep 17 00:00:00 2001 From: Benjamin Harder Date: Tue, 3 Dec 2024 21:45:52 +0100 Subject: [PATCH] Added Cookie Refresh on every run --- main.py | 8 ++++ src/utils/loadScripts.py | 14 ++----- src/utils/main.py | 89 ---------------------------------------- src/utils/shared.py | 18 +++++++- 4 files changed, 28 insertions(+), 101 deletions(-) delete mode 100644 src/utils/main.py diff --git a/main.py b/main.py index c89255e..34d66e9 100644 --- a/main.py +++ b/main.py @@ -62,6 +62,14 @@ async def main(settingsDict): # Start Cleaning while True: logger.verbose("-" * 50) + + # Refresh qBit Cookie + if settingsDict["QBITTORRENT_URL"]: + await qBitRefreshCookie(settingsDict) + if not settingsDict["QBIT_COOKIE"]: + logger.error("Cookie Refresh failed - exiting decluttarr") + exit() + # Cache protected (via Tag) and private torrents protectedDownloadIDs, privateDowloadIDs = await getProtectedAndPrivateFromQbit( settingsDict diff --git a/src/utils/loadScripts.py b/src/utils/loadScripts.py index 4599a0d..816debc 100644 --- a/src/utils/loadScripts.py +++ b/src/utils/loadScripts.py @@ -6,6 +6,7 @@ logger = verboselogs.VerboseLogger(__name__) from dateutil.relativedelta import relativedelta as rd import requests from src.utils.rest import rest_get, rest_post # +from src.utils.shared import qBitRefreshCookie import asyncio from packaging import version @@ -187,18 +188,9 @@ async def instanceChecks(settingsDict): # Check Bittorrent if settingsDict['QBITTORRENT_URL']: # Checking if qbit can be reached, and checking if version is OK - try: - response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.post(settingsDict['QBITTORRENT_URL']+'/auth/login', data={'username': settingsDict['QBITTORRENT_USERNAME'], 'password': settingsDict['QBITTORRENT_PASSWORD']}, headers={'content-type': 'application/x-www-form-urlencoded'}, verify=settingsDict['SSL_VERIFICATION'])) - if response.text == 'Fails.': - raise ConnectionError('Login failed.') - response.raise_for_status() - settingsDict['QBIT_COOKIE'] = {'SID': response.cookies['SID']} - except Exception as error: + await qBitRefreshCookie(settingsDict) + if not settingsDict['QBIT_COOKIE']: error_occured = True - logger.error('!! %s Error: !!', 'qBittorrent') - logger.error('> %s', error) - logger.error('> Details:') - logger.error(response.text) if not error_occured: qbit_version = await rest_get(settingsDict['QBITTORRENT_URL']+'/app/version',cookies=settingsDict['QBIT_COOKIE']) diff --git a/src/utils/main.py b/src/utils/main.py deleted file mode 100644 index c89255e..0000000 --- a/src/utils/main.py +++ /dev/null @@ -1,89 +0,0 @@ -# Import Libraries -import asyncio -import logging, verboselogs - -logger = verboselogs.VerboseLogger(__name__) -import json - -# Import Functions -from config.definitions import settingsDict -from src.utils.loadScripts import * -from src.decluttarr import queueCleaner -from src.utils.rest import rest_get, rest_post -from src.utils.trackers import Defective_Tracker, Download_Sizes_Tracker - -# Hide SSL Verification Warnings -if settingsDict["SSL_VERIFICATION"] == False: - import warnings - - warnings.filterwarnings("ignore", message="Unverified HTTPS request") - -# Set up logging -setLoggingFormat(settingsDict) - - -# Main function -async def main(settingsDict): - # Adds to settings Dict the instances that are actually configures - settingsDict["INSTANCES"] = [] - for arrApplication in settingsDict["SUPPORTED_ARR_APPS"]: - if settingsDict[arrApplication + "_URL"]: - settingsDict["INSTANCES"].append(arrApplication) - - # Pre-populates the dictionaries (in classes) that track the items that were already caught as having problems or removed - defectiveTrackingInstances = {} - for instance in settingsDict["INSTANCES"]: - defectiveTrackingInstances[instance] = {} - defective_tracker = Defective_Tracker(defectiveTrackingInstances) - download_sizes_tracker = Download_Sizes_Tracker({}) - - # Get name of arr-instances - for instance in settingsDict["INSTANCES"]: - settingsDict = await getArrInstanceName(settingsDict, instance) - - # Check outdated - upgradeChecks(settingsDict) - - # Welcome Message - showWelcome() - - # Current Settings - showSettings(settingsDict) - - # Check Minimum Version and if instances are reachable and retrieve qbit cookie - settingsDict = await instanceChecks(settingsDict) - - # Create qBit protection tag if not existing - await createQbitProtectionTag(settingsDict) - - # Show Logger Level - showLoggerLevel(settingsDict) - - # Start Cleaning - while True: - logger.verbose("-" * 50) - # Cache protected (via Tag) and private torrents - protectedDownloadIDs, privateDowloadIDs = await getProtectedAndPrivateFromQbit( - settingsDict - ) - - # Run script for each instance - for instance in settingsDict["INSTANCES"]: - await queueCleaner( - settingsDict, - instance, - defective_tracker, - download_sizes_tracker, - protectedDownloadIDs, - privateDowloadIDs, - ) - logger.verbose("") - logger.verbose("Queue clean-up complete!") - - # Wait for the next run - await asyncio.sleep(settingsDict["REMOVE_TIMER"] * 60) - return - - -if __name__ == "__main__": - asyncio.run(main(settingsDict)) diff --git a/src/utils/shared.py b/src/utils/shared.py index 470eef4..3679f8f 100644 --- a/src/utils/shared.py +++ b/src/utils/shared.py @@ -1,6 +1,7 @@ # Shared Functions import logging, verboselogs - +import asyncio +import requests logger = verboselogs.VerboseLogger(__name__) from src.utils.rest import rest_get, rest_delete, rest_post from src.utils.nest_functions import add_keys_nested_dict, nested_get @@ -373,3 +374,18 @@ async def qBitOffline(settingsDict, failType, NAME): ) return True return False + +async def qBitRefreshCookie(settingsDict): + try: + response = await asyncio.get_event_loop().run_in_executor(None, lambda: requests.post(settingsDict['QBITTORRENT_URL']+'/auth/login', data={'username': settingsDict['QBITTORRENT_USERNAME'], 'password': settingsDict['QBITTORRENT_PASSWORD']}, headers={'content-type': 'application/x-www-form-urlencoded'}, verify=settingsDict['SSL_VERIFICATION'])) + if response.text == 'Fails.': + raise ConnectionError('Login failed.') + response.raise_for_status() + settingsDict['QBIT_COOKIE'] = {'SID': response.cookies['SID']} + logger.debug('qBit cookie refreshed!') + except Exception as error: + logger.error('!! %s Error: !!', 'qBittorrent') + logger.error('> %s', error) + logger.error('> Details:') + logger.error(response.text) + settingsDict['QBIT_COOKIE'] = {} \ No newline at end of file