feat(subscribe): record episode download facts (#6015)

This commit is contained in:
InfinityPacer
2026-06-29 06:43:51 +08:00
committed by GitHub
parent 9b1bdb0cb2
commit 36fb82b7aa
8 changed files with 1671 additions and 298 deletions

View File

@@ -330,6 +330,7 @@ def _build_tv_context(episode_list=None):
),
torrent_info=SimpleNamespace(title="Test Show S01 2160p", site_name="TestSite"),
allowed_episodes=None,
confirmed_full_coverage=False,
)
@@ -362,6 +363,40 @@ def test_batch_download_rejects_complete_coverage_when_files_do_not_cover_target
assert downloads == []
assert lefts == no_exists
assert context.confirmed_full_coverage is False
chain.download_single.assert_not_called()
def test_batch_download_rejects_complete_coverage_when_only_missing_episodes_match(monkeypatch):
"""
完整覆盖要求目标范围全集,不能只覆盖当前缺口集。
"""
_FakeBatchTorrentHelper.episodes = [4, 5]
monkeypatch.setattr(download_module, "TorrentHelper", _FakeBatchTorrentHelper)
monkeypatch.setattr(download_module.eventmanager, "send_event", lambda *args, **kwargs: None)
chain = DownloadChain.__new__(DownloadChain)
chain.download_torrent = MagicMock(return_value=(b"torrent-content", "", ["demo.mkv"]))
chain.download_single = MagicMock(return_value="hash")
context = _build_tv_context()
no_exists = {
1: {
1: NotExistMediaInfo(
season=1,
episodes=[4, 5],
total_episode=5,
start_episode=1,
require_complete_coverage=True,
)
}
}
downloads, lefts = chain.batch_download(contexts=[context], no_exists=no_exists)
assert downloads == []
assert lefts == no_exists
assert context.confirmed_full_coverage is False
chain.download_single.assert_not_called()
@@ -462,9 +497,43 @@ def test_batch_download_accepts_complete_coverage_when_files_cover_target_range(
assert downloads == [context]
assert lefts == {}
assert context.confirmed_full_coverage is True
chain.download_single.assert_called_once()
def test_batch_download_rejects_complete_coverage_when_files_have_same_count_but_wrong_range(monkeypatch):
"""
完整覆盖按目标集号集合判断,不能让同数量的偏移局部包通过。
"""
_FakeBatchTorrentHelper.episodes = list(range(1, 45))
monkeypatch.setattr(download_module, "TorrentHelper", _FakeBatchTorrentHelper)
monkeypatch.setattr(download_module.eventmanager, "send_event", lambda *args, **kwargs: None)
chain = DownloadChain.__new__(DownloadChain)
chain.download_torrent = MagicMock(return_value=(b"torrent-content", "", ["demo.mkv"]))
chain.download_single = MagicMock(return_value="hash")
context = _build_tv_context()
no_exists = {
1: {
1: NotExistMediaInfo(
season=1,
episodes=[],
total_episode=143,
start_episode=100,
require_complete_coverage=True,
)
}
}
downloads, lefts = chain.batch_download(contexts=[context], no_exists=no_exists)
assert downloads == []
assert lefts == no_exists
assert context.confirmed_full_coverage is False
chain.download_single.assert_not_called()
def test_batch_download_accepts_complete_coverage_when_title_episodes_cover_target(monkeypatch):
"""
显式标出完整范围的候选也可满足完整覆盖任务。
@@ -494,6 +563,7 @@ def test_batch_download_accepts_complete_coverage_when_title_episodes_cover_targ
assert downloads == [context]
assert lefts == {}
assert context.confirmed_full_coverage is True
chain.download_torrent.assert_not_called()
chain.download_single.assert_called_once()
@@ -527,6 +597,7 @@ def test_batch_download_rejects_complete_coverage_when_title_episodes_are_partia
assert downloads == []
assert lefts == no_exists
assert context.confirmed_full_coverage is False
chain.download_torrent.assert_not_called()
chain.download_single.assert_not_called()
@@ -561,6 +632,7 @@ def test_batch_download_complete_coverage_ignores_allowed_episode_narrowing(monk
assert downloads == []
assert lefts == no_exists
assert context.confirmed_full_coverage is False
chain.download_torrent.assert_not_called()
chain.download_single.assert_not_called()
@@ -593,4 +665,5 @@ def test_batch_download_keeps_count_check_without_complete_coverage(monkeypatch)
assert downloads == [context]
assert lefts == {}
assert context.confirmed_full_coverage is False
chain.download_single.assert_called_once()

File diff suppressed because it is too large Load Diff