fix(analytics): shrink video efficiency and gate noisy boards by views
This commit is contained in:
1 parent
e7034cfb84
commit
bc3bef0743
12 files changed
+125
-40
No files matched your search
@@ -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"),
|
||||
):
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user