mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-11-04 22:36:34 +08:00
refactor(download): keep full-pack admission within complexity budget
This commit is contained in:
@@ -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:
|
||||
"""
|
||||
获取电影下载去重键,确保失败候选不会阻断后续同名资源尝试。
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user