feat(db): add video pages and up follower snapshot schema

This commit is contained in:
kairee committed 2026-11-01 11:14:36 +08:00
1 parent 707ed7d7d7
commit 4942d1d161
10 files changed
+521 -13

No files matched your search

+56 -1
View File
@@ -18,7 +18,8 @@ F1 = FolderConfig(year=2025, media_id=4451053851, title="2025")
F2 = FolderConfig(year=2026, media_id=3700023351, title="2026")
def resource(aid, *, attr=0, up_mid=100, title="视频", bvid=None, fav_time=None):
def resource(aid, *, attr=0, up_mid=100, title="视频", bvid=None, fav_time=None,
pages=2):
return FavResource(
aid=aid,
bvid=bvid or f"BV{aid}",
@@ -30,6 +31,7 @@ def resource(aid, *, attr=0, up_mid=100, title="视频", bvid=None, fav_time=Non
cover="http://example/cover.jpg",
attr=attr,
fav_time=fav_time,
pages=pages,
)
@@ -54,6 +56,7 @@ def test_upsert_and_folder_resource():
assert video["folder_id"] == F1.media_id
assert video["source"] == f"fav:{F1.media_id}"
assert video["first_seen"] == 1_800_000_000
assert video["pages"] == 2
assert repo.folder_active_aids(F1.media_id) == {1}
# 幂等:重复导入不新增行、不改 first_seen
@@ -293,6 +296,57 @@ def test_pending_snapshot_aids():
db.close()
def test_up_follower_snapshot_and_backfill():
with tempfile.TemporaryDirectory() as tmp:
db, repo = setup(tmp)
try:
repo.upsert_from_fav(resource(1, up_mid=100), F1.media_id, was_added=True)
repo.upsert_from_fav(resource(2, up_mid=100), F1.media_id, was_added=True)
repo.upsert_from_fav(resource(3, up_mid=200), F1.media_id, was_added=True)
missing = {row["up_mid"] for row in repo.up_mids_missing_follower()}
assert missing == {100, 200}
now = 1_800_000_000
assert repo.apply_up_follower(
mid=100, name="UP", follower=1234, following=5, now=now
) == 2
first = repo.get_video(1)
assert first["up_follower"] == 1234
assert first["up_follower_at"] == now
assert first["up_follower_backfilled"] == 0
profile = repo.get_up_profile(100)
assert profile["follower_first"] == 1234
assert profile["follower_latest"] == 1234
assert {
row["up_mid"] for row in repo.up_mids_missing_follower()
} == {200}
# 同一 UP 后来新增的视频记录当下的粉丝快照,不覆盖旧视频
repo.upsert_from_fav(resource(4, up_mid=100), F1.media_id, was_added=True)
repo.apply_up_follower(
mid=100, name="UP", follower=2000, following=6, now=now + 60
)
assert repo.get_video(4)["up_follower"] == 2000
assert repo.get_video(1)["up_follower"] == 1234
profile = repo.get_up_profile(100)
assert profile["follower_first"] == 1234
assert profile["follower_latest"] == 2000
# 回填只补空值,并标记 backfilled
assert repo.apply_up_follower(
mid=200, name="UP2", follower=88, now=now + 120, backfilled=True
) == 1
assert repo.get_video(3)["up_follower"] == 88
assert repo.get_video(3)["up_follower_backfilled"] == 1
coverage = repo.up_follower_coverage()
assert coverage == {
"total": 4, "covered": 4, "missing": 0, "ups_covered": 2,
}
finally:
db.close()
def main():
test_upsert_and_folder_resource()
test_invalid_attr_and_missing()
@@ -305,6 +359,7 @@ def main():
test_primary_folder_is_order_independent()
test_dropped_invalid_preserves_original_title()
test_pending_snapshot_aids()
test_up_follower_snapshot_and_backfill()
print("OK: 收藏夹/视频状态机与黑名单测试全部通过")