Files
x0x0b-ComfyUI-PromptHistory…/web/lib/metadata.js
T

144 lines
4.9 KiB
JavaScript

export function extractMetadata(entry) {
if (!entry) return {};
const params = {};
let promptData = null;
if (entry.metadata) {
if (entry.metadata.comfyui_prompt) {
promptData = entry.metadata.comfyui_prompt;
} else if (entry.metadata.prompt) {
try {
promptData =
typeof entry.metadata.prompt === "string"
? JSON.parse(entry.metadata.prompt)
: entry.metadata.prompt;
} catch (e) {}
}
let workflowData = null;
if (entry.metadata.comfyui_workflow) {
workflowData = entry.metadata.comfyui_workflow;
} else if (entry.metadata.workflow) {
try {
workflowData =
typeof entry.metadata.workflow === "string"
? JSON.parse(entry.metadata.workflow)
: entry.metadata.workflow;
} catch (e) {}
}
if (workflowData) {
extractFromWorkflow(workflowData, params);
}
}
if (promptData) {
extractFromPrompt(promptData, params);
}
return params;
}
function extractFromWorkflow(workflow, params) {
if (!workflow || !workflow.nodes) return;
for (const node of workflow.nodes) {
const type = node.type;
const widgets = node.widgets_values;
if (!widgets) continue;
if (["KSampler", "KSamplerAdvanced"].includes(type)) {
if (widgets.length >= 4) {
if (typeof widgets[0] === "number") params.seed = widgets[0];
if (typeof widgets[1] === "number") params.steps = widgets[1];
if (typeof widgets[2] === "number") params.cfg = widgets[2];
if (typeof widgets[3] === "string") params.sampler = widgets[3];
if (widgets.length > 4 && typeof widgets[4] === "string") params.scheduler = widgets[4];
}
} else if (
type === "CheckpointLoader" ||
type === "CheckpointLoaderSimple" ||
type === "CheckpointLoader|pysssss"
) {
if (widgets[0] && typeof widgets[0] === "string") params.model = widgets[0];
} else if (type === "CheckpointLoader") {
// CheckpointLoader has config_name at 0, ckpt_name at 1
if (widgets[1] && typeof widgets[1] === "string") params.model = widgets[1];
} else if (type === "EmptyLatentImage") {
if (widgets.length >= 2) {
if (typeof widgets[0] === "number") params.width = widgets[0];
if (typeof widgets[1] === "number") params.height = widgets[1];
}
} else if (type === "CLIPTextEncode") {
if (widgets[0] && typeof widgets[0] === "string") {
const text = widgets[0];
if (!params.prompt) {
params.prompt = text;
} else if (text !== params.prompt) {
params.negative_prompt = text;
}
}
}
}
}
function extractFromPrompt(prompt, params) {
if (!prompt) return;
for (const key of Object.keys(prompt)) {
const node = prompt[key];
if (!node) continue;
const classType = node.class_type;
const inputs = node.inputs || {};
if (
classType === "CheckpointLoader" ||
classType === "CheckpointLoaderSimple" ||
classType === "CheckpointLoader|pysssss"
) {
const model = inputs.ckpt_name || inputs.model_name;
if (model && typeof model === "string") params.model = model;
} else if (["KSampler", "KSamplerAdvanced"].includes(classType)) {
if (typeof inputs.seed === "number" || typeof inputs.seed === "string")
params.seed = inputs.seed;
if (typeof inputs.steps === "number") params.steps = inputs.steps;
if (typeof inputs.cfg === "number") params.cfg = inputs.cfg;
if (typeof inputs.sampler_name === "string") params.sampler = inputs.sampler_name;
if (typeof inputs.scheduler === "string") params.scheduler = inputs.scheduler;
if (typeof inputs.denoise === "number" && inputs.denoise !== 1.0)
params.denoise = inputs.denoise;
} else if (classType === "EmptyLatentImage") {
if (typeof inputs.width === "number") params.width = inputs.width;
if (typeof inputs.height === "number") params.height = inputs.height;
if (typeof inputs.batch_size === "number") params.batch_size = inputs.batch_size;
} else if (classType === "CLIPTextEncode") {
if (inputs.text && typeof inputs.text === "string") {
const text = inputs.text;
if (!params.prompt) {
params.prompt = text;
} else if (text !== params.prompt) {
params.negative_prompt = text;
}
}
}
}
}
export function formatMetadata(params) {
if (!params) return "";
const parts = [];
if (params.model) parts.push(params.model);
if (params.width && params.height) parts.push(`${params.width}x${params.height}`);
if (params.steps) parts.push(`Steps: ${params.steps}`);
if (params.cfg) parts.push(`CFG: ${params.cfg}`);
if (params.sampler) parts.push(params.sampler);
if (params.scheduler) parts.push(params.scheduler);
if (params.seed) parts.push(`Seed: ${params.seed}`);
if (params.denoise) parts.push(`Denoise: ${params.denoise}`);
return parts.join(" | ");
}