Files
pmarmotte2-Comfyui-Sequenti…/web/js/load_video_sequentially_preview.js

74 lines
2.8 KiB
JavaScript

import { app } from "/scripts/app.js";
import { api } from "/scripts/api.js";
function applySegmentPreview(node, previewParams) {
if (!node || !previewParams) return;
const previewWidget = node.widgets?.find((w) => w.name === "videopreview" || w.name === "preview");
if (!previewWidget) return;
if (typeof previewWidget.value !== "object" || previewWidget.value === null) {
previewWidget.value = {};
}
if (typeof previewWidget.value.params !== "object" || previewWidget.value.params === null) {
previewWidget.value.params = {};
}
Object.assign(previewWidget.value.params, previewParams);
const params = new URLSearchParams(previewWidget.value.params);
const vhsUrl = api.apiURL("/viewvideo?" + params.toString());
const fallbackUrl = api.apiURL("/view?" + params.toString());
// Prefer VHS/VideoHelperSuite preview backend if available.
if (previewWidget.videoEl && typeof previewWidget.videoEl.src === "string") {
previewWidget.videoEl.src = vhsUrl;
previewWidget.videoEl.hidden = false;
if (previewWidget.imgEl) previewWidget.imgEl.hidden = true;
} else if (previewWidget.element && "src" in previewWidget.element) {
previewWidget.element.src = vhsUrl;
} else if (typeof previewWidget.callback === "function") {
previewWidget.callback();
}
// If /viewvideo is unavailable in a given setup, the browser will fail the resource.
// Keep regular preview behavior available through widget callback/fallback.
if (typeof previewWidget.callback === "function") {
try {
previewWidget.callback();
} catch (_) {
if (previewWidget.videoEl) {
previewWidget.videoEl.src = fallbackUrl;
}
}
}
}
app.registerExtension({
name: "LoadVideoSequentially.SegmentPreview",
async beforeRegisterNodeDef(nodeType, nodeData) {
if (nodeData?.name !== "LoadVideoSequentially") return;
const originalOnExecuted = nodeType.prototype.onExecuted;
nodeType.prototype.onExecuted = function (message) {
if (typeof originalOnExecuted === "function") {
originalOnExecuted.apply(this, arguments);
}
const gifEntry = message?.gifs?.[0];
if (!gifEntry) return;
const params = {
filename: gifEntry.filename,
subfolder: gifEntry.subfolder ?? "",
type: gifEntry.type ?? "input",
format: gifEntry.format ?? "video/mp4",
start_time: gifEntry.start_time ?? 0,
frame_load_cap: gifEntry.frame_load_cap ?? 0,
force_rate: gifEntry.force_rate ?? 0,
};
applySegmentPreview(this, params);
};
},
});