import { api, stats } from "../api.js";
import { emptyChart, mixedChart } from "../charts.js";
import { emptyState, sectionHeader } from "../components.js";
import {
escapeHtml, formatCount, formatDateTime, formatNumber,
} from "../format.js";
function taskRows(tasks) {
const entries = Object.entries(tasks || {});
if (!entries.length) return emptyState("暂无任务记录", "运行一次同步、快照或发现后会写入最近结果。");
return `
系统状态
数据 ${escapeHtml(system.data_date || "—")} · 快照 ${formatCount(system.snapshot_days)} 天
采集成功${formatCount(health.ok)}
采集失败${formatCount(health.failed)}
在库${formatCount(counts.active)}
已失效${formatCount(counts.removed)}
已移出库${formatCount(counts.dropped)}
${visitPanel}
${sectionHeader("最近任务")}
${taskRows(system.tasks)}
${sectionHeader("预计下次运行")}
咻咻满粉丝数更新${running.fans ? "运行中" : escapeHtml(formatDateTime(next.fans))}
视频数据快照 + UP 信息${running.snapshot ? "运行中" : escapeHtml(formatDateTime(next.snapshot))}
新视频小时同步${running.snapshot_recent ? "运行中" : escapeHtml(formatDateTime(next.snapshot_recent))}
新视频搜索${running.discover || running.discovery ? "运行中" : escapeHtml(formatDateTime(next.discover))}
进行中显示「运行中」;空闲时按该任务上次完成时间推算下次运行,不按墙钟抢跑。新视频小时同步与全站快照互斥。
${sectionHeader("授权与备份")}
登录态${system.auth.ok === "1" ? "正常" : "异常"}
登录信息${escapeHtml(system.auth.message || "—")}
最近检查${escapeHtml(formatDateTime(system.auth.last_check))}
最近备份${system.backup.ok === "1" ? "成功" : "未完成"}
备份错误${escapeHtml(system.backup.error || "—")}
Telegram${system.telegram_enabled ? "已启用" : "未启用"}
${(system.errors || []).length ? `
${sectionHeader("最近错误")}
${system.errors.map((error) => `
${escapeHtml(error.task)}
${escapeHtml(error.error || "未知错误")}
`).join("")}
` : ""}
${sectionHeader("UP 黑名单")}
只影响未来搜索发现;已入库视频继续追踪。移除请使用 CLI 或数据库。
${(system.blacklist || []).length ? `
| mid | 昵称 | 原因 | 在库视频 |
${system.blacklist.map((item) => `
| ${item.mid} |
${escapeHtml(item.name || "—")} |
${escapeHtml(item.reason || "—")} |
${formatNumber(item.video_count || 0)} |
`).join("")}
` : emptyState("黑名单为空")}
`;
const visitChart = root.querySelector("#visit-chart");
if (visitChart) {
if (visitStats && (visitStats.total_pv || visitStats.total_uv)) {
mixedChart(visitChart, {
dates: visitStats.series.dates,
bars: visitStats.series.pv,
line: visitStats.series.uv,
barName: "PV",
lineName: "UV",
});
} else {
emptyChart(visitChart, "暂无访问数据");
}
}
}