feat(web): include removed in visible stats; cover bang badge

站内展示/统计统一 VISIBLE(含 removed):热度、UP 列表、总览
active_ups/初导入计数、说明页粉丝覆盖、黑名单视频数。采集队列仍
只 active/unfaved。失效片封面右上角感叹号徽标,点击/tap 提示
「该视频已失效」;手动/候选入库仍可复活 removed→active。
This commit is contained in:
bot-ci committed 2026-11-03 23:45:44 +08:00
1 parent 6c73904b25
commit 0c660c6474
7 files changed
+122 -17

No files matched your search

+8 -7
View File
@@ -44,9 +44,10 @@ from ..timeutil import (
)
from .cache import DASHBOARD_CACHE, TTL_FANS, TTL_VIDEOS, build_cache_key
TRACKED_STATUSES = ("active", "unfaved")
# 站内列表可见:含原站失效 removed(继续展示、badge 可标 status-removed);不含人工 dropped
TRACKED_STATUSES = ("active", "unfaved") # 采集队列口径;站内展示勿用
# 站内展示/统计:含原站失效 removed(继续展示);不含人工 dropped
VISIBLE_STATUSES = ("active", "unfaved", "removed")
_VISIBLE_IN = ",".join(f"'{s}'" for s in VISIBLE_STATUSES)
VIDEO_SORTS = {
"heat", "view", "like", "coin", "favorite", "share", "reply", "danmaku",
"interaction", "growth", "growth_rate", "added", "published",
@@ -342,7 +343,7 @@ class DashboardQueries:
def _videos(
conn: sqlite3.Connection,
*,
statuses: Sequence[str] = TRACKED_STATUSES,
statuses: Sequence[str] = VISIBLE_STATUSES,
folder_id: int | None = None,
q: str | None = None,
q_fields: Sequence[str] | None = None,
@@ -611,7 +612,7 @@ class DashboardQueries:
if first_seen_ts is not None:
initial_import_count = int(conn.execute(
"SELECT COUNT(*) FROM video WHERE first_seen = ? "
"AND status IN ('active','unfaved')",
f"AND status IN ({_VISIBLE_IN})",
(int(first_seen_ts),),
).fetchone()[0])
@@ -682,7 +683,7 @@ class DashboardQueries:
"total": sum(by_status.values()),
"active_ups": int(conn.execute(
"SELECT COUNT(DISTINCT up_mid) FROM video "
"WHERE status IN ('active','unfaved') AND up_mid IS NOT NULL"
f"WHERE status IN ({_VISIBLE_IN}) AND up_mid IS NOT NULL"
).fetchone()[0]),
"candidates_pending": candidate_pending,
"candidates_total": candidate_total,
@@ -1755,7 +1756,7 @@ class DashboardQueries:
SELECT COUNT(*) AS total,
SUM(CASE WHEN up_follower IS NOT NULL THEN 1 ELSE 0 END) AS covered
FROM video
WHERE status IN ('active', 'unfaved') AND up_mid IS NOT NULL
WHERE status IN ('active', 'unfaved', 'removed') AND up_mid IS NOT NULL
"""
).fetchone()
follower_total = int(follower_row["total"] or 0)
@@ -1967,7 +1968,7 @@ class DashboardQueries:
"""
SELECT b.*,
(SELECT COUNT(*) FROM video v WHERE v.up_mid = b.mid
AND v.status IN ('active','unfaved')) AS video_count
AND v.status IN ('active','unfaved','removed')) AS video_count
FROM up_blacklist b ORDER BY b.created_at, b.mid
"""
).fetchall()