From 33da9ce65d5020a8e087584a3321c1ff353c1921 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sat, 26 Sep 2026 18:00:08 +0800 Subject: [PATCH] refactor(download): keep full-pack admission within complexity budget --- app/application/download/selection.py | 14 ++++++++++++++ app/chain/download/batch.py | 23 +++++++---------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/app/application/download/selection.py b/app/application/download/selection.py index 2e731c6f9..08c7a45a8 100644 --- a/app/application/download/selection.py +++ b/app/application/download/selection.py @@ -144,6 +144,20 @@ def apply_allowed_episodes(need_episodes: Set[int], context: Context) -> Set[int return effective +def allows_full_pack(episodes: Set[int], context: Context) -> bool: + """整包下载前确认包内每一集均获当前候选的允许集放行。""" + return apply_allowed_episodes(episodes, context) == episodes + + +def allows_full_season( + seasons: List[int], required_episodes: Set[int], context: Context, +) -> bool: + """整季候选仅在无按集约束,或单季目标全集均获准时整体下载。""" + if context.allowed_episodes is None: + return True + return len(seasons) == 1 and bool(required_episodes) and allows_full_pack(required_episodes, context) + + def get_movie_download_key(context: Context) -> str: """ 获取电影下载去重键,确保失败候选不会阻断后续同名资源尝试。 diff --git a/app/chain/download/batch.py b/app/chain/download/batch.py index 21ce4eca1..46453cf3c 100644 --- a/app/chain/download/batch.py +++ b/app/chain/download/batch.py @@ -231,13 +231,9 @@ class DownloadBatchOwner(_DownloadOwnerBase): # 种子季是需要季或者子集 if set(torrent_season).issubset(set(need_season)): # 分集洗版的整包只有全部目标集均可升级时才可整体下载;多季包无法用单季允许集证明安全。 - if context.allowed_episodes is not None: - if len(torrent_season) != 1: - continue - required_episodes = __get_required_episodes(need_mid, torrent_season[0]) - if not required_episodes or __apply_allowed_episodes(required_episodes, context) \ - != required_episodes: - continue + required_episodes = __get_required_episodes(need_mid, torrent_season[0]) + if not _selection.allows_full_season(torrent_season, required_episodes, context): + continue complete_coverage_matched = False if len(torrent_season) == 1: # 只有一季的可能是命名错误,需要打开种子鉴别,只有实际集数大于等于总集数才下载 @@ -267,9 +263,7 @@ class DownloadBatchOwner(_DownloadOwnerBase): if not torrent_episodes: continue torrent_episodes_set = set(torrent_episodes) - if context.allowed_episodes is not None \ - and __apply_allowed_episodes(torrent_episodes_set, context) \ - != torrent_episodes_set: + if not _selection.allows_full_pack(torrent_episodes_set, context): continue # 更新集数范围 begin_ep = min(torrent_episodes) @@ -394,12 +388,9 @@ class DownloadBatchOwner(_DownloadOwnerBase): if __requires_complete_coverage(missing_info): # 完整覆盖任务要求候选集数覆盖目标范围,允许资源包含范围外的额外集。 required_episodes = __get_required_episodes(need_mid, season_number) - match_episodes = required_episodes.issubset(candidate_episodes) \ - if required_episodes else False - if match_episodes and context.allowed_episodes is not None: - # 完整覆盖不能绕过按集准入,整包内每一集都必须获准。 - match_episodes = __apply_allowed_episodes(candidate_episodes, context) \ - == candidate_episodes + match_episodes = bool(required_episodes) \ + and required_episodes.issubset(candidate_episodes) \ + and _selection.allows_full_pack(candidate_episodes, context) else: # 普通缺集下载保持原语义:候选自身必须是所需集的子集。 match_episodes = candidate_episodes.issubset(effective_need)