Skip to content

Commit 81d0f38

Browse files
committed
Fixed tracker resetting logic when queue is empty
1 parent bd97e7f commit 81d0f38

File tree

5 files changed

+28
-26
lines changed

5 files changed

+28
-26
lines changed

src/job_manager.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ async def _queue_has_items(self):
6868
)
6969
return True
7070
else:
71+
self.arr.tracker.reset_trackers()
7172
logger.verbose(">>> Queue is empty.")
7273
return False
7374

src/jobs/removal_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ async def _remove_download(self, queue_item, blocklist):
4646
async def _tag_as_obsolete(self, queue_item, download_id):
4747
logger.info(f">>> Job'{self.job_name}' triggered obsolete-tagging: {queue_item['title']}")
4848
for qbit in self.settings.download_clients.qbittorrent:
49-
await qbit.set_tag(tags=[self.settings.general.obsolete_tag], hashes=[download_id])
49+
await qbit.set_tag(tags=[self.settings.general.obsolete_tag], hashes=[download_id])
5050

5151

5252
async def _get_handling_method(self, download_id, queue_item):
@@ -62,5 +62,5 @@ async def _get_handling_method(self, download_id, queue_item):
6262

6363
if download_id in self.arr.tracker.private:
6464
return self.settings.general.private_tracker_handling
65-
65+
6666
return self.settings.general.public_tracker_handling

src/jobs/removal_job.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,24 @@ def __init__(self, arr, settings, job_name):
2121
self.settings = settings
2222
self.job_name = job_name
2323
self.job = getattr(self.settings.jobs, self.job_name)
24-
self.max_strikes = getattr(self.job, "max_strikes", 0)
2524
self.queue_manager = QueueManager(self.arr, self.settings)
26-
self.strikes_handler = StrikesHandler(job_name=self.job_name, arr=self.arr, max_strikes=self.max_strikes)
27-
2825

2926
async def run(self):
3027
if not self.job.enabled:
3128
return 0
3229
logger.debug(f"removal_job.py/run: Launching job '{self.job_name}', and checking if any items in {self.queue_scope} queue.")
3330
self.queue = await self.queue_manager.get_queue_items(queue_scope=self.queue_scope)
34-
31+
3532
# Handle empty queue
3633
if not self.queue:
37-
if self.max_strikes:
38-
self.strikes_handler.all_recovered()
3934
return 0
40-
35+
4136
self.affected_items = await self._find_affected_items()
4237
self.affected_downloads = self.queue_manager.group_by_download_id(self.affected_items)
4338

4439
# -- Checks --
4540
self._ignore_protected()
46-
47-
self.max_strikes = getattr(self.job, "max_strikes", None)
48-
if self.max_strikes:
49-
self.affected_downloads = self.strikes_handler.check_permitted_strikes(self.affected_downloads)
41+
self._check_strikes_handler()
5042

5143
# -- Removal --
5244
await RemovalHandler(
@@ -57,6 +49,12 @@ async def run(self):
5749

5850
return len(self.affected_downloads)
5951

52+
def _check_strikes_handler(self):
53+
max_strikes = getattr(self.job, "max_strikes", None)
54+
if max_strikes:
55+
strikes_handler = StrikesHandler(job_name=self.job_name, arr=self.arr, max_strikes=max_strikes)
56+
self.affected_downloads = strikes_handler.check_permitted_strikes(self.affected_downloads)
57+
6058
def _ignore_protected(self):
6159
"""
6260
Filters out downloads that are in the protected tracker.
@@ -70,4 +68,4 @@ def _ignore_protected(self):
7068

7169
@abstractmethod # Imlemented on level of each removal job
7270
async def _find_affected_items(self):
73-
pass
71+
pass

src/jobs/strikes_handler.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,6 @@ def check_permitted_strikes(self, affected_downloads):
1414
return self._apply_strikes_and_filter(affected_downloads)
1515

1616

17-
def all_recovered(self):
18-
if self.tracker.defective.get(self.job_name):
19-
self.tracker.defective[self.job_name] = {}
20-
logger.info(
21-
">>> No downloads any longer marked as %s (None in queue)",
22-
self.job_name,
23-
)
24-
2517
def _recover_downloads(self, affected_downloads):
2618
recovered = [
2719
d_id for d_id in self.tracker.defective[self.job_name]
@@ -74,4 +66,4 @@ def _log_strike_status(self, title, strikes, strikes_left):
7466
logger.info(
7567
'>>> [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',
7668
title,
77-
)
69+
)

src/settings/_instances.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@ def __init__(self):
2222
self.deleted = []
2323
self.extension_checked = []
2424

25+
def reset(self) -> None:
26+
for attr in (
27+
self.protected,
28+
self.private,
29+
self.defective,
30+
self.download_progress,
31+
self.deleted,
32+
self.extension_checked,
33+
):
34+
attr.clear()
35+
2536
async def refresh_private_and_protected(self, settings):
2637
protected_downloads = []
2738
private_downloads = []
@@ -65,7 +76,7 @@ def config_as_yaml(self, hide_internal_attr=True):
6576
"detail_item_id_key",
6677
"detail_item_ids_key",
6778
"detail_item_search_command",
68-
}
79+
}
6980

7081
outputs = []
7182
for arr_type in ["sonarr", "radarr", "readarr", "lidarr", "whisparr"]:
@@ -151,8 +162,8 @@ def __init__(self, settings, arr_type: str, base_url: str, api_key: str):
151162
self.detail_item_key = getattr(DetailItemKey, arr_type)
152163
self.detail_item_id_key = self.detail_item_key + "Id"
153164
self.detail_item_ids_key = self.detail_item_key + "Ids"
154-
self.detail_item_search_command = getattr(DetailItemSearchCommand, arr_type)
155-
165+
self.detail_item_search_command = getattr(DetailItemSearchCommand, arr_type)
166+
156167
async def _check_ui_language(self):
157168
"""Check if the UI language is set to English."""
158169
endpoint = self.api_url + "/config/ui"

0 commit comments

Comments
 (0)