fix(analytics): shrink video efficiency and gate noisy boards by views

This commit is contained in:
kairee committed 2026-11-01 12:25:27 +08:00
1 parent e7034cfb84
commit bc3bef0743
12 files changed
+125 -40

No files matched your search

+8 -4
View File
@@ -133,27 +133,31 @@ def test_analytics_defaults_and_validation():
cfg = load_config(path, env={})
assert cfg.analytics.min_duration_seconds == 600
assert cfg.analytics.maturity_days == 2
assert cfg.analytics.min_view_for_efficiency == 0
assert cfg.analytics.min_view_for_ranking == 2000
assert cfg.analytics.video_shrink_minutes == 60
assert cfg.analytics.shrink_minutes is None
data = base_config()
data["analytics"] = {
"min_duration_seconds": 300,
"maturity_days": 7,
"min_view_for_efficiency": 100,
"min_view_for_ranking": 100,
"video_shrink_minutes": 30,
"shrink_minutes": 90,
}
write(path, data)
cfg = load_config(path, env={})
assert cfg.analytics.min_duration_seconds == 300
assert cfg.analytics.maturity_days == 7
assert cfg.analytics.min_view_for_efficiency == 100
assert cfg.analytics.min_view_for_ranking == 100
assert cfg.analytics.video_shrink_minutes == 30
assert cfg.analytics.shrink_minutes == 90
for bad, hint in (
({"min_duration_seconds": -1}, "min_duration_seconds"),
({"maturity_days": -1}, "maturity_days"),
({"min_view_for_efficiency": -1}, "min_view_for_efficiency"),
({"min_view_for_ranking": -1}, "min_view_for_ranking"),
({"video_shrink_minutes": -1}, "video_shrink_minutes"),
({"shrink_minutes": 0}, "shrink_minutes"),
({"shrink_minutes": "auto"}, "shrink_minutes"),
):
+19 -8
View File
@@ -65,8 +65,8 @@ def test_video_listing_filters_and_sorting():
heat = q.list_videos(sort="heat")
aids = [item["aid"] for item in heat["items"]]
assert 104 not in aids, "removed 视频不应进入榜单"
assert aids[0] == 102, aids
assert heat["items"][0]["heat"] > heat["items"][-1]["heat"]
# 综合热度榜应用最小播放门槛 2000:101(1200)与 103(120)被排除
assert aids == [102], aids
assert heat["items"][0]["heat_percentile"] == 100.0
views = q.list_videos(sort="view")
@@ -362,18 +362,27 @@ def test_duration_efficiency_queries():
DASHBOARD_CACHE.clear()
efficiency = q.list_videos(sort="efficiency")
assert [item["aid"] for item in efficiency["items"]] == [102, 101]
assert [item["aid"] for item in efficiency["items"]] == [102]
first = efficiency["items"][0]
assert first["duration"] == 7200
assert first["content_hours"] == 2.0
assert first["efficiency"] == 2600.0
assert first["efficiency"] == 2600.0 # 原始播放/小时,详情页口径
assert abs(first["efficiency_score"] - 2207.5) < 0.1
assert efficiency["duration_filter"] == {
"min_duration_seconds": 600, "maturity_days": 2, "min_view": 0,
"min_duration_seconds": 600, "maturity_days": 2,
"min_view": 2000, "shrink_minutes": 60,
}
# 播放不足 2000 的视频不进入效率榜(101 只有 1200)
assert all(item["aid"] != 101 for item in efficiency["items"])
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
assert [item["aid"] for item in interaction["items"]] == [102]
assert abs(interaction["items"][0]["interaction_efficiency_score"] - 159.36) < 0.1
# 综合热度榜也应用最小播放门槛
heat = q.list_videos(sort="heat")
assert [item["aid"] for item in heat["items"]] == [102]
# 时长缺失不计入时长效率榜
ups = q.list_ups(sort="efficiency")
@@ -405,6 +414,7 @@ def test_duration_efficiency_queries():
assert fresh["items"] == []
assert fresh["available"] is False
assert "发布满 2 天" in fresh["reason"]
assert "播放 ≥ 2000" in fresh["reason"]
finally:
db.close()
@@ -422,7 +432,8 @@ def test_about_payload():
assert about["analytics"] == {
"min_duration_seconds": 600,
"maturity_days": 2,
"min_view_for_efficiency": 0,
"min_view_for_ranking": 2000,
"video_shrink_minutes": 60,
"shrink_minutes": None,
}
assert about["heat_weights"]["view"] == 0.30