feat(db): add video pages and up follower snapshot schema
This commit is contained in:
1 parent
707ed7d7d7
commit
4942d1d161
10 files changed
+521
-13
No files matched your search
@@ -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: 收藏夹/视频状态机与黑名单测试全部通过")
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user