feat(web): add duration efficiency rankings and about payload
This commit is contained in:
1 parent
519fc39fca
commit
5a656d42a8
4 files changed
+308
-10
No files matched your search
@@ -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__":
|
||||
|
||||
Reference in new issue
Block a user