import { EXCLUDE_TRUNCATED_CHECK_FILENAME, type ExcludeTruncatedCheckRecord, } from "./excludeTruncatedCheck"; import { sidecar, sidecarField } from "./sidecar-server"; // Parseable-but-malformed still means "excluded" — the doNotClean rule. export function coerceExcludeTruncatedCheck( value: unknown, ): ExcludeTruncatedCheckRecord { const parsed = value as Partial | null; if (typeof parsed?.setAt === "string") { return parsed as ExcludeTruncatedCheckRecord; } return { setAt: "" }; } export const excludeTruncatedCheckSidecar = sidecar( EXCLUDE_TRUNCATED_CHECK_FILENAME, sidecarField(coerceExcludeTruncatedCheck), ); export const { path: excludeTruncatedCheckPath, load: loadExcludeTruncatedCheck, } = excludeTruncatedCheckSidecar; // Presence of a valid sidecar = excluded from the truncated check. Cheap // existence check for the snapshot generator's per-dir loop. export async function isExcludedFromTruncatedCheck( videoDir: string, ): Promise { return (await loadExcludeTruncatedCheck(videoDir)) !== null; } export async function setExcludedFromTruncatedCheck( videoDir: string, enabled: boolean, note?: string, ): Promise { if (!enabled) return excludeTruncatedCheckSidecar.remove(videoDir); await excludeTruncatedCheckSidecar.write(videoDir, { setAt: new Date().toISOString(), ...(note ? { note } : {}), }); }