控制平面 · ARM Linux 开发板
无人直播控制中心
ShellCrash 负责代理上网;本机 FFmpeg 处理推流或 HDMI;Neko(Docker Chromium)或本机 Chromium 负责浏览器侧;开发板通过 USB 双头线 ADB 控制 AOSP。各模块独立,可分别启停。
{tr( - "内嵌若黑屏:多为 WebSocket 未连上或服务未启动。请先确认「系统服务」里 android_panel 在线,并尝试新标签打开;Neko(Chromium)在 ENABLE_NEKO=1 且容器运行后一般为 9200 端口。", - "Black iframe: often WebSocket or service down. Check android_panel in Services, try opening in a new tab; Neko Chromium is often :9200 when ENABLE_NEKO=1 and the container is up.", + nekoPortsLabel + ? `内嵌若黑屏:多为 WebSocket 未连上或服务未启动。请先确认「系统服务」里 android_panel 在线,并尝试新标签打开;Neko(Chromium)实例通常为 ${nekoPortsLabel}。` + : "内嵌若黑屏:多为 WebSocket 未连上或服务未启动。请先确认「系统服务」里 android_panel 在线,并尝试新标签打开;Neko(Chromium)在 ENABLE_NEKO=1 且容器运行后一般为 9200 端口。", + nekoPortsLabel + ? `Black iframe: often WebSocket or service down. Check android_panel in Services, try opening in a new tab; Neko Chromium instances are usually on ${nekoPortsLabel}.` + : "Black iframe: often WebSocket or service down. Check android_panel in Services, try opening in a new tab; Neko Chromium is often :9200 when ENABLE_NEKO=1 and the container is up.", )}
diff --git a/d2ypp2/web-console/components/live-product/LiveControlApp.tsx b/d2ypp2/web-console/components/live-product/LiveControlApp.tsx index f5bd612..71c9afd 100644 --- a/d2ypp2/web-console/components/live-product/LiveControlApp.tsx +++ b/d2ypp2/web-console/components/live-product/LiveControlApp.tsx @@ -34,6 +34,7 @@ import { LiveTiktokHdmiView } from "@/components/live-product/LiveTiktokHdmiView import type { PortalNavTarget } from "@/components/live-product/LivePipelineStrip"; import { LiveYoutubeUnmannedView } from "@/components/live-product/LiveYoutubeUnmannedView"; import { fetchJsonResponse } from "@/lib/fetchJson"; +import { extractNekoBrowserLinks, formatNekoPorts, type NekoBrowserLink } from "@/lib/nekoLinks"; import { normalizeBrowserReachableHttpUrl } from "@/lib/panelUrls"; type Lang = "zh" | "en"; @@ -72,6 +73,13 @@ type HubDashboard = { platform?: string; ips?: string[]; quick_links?: Record+ {t( + "一键脚本完成后,本机 API、局域网入口、反向代理与 mDNS 的可用性检查。", + "Post-install checks for loopback API, LAN access, reverse proxy, and mDNS.", + )} +
++ {t("验收摘要", "Acceptance summary")} +
++ {deployCheck.pass_count ?? 0}/{deployCheck.total_count ?? 0} + + {t("已通过", "checks passed")} + +
++ {t("必需项", "Required")}: {deployCheck.required_total ?? 0} · mDNS{" "} + {deployCheck.mdns_enabled ? t("已启用", "enabled") : t("已关闭", "disabled")} · edge{" "} + {deployCheck.live_edge_enabled ? t("已启用", "enabled") : t("已关闭", "disabled")} +
++ {deployCheck.failing_checks?.length ? t("失败项", "Failing checks") : t("当前状态", "Current state")} +
+ {deployCheck.failing_checks?.length ? ( ++ {t("必需检查已全部通过,可直接用浏览器面板交付。", "All required checks pass; browser control plane is ready.")} +
+ )} + {(deployCheck.hints || []).length ? ( +{dash.stack.neko_login.note_zh || - t("Neko Chromium :9200 使用下列账号策略。", "Neko Chromium :9200 uses the policy below.")} + t( + nekoPortsLabel ? `Neko Chromium ${nekoPortsLabel} 使用下列账号策略。` : "Neko Chromium 多实例使用下列账号策略。", + nekoPortsLabel ? `Neko Chromium ${nekoPortsLabel} uses the policy below.` : "Neko Chromium instances use the policy below.", + )}
{t( @@ -986,6 +1138,22 @@ export default function LiveControlApp() { "Use two fields: display name is free-form; password must match NEKO_* (default 12345678). Wrong password looks like infinite loading.", )}
+ {nekoLinks.length ? ( +{t("昵称示例", "Display Name Example")}
@@ -1178,9 +1346,23 @@ export default function LiveControlApp() { const p = dash.probes?.neko; const tcpOk = p?.tcp?.reachable; const http = p?.http; + const instances = p?.instances || []; + const runningCount = p?.running_count ?? instances.filter((item) => item.tcp?.reachable).length; + const requiredCount = p?.required_count ?? instances.length; return (Neko Chromium
+Neko Chromium
+ 0 + ? "bg-emerald-500/20 text-emerald-200 ring-1 ring-emerald-500/30" + : "bg-rose-500/15 text-rose-200 ring-1 ring-rose-500/25" + }`} + > + {runningCount}/{requiredCount || "—"} {t("在线", "online")} + +{t( "Docker 内 Chromium(非 Chrome 品牌);arm64/x86 同一镜像。", @@ -1198,6 +1380,35 @@ export default function LiveControlApp() { ? `${p.tcp.latency_ms} ms` : "—"}
+ {instances.length ? ( ++ Neko {item.id ?? "?"} +
++ :{item.port ?? "—"} · TCP {item.tcp?.reachable ? "OK" : "—"} · HTTP{" "} + {item.http?.http_code ?? "—"} +
+{http.error}
) : null} diff --git a/d2ypp2/web-console/components/live-product/LiveYoutubeUnmannedView.tsx b/d2ypp2/web-console/components/live-product/LiveYoutubeUnmannedView.tsx index 43f2e22..1c8a676 100644 --- a/d2ypp2/web-console/components/live-product/LiveYoutubeUnmannedView.tsx +++ b/d2ypp2/web-console/components/live-product/LiveYoutubeUnmannedView.tsx @@ -12,6 +12,12 @@ import { parseYoutubeStreamKeySuffix, type YoutubeIniFields, } from "@/lib/youtubeConfigUtils"; +import { + extractNekoBrowserLinks, + formatNekoPorts, + resolveNekoBrowserLink, + type QuickLinkMap, +} from "@/lib/nekoLinks"; import type { PortalNavTarget } from "@/components/live-product/LivePipelineStrip"; import { LivePipelineStrip } from "@/components/live-product/LivePipelineStrip"; import { LiveProcessLiveLogCard } from "@/components/live-product/LiveProcessLiveLogCard"; @@ -131,7 +137,6 @@ const PRO_PM2_RESERVED = new Set(["tiktok", "obs", "web"]); /** UI 暂时隐藏「多频道 Pro」切换(DOM 与逻辑保留,改 false 即可恢复) */ const HIDE_YOUTUBE_MULTI_PRO_TOGGLE = false; -type QuickLinkMap = Record+ {t("Neko 实例", "Neko instances")}: {nekoPortsLabel} +
+ ) : null}控制平面 · ARM Linux 开发板
ShellCrash 负责代理上网;本机 FFmpeg 处理推流或 HDMI;Neko(Docker Chromium)或本机 Chromium 负责浏览器侧;开发板通过 USB 双头线 ADB 控制 AOSP。各模块独立,可分别启停。
控制平面 · ARM Linux 开发板
ShellCrash 负责代理上网;本机 FFmpeg 处理推流或 HDMI;Neko(Docker Chromium)或本机 Chromium 负责浏览器侧;开发板通过 USB 双头线 ADB 控制 AOSP。各模块独立,可分别启停。
控制平面 · ARM Linux 开发板
ShellCrash 负责代理上网;本机 FFmpeg 处理推流或 HDMI;Neko(Docker Chromium)或本机 Chromium 负责浏览器侧;开发板通过 USB 双头线 ADB 控制 AOSP。各模块独立,可分别启停。
控制平面 · ARM Linux 开发板
ShellCrash 负责代理上网;本机 FFmpeg 处理推流或 HDMI;Neko(Docker Chromium)或本机 Chromium 负责浏览器侧;开发板通过 USB 双头线 ADB 控制 AOSP。各模块独立,可分别启停。
live.local · 夜间 · 前台自动刷新 · 最后同步 未同步
直播工作室 · 3D
CPU 1m
…
负载均值
内存
…
/ —
磁盘可用
…
/ —
服务在线
…
基础服务层
运行时间
…
自开机
live.local · 夜间 · 前台自动刷新 · 最后同步 未同步
直播工作室 · 3D
CPU 1m
…
负载均值
内存
…
/ —
磁盘可用
…
/ —
服务在线
…
基础服务层
运行时间
…
自开机
控制平面 · ARM Linux 开发板
ShellCrash 负责代理上网;本机 FFmpeg 处理推流或 HDMI;Neko(Docker Chromium)或本机 Chromium 负责浏览器侧;开发板通过 USB 双头线 ADB 控制 AOSP。各模块独立,可分别启停。
控制平面 · ARM Linux 开发板
ShellCrash 负责代理上网;本机 FFmpeg 处理推流或 HDMI;Neko(Docker Chromium)或本机 Chromium 负责浏览器侧;开发板通过 USB 双头线 ADB 控制 AOSP。各模块独立,可分别启停。