feat(snapshot): refresh API video metadata; keep removed visible

入库 / 小时近新片 / 全量快照成功时以 view_detail 覆盖 title、duration、
pages、cover、bvid、up_*、pubdate 等接口字段,并照旧写七项快照。
原站失效仅标 removed,不删行、不空写元数据;列表与详情继续展示,
快照队列仍跳过 removed。
This commit is contained in:
bot-ci committed 2026-11-03 23:01:15 +08:00
1 parent 99b71c037c
commit 6c73904b25
8 files changed
+329 -34

No files matched your search

+81 -6
View File
@@ -216,14 +216,86 @@ def test_unavailable_marks_removed():
try:
add_video(repo, 1)
add_video(repo, 2)
before = repo.get_video(1)
result = service.run(date=DATE)
assert result.removed == 2
assert result.failed == 0
assert result.completed is True
assert repo.get_video(1)["status"] == "removed"
assert repo.get_video(2)["status"] == "removed"
video1 = repo.get_video(1)
video2 = repo.get_video(2)
assert video1["status"] == "removed"
assert video2["status"] == "removed"
# 失效只改 status,不得抹元数据 / 不得写空快照
assert video1["title"] == before["title"]
assert video1["duration"] == before["duration"]
assert video1["bvid"] == before["bvid"]
assert repo.get_snapshot(DATE, 1) is None
assert repo.get_snapshot(DATE, 2) is None
# removed 不再进入后续快照队列
assert 1 not in repo.video_aids_for_snapshot()
assert 2 not in repo.video_aids_for_snapshot()
finally:
db.close()
def test_snapshot_refreshes_video_metadata():
"""快照成功路径以 view_detail 覆盖 pages/duration/title 等元数据。"""
with tempfile.TemporaryDirectory() as tmp:
transport = SnapshotTransport({
1: view_for(
1, view=111, title="新标题P3", duration=3600, pages=3,
cover="http://example/new.jpg", up_name="新UP",
),
})
db, repo, service = make_service(tmp, transport, track_fans=())
try:
add_video(repo, 1)
old = repo.get_video(1)
assert old["title"] == "视频1"
assert old["duration"] == 600
assert old.get("pages") in (None, 0) or old["pages"] != 3
result = service.run_videos(date=DATE)
assert result.success == 1
video = repo.get_video(1)
assert video["title"] == "新标题P3"
assert video["duration"] == 3600
assert video["pages"] == 3
assert video["cover"] == "http://example/new.jpg"
assert video["up_name"] == "新UP"
assert video["status"] == "active"
snap = repo.get_snapshot(DATE, 1)
assert snap["view"] == 111 and snap["ok"] == 1
finally:
db.close()
def test_recent_snapshot_refreshes_metadata():
with tempfile.TemporaryDirectory() as tmp:
now = 1_800_000_000
transport = SnapshotTransport({
7: view_for(7, view=77, title="近新片加P", duration=1200, pages=2,
pubdate=now - 3600),
})
db, repo, service = make_service(tmp, transport, track_fans=())
try:
repo.upsert_from_fav(
FavResource(
aid=7, bvid="BV7", title="旧标题", up_mid=100,
up_name="UP", pubdate=now - 3600, duration=300,
cover=None, attr=0, fav_time=None, pages=1,
),
FOLDER.media_id,
was_added=True,
)
result = service.run_recent_videos(date=DATE, recent_days=2)
assert result.success == 1
video = repo.get_video(7)
assert video["title"] == "近新片加P"
assert video["duration"] == 1200
assert video["pages"] == 2
assert repo.get_snapshot(DATE, 7)["view"] == 77
# recent 不推进完成日
assert repo.kv_get("snapshot:last_completed") in (None, "")
finally:
db.close()
@@ -440,11 +512,12 @@ def test_run_recent_videos_refreshes_without_completion_markers():
"""小时任务只刷新近窗新片,不写完成日 / 备份。"""
clock = 1_800_000_000
with tempfile.TemporaryDirectory() as tmp:
# view_for 须带与库内一致的 pubdate,否则快照回写会把近窗片挤出窗口
transport = SnapshotTransport({
1: view_for(1, view=111),
2: view_for(2, view=222),
3: view_for(3, view=333),
4: view_for(4, view=444),
1: view_for(1, view=111, pubdate=clock - 3600),
2: view_for(2, view=222, pubdate=clock - 86400),
3: view_for(3, view=333, pubdate=clock - 10 * 86400),
4: view_for(4, view=444, pubdate=clock - 10 * 86400),
})
db, repo, service = make_service(tmp, transport, track_fans=())
try:
@@ -776,6 +849,8 @@ def main():
test_snapshot_success_resume_and_force()
test_resume_skips_ok_and_retries_failed()
test_unavailable_marks_removed()
test_snapshot_refreshes_video_metadata()
test_recent_snapshot_refreshes_metadata()
test_other_error_writes_failed_placeholder()
test_fan_failure_placeholder()
test_auth_invalid_is_warned_but_snapshot_continues()