refactor(download): keep full-pack admission within complexity budget

This commit is contained in:
jxxghp
2026-09-26 18:00:08 +08:00
parent a3035ab1e7
commit 33da9ce65d
2 changed files with 21 additions and 16 deletions

View File

@@ -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:
"""
获取电影下载去重键,确保失败候选不会阻断后续同名资源尝试。

View File

@@ -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)