From bdc7e7e8b715b1e825ac8cbd4c70ad579573f810 Mon Sep 17 00:00:00 2001 From: Sophia Hadash Date: Fri, 22 Nov 2024 21:04:04 +0100 Subject: [PATCH 1/5] Implement obsolete tag for qBittorrent --- README.md | 8 ++++++++ config/config.conf-Example | 1 + config/definitions.py | 1 + main.py | 3 +++ src/utils/loadScripts.py | 10 ++++++++++ src/utils/main.py | 3 +++ src/utils/shared.py | 20 +++++++++++++++----- 7 files changed, 41 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f948e0b..213c454 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ services: # Feature Settings PERMITTED_ATTEMPTS: 3 NO_STALLED_REMOVAL_QBIT_TAG: Don't Kill + OBSOLETE_QBIT_TAG: Obsolete REMOVE_SLOW: True MIN_DOWNLOAD_SPEED: 100 FAILED_IMPORT_MESSAGE_PATTERNS: ' @@ -286,6 +287,13 @@ If it you face issues, please first check the closed issues before opening a new - Type: String - Is Mandatory: No (Defaults to `Don't Kill`) +**OBSOLETE_QBIT_TAG** +- Downloads in qBittorrent that would be removed if IGNORE_PRIVATE_TRACKERS wouldn't be true will be tagged with this value +- Note: the tag can be used by third-party tools to remove these torrents after required seeding time has passed. +- Tag is automatically created in qBittorrent (required qBittorrent is reachable on `QBITTORRENT_URL`) +- Type: String +- Is Mandatory: No (Defaults to `Obsolete`) + **IGNORE_PRIVATE_TRACKERS** - Private torrents in qBittorrent will not be removed from the queue if this is set to true - Only works if qBittorrent is used (does not work with transmission etc.) diff --git a/config/config.conf-Example b/config/config.conf-Example index a34995a..0454605 100644 --- a/config/config.conf-Example +++ b/config/config.conf-Example @@ -18,6 +18,7 @@ RUN_PERIODIC_RESCANS = {"SONARR": {"MISSING": true, "CUTOFF_UNMET": true, MIN_DOWNLOAD_SPEED = 100 PERMITTED_ATTEMPTS = 3 NO_STALLED_REMOVAL_QBIT_TAG = Don't Kill +OBSOLETE_QBIT_TAG = Obsolete IGNORE_PRIVATE_TRACKERS = FALSE FAILED_IMPORT_MESSAGE_PATTERNS = ["Not a Custom Format upgrade for existing", "Not an upgrade for existing"] diff --git a/config/definitions.py b/config/definitions.py index 79d5642..f69097c 100644 --- a/config/definitions.py +++ b/config/definitions.py @@ -25,6 +25,7 @@ MIN_DOWNLOAD_SPEED = get_config_value('MIN_DOWNLOAD_SPEED', 'feature_settings', False, int, 0) PERMITTED_ATTEMPTS = get_config_value('PERMITTED_ATTEMPTS', 'feature_settings', False, int, 3) NO_STALLED_REMOVAL_QBIT_TAG = get_config_value('NO_STALLED_REMOVAL_QBIT_TAG', 'feature_settings', False, str, 'Don\'t Kill') +OBSOLETE_QBIT_TAG = get_config_value('OBSOLETE_QBIT_TAG', 'feature_settings', False, str, 'Obsolete') IGNORE_PRIVATE_TRACKERS = get_config_value('IGNORE_PRIVATE_TRACKERS', 'feature_settings', False, bool, True) FAILED_IMPORT_MESSAGE_PATTERNS = get_config_value('FAILED_IMPORT_MESSAGE_PATTERNS','feature_settings', False, list, []) diff --git a/main.py b/main.py index c89255e..a7baa5c 100644 --- a/main.py +++ b/main.py @@ -56,6 +56,9 @@ async def main(settingsDict): # Create qBit protection tag if not existing await createQbitProtectionTag(settingsDict) + # Create qBit obsolete tag if not existing + await createQbitObsoleteTag(settingsDict) + # Show Logger Level showLoggerLevel(settingsDict) diff --git a/src/utils/loadScripts.py b/src/utils/loadScripts.py index 4599a0d..05f7ef9 100644 --- a/src/utils/loadScripts.py +++ b/src/utils/loadScripts.py @@ -231,6 +231,16 @@ async def createQbitProtectionTag(settingsDict): if not settingsDict['TEST_RUN']: await rest_post(url=settingsDict['QBITTORRENT_URL']+'/torrents/createTags', data={'tags': settingsDict['NO_STALLED_REMOVAL_QBIT_TAG']}, headers={'content-type': 'application/x-www-form-urlencoded'}, cookies=settingsDict['QBIT_COOKIE']) +async def createQbitObsoleteTag(settingsDict): + # Creates the qBit Obsolete tag if not already present + if settingsDict['QBITTORRENT_URL']: + current_tags = await rest_get(settingsDict['QBITTORRENT_URL']+'/torrents/tags',cookies=settingsDict['QBIT_COOKIE']) + if not settingsDict['OBSOLETE_QBIT_TAG'] in current_tags: + if settingsDict['QBITTORRENT_URL']: + logger.info('Creating tag in qBittorrent: %s', settingsDict['OBSOLETE_QBIT_TAG']) + if not settingsDict['TEST_RUN']: + await rest_post(url=settingsDict['QBITTORRENT_URL']+'/torrents/createTags', data={'tags': settingsDict['OBSOLETE_QBIT_TAG']}, headers={'content-type': 'application/x-www-form-urlencoded'}, cookies=settingsDict['QBIT_COOKIE']) + def showLoggerLevel(settingsDict): logger.info('#' * 50) if settingsDict['LOG_LEVEL'] == 'INFO': diff --git a/src/utils/main.py b/src/utils/main.py index c89255e..a7baa5c 100644 --- a/src/utils/main.py +++ b/src/utils/main.py @@ -56,6 +56,9 @@ async def main(settingsDict): # Create qBit protection tag if not existing await createQbitProtectionTag(settingsDict) + # Create qBit obsolete tag if not existing + await createQbitObsoleteTag(settingsDict) + # Show Logger Level showLoggerLevel(settingsDict) diff --git a/src/utils/shared.py b/src/utils/shared.py index 470eef4..ad891b4 100644 --- a/src/utils/shared.py +++ b/src/utils/shared.py @@ -285,11 +285,18 @@ async def remove_download( if removeFromClient: logger.info(">>> Removing %s download: %s", failType, affectedItem["title"]) else: - logger.info( - ">>> Removing %s download (without removing from torrent client): %s", - failType, - affectedItem["title"], - ) + if settingsDict['OBSOLETE_QBIT_TAG']: + logger.info( + ">>> Removing %s download (without removing from torrent client but with setting obsolete tag): %s", + failType, + affectedItem["title"], + ) + else: + logger.info( + ">>> Removing %s download (without removing from torrent client): %s", + failType, + affectedItem["title"], + ) # Print out detailed removal messages (if any were added in the jobs) if "removal_messages" in affectedItem: @@ -302,6 +309,9 @@ async def remove_download( API_KEY, {"removeFromClient": removeFromClient, "blocklist": addToBlocklist}, ) + if not removeFromClient and settingsDict['QBITTORRENT_URL'] and settingsDict['OBSOLETE_QBIT_TAG']: + await rest_post(url=settingsDict['QBITTORRENT_URL']+'/torrents/createTags', data={'hashes': hashes, 'tags': settingsDict['OBSOLETE_QBIT_TAG']}, headers={'content-type': 'application/x-www-form-urlencoded'}, cookies=settingsDict['QBIT_COOKIE']) + deleted_downloads.dict.append(affectedItem["downloadId"]) logger.debug( From 808174276bbba705ec001714da3df00ec0635713 Mon Sep 17 00:00:00 2001 From: Sophia Hadash Date: Fri, 22 Nov 2024 22:13:42 +0100 Subject: [PATCH 2/5] bugfixes --- src/utils/loadScripts.py | 4 +++- src/utils/shared.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/utils/loadScripts.py b/src/utils/loadScripts.py index 05f7ef9..154569a 100644 --- a/src/utils/loadScripts.py +++ b/src/utils/loadScripts.py @@ -99,7 +99,9 @@ def showSettings(settingsDict): logger.info('Minimum speed enforced: %s KB/s', str(settingsDict['MIN_DOWNLOAD_SPEED'])) logger.info('Permitted number of times before stalled/missing metadata/slow downloads are removed: %s', str(settingsDict['PERMITTED_ATTEMPTS'])) if settingsDict['QBITTORRENT_URL']: - logger.info('Downloads with this tag will be skipped: \"%s\"', settingsDict['NO_STALLED_REMOVAL_QBIT_TAG']) + logger.info('Downloads with this tag will be skipped: \"%s\"', settingsDict['NO_STALLED_REMOVAL_QBIT_TAG']) + if settingsDict['OBSOLETE_QBIT_TAG']: + logger.info('Obsolete torrents that cannot be removed will be given this tag: \"%s\"', settingsDict['OBSOLETE_QBIT_TAG']) logger.info('Private Trackers will be skipped: %s', settingsDict['IGNORE_PRIVATE_TRACKERS']) logger.info('') diff --git a/src/utils/shared.py b/src/utils/shared.py index ad891b4..41e8f39 100644 --- a/src/utils/shared.py +++ b/src/utils/shared.py @@ -309,8 +309,8 @@ async def remove_download( API_KEY, {"removeFromClient": removeFromClient, "blocklist": addToBlocklist}, ) - if not removeFromClient and settingsDict['QBITTORRENT_URL'] and settingsDict['OBSOLETE_QBIT_TAG']: - await rest_post(url=settingsDict['QBITTORRENT_URL']+'/torrents/createTags', data={'hashes': hashes, 'tags': settingsDict['OBSOLETE_QBIT_TAG']}, headers={'content-type': 'application/x-www-form-urlencoded'}, cookies=settingsDict['QBIT_COOKIE']) + if not removeFromClient and settingsDict['QBITTORRENT_URL'] and settingsDict['OBSOLETE_QBIT_TAG'] and affectedItem["downloadId"]: + await rest_post(url=settingsDict['QBITTORRENT_URL']+'/torrents/createTags', data={'hashes': affectedItem["downloadId"], 'tags': settingsDict['OBSOLETE_QBIT_TAG']}, headers={'content-type': 'application/x-www-form-urlencoded'}, cookies=settingsDict['QBIT_COOKIE']) deleted_downloads.dict.append(affectedItem["downloadId"]) From 1cb773fb7d0f20a965471b4097f355253b1560ca Mon Sep 17 00:00:00 2001 From: Sophia Hadash Date: Sun, 24 Nov 2024 13:20:48 +0100 Subject: [PATCH 3/5] add test code --- .../remove_download/test_remove_download_1.py | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/tests/utils/remove_download/test_remove_download_1.py b/tests/utils/remove_download/test_remove_download_1.py index 9eb434f..6a6bfa5 100644 --- a/tests/utils/remove_download/test_remove_download_1.py +++ b/tests/utils/remove_download/test_remove_download_1.py @@ -8,7 +8,7 @@ @pytest.mark.asyncio async def test_removal_with_removal_messages(monkeypatch, caplog): - settingsDict = {"TEST_RUN": True} + settingsDict = {"TEST_RUN": True, "OBSOLETE_QBIT_TAG": ""} removeFromClient = True expected_removal_messages = { ">>> Removing failed import download: Sonarr Title 1", @@ -30,7 +30,7 @@ async def test_removal_with_removal_messages(monkeypatch, caplog): @pytest.mark.asyncio async def test_schizophrenic_removal_with_removal_messages(monkeypatch, caplog): - settingsDict = {"TEST_RUN": True} + settingsDict = {"TEST_RUN": True, "OBSOLETE_QBIT_TAG": ""} removeFromClient = False expected_removal_messages = { ">>> Removing failed import download (without removing from torrent client): Sonarr Title 1", @@ -48,3 +48,24 @@ async def test_schizophrenic_removal_with_removal_messages(monkeypatch, caplog): monkeypatch=monkeypatch, caplog=caplog, ) + +@pytest.mark.asyncio +async def test_obsolete_removal_with_removal_messages(monkeypatch, caplog): + settingsDict = {"TEST_RUN": True, "OBSOLETE_QBIT_TAG": "Obsolete"} + removeFromClient = False + expected_removal_messages = { + ">>> Removing failed import download (without removing from torrent client but with setting obsolete tag): Sonarr Title 1", + ">>>>> Tracked Download State: importBlocked", + ">>>>> Status Messages (matching specified patterns):", + ">>>>> - Episode XYZ was not found in the grabbed release: Sonarr Title 2.mkv", + ">>>>> - And yet another message", + } + await run_test( + settingsDict=settingsDict, + expected_removal_messages=expected_removal_messages, + failType=failType, + removeFromClient=removeFromClient, + mock_data_file=mock_data_file, + monkeypatch=monkeypatch, + caplog=caplog, + ) From 6c49fd805e8d94aade0823ae830d9bec16f31a3c Mon Sep 17 00:00:00 2001 From: Sophia Hadash Date: Fri, 20 Dec 2024 13:56:46 +0100 Subject: [PATCH 4/5] rework: (1) add boolean feature toggle, (2) rework readme --- README.md | 12 +++++++++++- config/config.conf-Example | 1 + config/definitions.py | 1 + src/utils/loadScripts.py | 11 ++++++----- src/utils/shared.py | 4 ++-- .../utils/remove_download/test_remove_download_1.py | 6 +++--- 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 213c454..4751422 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ services: REMOVE_SLOW: True REMOVE_STALLED: True REMOVE_UNMONITORED: True + SET_OBSOLETE_QBIT_TAG: True RUN_PERIODIC_RESCANS: ' { "SONARR": {"MISSING": true, "CUTOFF_UNMET": true, "MAX_CONCURRENT_SCANS": 3, "MIN_DAYS_BEFORE_RESCAN": 7}, @@ -234,6 +235,15 @@ Steers which type of cleaning is applied to the downloads queue - Permissible Values: True, False - Is Mandatory: No (Defaults to False) +**SET_OBSOLETE_QBIT_TAG** +- Set a tag on torrents in qBittorrent that can be removed, but are kept because they are private torrents. +- Note: Has no effect when `IGNORE_PRIVATE_TRACKERS==False`. +- The tag can be used by third-party tools to remove these torrents after required seeding time has passed. +- Tag is automatically created in qBittorrent (required qBittorrent is reachable on `QBITTORRENT_URL`) +- Type: Boolean +- Permissible Values: True, False +- Is Mandatory: No (Defaults to False) + **RUN_PERIODIC_RESCANS** - Steers whether searches are automatically triggered for items that are missing or have not yet met the cutoff - Note: Only supports Radarr/Sonarr currently (Lidarr depending on: https://github.com/Lidarr/Lidarr/pull/5084 / Readarr Depending on: https://github.com/Readarr/Readarr/pull/3724) @@ -288,7 +298,7 @@ If it you face issues, please first check the closed issues before opening a new - Is Mandatory: No (Defaults to `Don't Kill`) **OBSOLETE_QBIT_TAG** -- Downloads in qBittorrent that would be removed if IGNORE_PRIVATE_TRACKERS wouldn't be true will be tagged with this value +- Downloads in qBittorrent will receive this tag when: (1) `SET_OBSOLETE_QBIT_TAG==True`, (2) `IGNORE_PRIVATE_TRACKERS==True`, (3) torrent is private, (4) torrent is due for removal. - Note: the tag can be used by third-party tools to remove these torrents after required seeding time has passed. - Tag is automatically created in qBittorrent (required qBittorrent is reachable on `QBITTORRENT_URL`) - Type: String diff --git a/config/config.conf-Example b/config/config.conf-Example index 0454605..dfb2f15 100644 --- a/config/config.conf-Example +++ b/config/config.conf-Example @@ -12,6 +12,7 @@ REMOVE_ORPHANS = True REMOVE_SLOW = True REMOVE_STALLED = True REMOVE_UNMONITORED = True +SET_OBSOLETE_QBIT_TAG = True RUN_PERIODIC_RESCANS = {"SONARR": {"MISSING": true, "CUTOFF_UNMET": true, "MAX_CONCURRENT_SCANS": 3, "MIN_DAYS_BEFORE_RESCAN": 7}, "RADARR": {"MISSING": true, "CUTOFF_UNMET": true, "MAX_CONCURRENT_SCANS": 3, "MIN_DAYS_BEFORE_RESCAN": 7}} [feature_settings] diff --git a/config/definitions.py b/config/definitions.py index f69097c..1663682 100644 --- a/config/definitions.py +++ b/config/definitions.py @@ -19,6 +19,7 @@ REMOVE_SLOW = get_config_value('REMOVE_SLOW', 'features', False, bool, False) REMOVE_STALLED = get_config_value('REMOVE_STALLED', 'features', False, bool, False) REMOVE_UNMONITORED = get_config_value('REMOVE_UNMONITORED', 'features', False, bool, False) +SET_OBSOLETE_QBIT_TAG = get_config_value('SET_OBSOLETE_QBIT_TAG', 'features', False, bool, False) RUN_PERIODIC_RESCANS = get_config_value('RUN_PERIODIC_RESCANS', 'features', False, dict, {}) # Feature Settings diff --git a/src/utils/loadScripts.py b/src/utils/loadScripts.py index 154569a..f964470 100644 --- a/src/utils/loadScripts.py +++ b/src/utils/loadScripts.py @@ -90,6 +90,7 @@ def showSettings(settingsDict): logger.info('%s | Removing slow downloads (%s)', str(settingsDict['REMOVE_SLOW']), 'REMOVE_SLOW') logger.info('%s | Removing stalled downloads (%s)', str(settingsDict['REMOVE_STALLED']), 'REMOVE_STALLED') logger.info('%s | Removing downloads belonging to unmonitored items (%s)', str(settingsDict['REMOVE_UNMONITORED']), 'REMOVE_UNMONITORED') + logger.info('%s | Setting obsolete tag on private torrents that are due for removal (%s)', str(settingsDict['SET_OBSOLETE_QBIT_TAG']), 'SET_OBSOLETE_QBIT_TAG') for arr_type, RESCAN_SETTINGS in settingsDict['RUN_PERIODIC_RESCANS'].items(): logger.info('%s/%s (%s) | Search missing/cutoff-unmet items. Max queries/list: %s. Min. days to re-search: %s (%s)', RESCAN_SETTINGS['MISSING'], RESCAN_SETTINGS['CUTOFF_UNMET'], arr_type, RESCAN_SETTINGS['MAX_CONCURRENT_SCANS'], RESCAN_SETTINGS['MIN_DAYS_BEFORE_RESCAN'], 'RUN_PERIODIC_RESCANS') logger.info('') @@ -100,9 +101,9 @@ def showSettings(settingsDict): logger.info('Permitted number of times before stalled/missing metadata/slow downloads are removed: %s', str(settingsDict['PERMITTED_ATTEMPTS'])) if settingsDict['QBITTORRENT_URL']: logger.info('Downloads with this tag will be skipped: \"%s\"', settingsDict['NO_STALLED_REMOVAL_QBIT_TAG']) - if settingsDict['OBSOLETE_QBIT_TAG']: - logger.info('Obsolete torrents that cannot be removed will be given this tag: \"%s\"', settingsDict['OBSOLETE_QBIT_TAG']) - logger.info('Private Trackers will be skipped: %s', settingsDict['IGNORE_PRIVATE_TRACKERS']) + if settingsDict['SET_OBSOLETE_QBIT_TAG'] and settingsDict['OBSOLETE_QBIT_TAG']: + logger.info('Obsolete private torrents will be given this tag: \"%s\"', settingsDict['OBSOLETE_QBIT_TAG']) + logger.info('Private Trackers will be skipped: %s', settingsDict['IGNORE_PRIVATE_TRACKERS']) logger.info('') logger.info('*** Configured Instances ***') @@ -234,8 +235,8 @@ async def createQbitProtectionTag(settingsDict): await rest_post(url=settingsDict['QBITTORRENT_URL']+'/torrents/createTags', data={'tags': settingsDict['NO_STALLED_REMOVAL_QBIT_TAG']}, headers={'content-type': 'application/x-www-form-urlencoded'}, cookies=settingsDict['QBIT_COOKIE']) async def createQbitObsoleteTag(settingsDict): - # Creates the qBit Obsolete tag if not already present - if settingsDict['QBITTORRENT_URL']: + # Creates the qBit Obsolete tag if not already present, feature is enabled, and tag is not an empty string + if settingsDict['QBITTORRENT_URL'] and settingsDict['SET_OBSOLETE_QBIT_TAG'] and settingsDict['OBSOLETE_QBIT_TAG']: current_tags = await rest_get(settingsDict['QBITTORRENT_URL']+'/torrents/tags',cookies=settingsDict['QBIT_COOKIE']) if not settingsDict['OBSOLETE_QBIT_TAG'] in current_tags: if settingsDict['QBITTORRENT_URL']: diff --git a/src/utils/shared.py b/src/utils/shared.py index 41e8f39..0d9f878 100644 --- a/src/utils/shared.py +++ b/src/utils/shared.py @@ -285,7 +285,7 @@ async def remove_download( if removeFromClient: logger.info(">>> Removing %s download: %s", failType, affectedItem["title"]) else: - if settingsDict['OBSOLETE_QBIT_TAG']: + if settingsDict['SET_OBSOLETE_QBIT_TAG'] and settingsDict['OBSOLETE_QBIT_TAG']: logger.info( ">>> Removing %s download (without removing from torrent client but with setting obsolete tag): %s", failType, @@ -309,7 +309,7 @@ async def remove_download( API_KEY, {"removeFromClient": removeFromClient, "blocklist": addToBlocklist}, ) - if not removeFromClient and settingsDict['QBITTORRENT_URL'] and settingsDict['OBSOLETE_QBIT_TAG'] and affectedItem["downloadId"]: + if not removeFromClient and settingsDict['QBITTORRENT_URL'] and settingsDict['SET_OBSOLETE_QBIT_TAG'] and settingsDict['OBSOLETE_QBIT_TAG'] and affectedItem["downloadId"]: await rest_post(url=settingsDict['QBITTORRENT_URL']+'/torrents/createTags', data={'hashes': affectedItem["downloadId"], 'tags': settingsDict['OBSOLETE_QBIT_TAG']}, headers={'content-type': 'application/x-www-form-urlencoded'}, cookies=settingsDict['QBIT_COOKIE']) deleted_downloads.dict.append(affectedItem["downloadId"]) diff --git a/tests/utils/remove_download/test_remove_download_1.py b/tests/utils/remove_download/test_remove_download_1.py index 6a6bfa5..45684d4 100644 --- a/tests/utils/remove_download/test_remove_download_1.py +++ b/tests/utils/remove_download/test_remove_download_1.py @@ -8,7 +8,7 @@ @pytest.mark.asyncio async def test_removal_with_removal_messages(monkeypatch, caplog): - settingsDict = {"TEST_RUN": True, "OBSOLETE_QBIT_TAG": ""} + settingsDict = {"TEST_RUN": True} removeFromClient = True expected_removal_messages = { ">>> Removing failed import download: Sonarr Title 1", @@ -30,7 +30,7 @@ async def test_removal_with_removal_messages(monkeypatch, caplog): @pytest.mark.asyncio async def test_schizophrenic_removal_with_removal_messages(monkeypatch, caplog): - settingsDict = {"TEST_RUN": True, "OBSOLETE_QBIT_TAG": ""} + settingsDict = {"TEST_RUN": True} removeFromClient = False expected_removal_messages = { ">>> Removing failed import download (without removing from torrent client): Sonarr Title 1", @@ -51,7 +51,7 @@ async def test_schizophrenic_removal_with_removal_messages(monkeypatch, caplog): @pytest.mark.asyncio async def test_obsolete_removal_with_removal_messages(monkeypatch, caplog): - settingsDict = {"TEST_RUN": True, "OBSOLETE_QBIT_TAG": "Obsolete"} + settingsDict = {"TEST_RUN": True, "SET_OBSOLETE_QBIT_TAG": True} removeFromClient = False expected_removal_messages = { ">>> Removing failed import download (without removing from torrent client but with setting obsolete tag): Sonarr Title 1", From 2222592e00c9c18e37471b57a9affa0e9a108fa5 Mon Sep 17 00:00:00 2001 From: ManiMatter <124743318+ManiMatter@users.noreply.github.com> Date: Sat, 21 Dec 2024 13:57:06 +0100 Subject: [PATCH 5/5] added a comment in readme that the obsolete feature does not work if not using qbit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 56ac324..21c3a7c 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ You can find a sample docker-compose.yml [here](#method-1-docker). - When detecting slow downloads, the speeds provided by the \*arr apps will be used, which is less accurate than what qBittorrent returns when queried directly - The feature that allows to protect downloads from removal (NO_STALLED_REMOVAL_QBIT_TAG) does not work - The feature that ignores private trackers does not work + - The "obsolete" feature that tags private torrents due for removal rather than removing them does not work - If you see strange errors such as "found 10 / 3 times", consider turning on the setting "Reject Blocklisted Torrent Hashes While Grabbing". On nightly Radarr/Sonarr/Readarr/Lidarr/Whisparr, the option is located under settings/indexers in the advanced options of each indexer, on Prowlarr it is under settings/apps and then the advanced settings of the respective app - When broken torrents are removed the files belonging to them are deleted - Across all removal types: A new download from another source is automatically added by radarr/sonarr/lidarr/readarr/whisparr (if available)