feat(web): add duration efficiency rankings and about payload

This commit is contained in:
kairee committed 2026-11-01 11:21:42 +08:00
1 parent 519fc39fca
commit 5a656d42a8
4 files changed
+308 -10

No files matched your search

+79 -1
View File
@@ -346,6 +346,82 @@ def test_fans_candidates_system_and_export():
db.close()
def test_duration_efficiency_queries():
with tempfile.TemporaryDirectory() as tmp:
db, q = setup(tmp)
try:
db.write(lambda conn: conn.executemany(
"UPDATE video SET duration = ?, pubdate = ? WHERE aid = ?",
[
(9000, 1_756_684_800, 101), # 2025-09-01 前后,2.5 小时
(7200, 1_756_771_200, 102), # 2 小时
(300, 1_756_857_600, 103), # 5 分钟,应被排除
],
))
DASHBOARD_CACHE.clear()
efficiency = q.list_videos(sort="efficiency")
assert [item["aid"] for item in efficiency["items"]] == [102, 101]
first = efficiency["items"][0]
assert first["duration"] == 7200
assert first["content_hours"] == 2.0
assert first["efficiency"] == 2600.0
assert efficiency["duration_filter"] == {
"min_duration_seconds": 600, "maturity_days": 14, "min_view": 0,
}
interaction = q.list_videos(sort="interaction_efficiency")
assert [item["aid"] for item in interaction["items"]] == [102, 101]
assert interaction["items"][0]["interaction_efficiency"] == 181.0
# 时长缺失不计入时长效率榜
ups = q.list_ups(sort="efficiency")
assert ups["sort"] == "efficiency"
up_a = next(item for item in ups["items"] if item["up_mid"] == 1)
assert up_a["total_duration"] == int(9000 + 7200)
assert up_a["content_hours"] == 4.5
assert up_a["views_per_hour"] == round(6400 / 4.5, 1)
assert up_a["efficiency"] is not None
assert up_a["interaction_efficiency"] is not None
by_duration = q.list_ups(sort="duration")
assert [item["up_mid"] for item in by_duration["items"]][0] == 1
db.write(lambda conn: conn.execute(
"UPDATE video SET duration = NULL WHERE aid = 101"
))
DASHBOARD_CACHE.clear()
missing = q.list_videos(sort="efficiency")
assert [item["aid"] for item in missing["items"]] == [102]
finally:
db.close()
def test_about_payload():
with tempfile.TemporaryDirectory() as tmp:
db, q = setup(tmp)
try:
about = q.about()
assert about["data_date"] == DATES[-1]
assert about["snapshot_days"] == 3
assert about["snapshot_first_date"] == DATES[0]
assert about["schema_version"] == 4
assert about["analytics"] == {
"min_duration_seconds": 600,
"maturity_days": 14,
"min_view_for_efficiency": 0,
"shrink_minutes": None,
}
assert about["heat_weights"]["view"] == 0.30
assert about["followers"]["videos_total"] == 3
assert about["followers"]["videos_covered"] == 0
assert about["followers"]["videos_missing"] == 3
assert about["folders"][0]["media_id"] == 3700023351
assert about["preview"] is False
finally:
db.close()
def main_test():
test_overview()
test_video_listing_filters_and_sorting()
@@ -353,9 +429,11 @@ def main_test():
test_video_detail_and_trend()
test_up_queries()
test_query_cache_invalidation()
test_duration_efficiency_queries()
test_about_payload()
test_fans_custom_range_modes()
test_fans_candidates_system_and_export()
print("OK: Web 查询层总览/榜单/详情/UP/粉丝/候选/系统测试全部通过")
print("OK: Web 查询层总览/榜单/详情/UP/时长效率/粉丝/候选/系统测试全部通过")
if __name__ == "__main__":