Files
MajoorWaldi-ComfyUI-Majoor-…/js/utils/mediaFps.js
T
MajoorWaldi dc72be0139 feat: enhance JS testing and linting setup
- Added coverage reporting for Vitest with configuration in vitest.config.mjs
- Updated package.json to include new scripts for JS coverage, linting, and formatting
- Modified run_quality_gate.py to allow skipping ESLint and Prettier checks
- Introduced .prettierrc for consistent code formatting
- Created .prettierignore to exclude specific files and directories from formatting
2026-03-28 14:14:28 +01:00

79 lines
2.5 KiB
JavaScript

export function parseFpsValue(value) {
try {
const n = Number(value);
if (Number.isFinite(n) && n > 0) return n;
const s = String(value || "").trim();
if (!s) return null;
if (s.includes("/")) {
const [a, b] = s.split("/");
const na = Number(a);
const nb = Number(b);
if (Number.isFinite(na) && Number.isFinite(nb) && nb !== 0) {
const fps = na / nb;
return Number.isFinite(fps) && fps > 0 ? fps : null;
}
}
const f = Number.parseFloat(s);
return Number.isFinite(f) && f > 0 ? f : null;
} catch {
return null;
}
}
export function readAssetFps(asset) {
try {
const raw = asset?.metadata_raw || {};
const ff = raw?.raw_ffprobe || {};
const vs = ff?.video_stream || {};
return (
parseFpsValue(asset?.fps) ??
parseFpsValue(raw?.fps) ??
parseFpsValue(raw?.frame_rate) ??
parseFpsValue(vs?.avg_frame_rate) ??
parseFpsValue(vs?.r_frame_rate)
);
} catch {
return null;
}
}
export function readAssetFrameCount(asset, fps) {
try {
const raw = asset?.metadata_raw || {};
const ff = raw?.raw_ffprobe || {};
const vs = ff?.video_stream || {};
const direct =
Number(asset?.frame_count) ||
Number(raw?.frame_count) ||
Number(raw?.frames) ||
Number(vs?.nb_frames) ||
Number(vs?.nb_read_frames) ||
0;
if (Number.isFinite(direct) && direct > 0) return Math.floor(direct);
const dur = Number(asset?.duration ?? raw?.duration ?? vs?.duration);
if (Number.isFinite(dur) && dur > 0 && Number.isFinite(fps) && fps > 0) {
return Math.max(1, Math.round(dur * fps));
}
} catch (e) {
console.debug?.(e);
}
return null;
}
export function formatFps(fps) {
const n = Number(fps);
if (!Number.isFinite(n) || n <= 0) return "";
if (Math.abs(n - Math.round(n)) < 0.001) return `${Math.round(n)} fps`;
return `${n.toFixed(3).replace(/\.?0+$/, "")} fps`;
}
export function normalizeVideoFps(value, fallback = 30) {
const parsed = parseFpsValue(value);
if (parsed != null) return Math.max(1, Math.round(parsed * 1000) / 1000);
const fallbackParsed = parseFpsValue(fallback);
if (fallbackParsed != null) return Math.max(1, Math.round(fallbackParsed * 1000) / 1000);
return 30;
}