import { ffprobe, type ProbeResult, redactAlistText } from "@umt/adapters"; import { vrawUrl } from "./vfs.ts"; import { parseVPath } from "./vpath.ts"; // 远端文件的 ffprobe(docs/design/storage-alist.md §7):不下载,直接对签名直链探测,ffprobe 只读容器头与少量包(HTTP Range)。 // 拿不到直链或探测失败返回 unknown(不阻塞,同本地 ffprobe 失败的口径)。直链进错误信息前脱敏。 export async function probeAny( path: string, local: (p: string) => Promise = (p) => ffprobe(p), ): Promise { if (!parseVPath(path)) return local(path); let url: string; try { url = await vrawUrl(path); } catch (e) { return { status: "unknown", reason: "probe_failed", message: redactAlistText(String((e as Error)?.message ?? e)) }; } const r = await ffprobe(url, { inputArgs: ["-rw_timeout", "30000000"], timeoutMs: 60_000 }); if (r.status === "unknown" && r.message) return { ...r, message: redactAlistText(r.message.split(url).join("<直链>")) }; return r; }