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:
1 parent
99b71c037c
commit
6c73904b25
8 files changed
+329
-34
No files matched your search
+81
-6
@@ -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()
|
||||
|
||||
Reference in new issue
Block a user