74 lines
2.8 KiB
JavaScript
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);
|
|
};
|
|
},
|
|
});
|
|
|