From 72e3feb5735adc7b968c2bc8d0b5cd5e9bea9c59 Mon Sep 17 00:00:00 2001
From: pythongosssss <125205205+pythongosssss@users.noreply.github.com>
Date: Thu, 9 Nov 2023 18:33:43 +0000
Subject: [PATCH] Load API JSON (#1932)
* added loading api json
* revert async change
* reorder
---
web/scripts/app.js | 69 ++++++++++++++++++++++++++++++++++++++++------
1 file changed, 60 insertions(+), 9 deletions(-)
diff --git a/web/scripts/app.js b/web/scripts/app.js
index 50e2052..61b88d4 100644
--- a/web/scripts/app.js
+++ b/web/scripts/app.js
@@ -1469,6 +1469,17 @@ export class ComfyApp {
localStorage.setItem("litegrapheditor_clipboard", old);
}
+ showMissingNodesError(missingNodeTypes, hasAddedNodes = true) {
+ this.ui.dialog.show(
+ `When loading the graph, the following node types were not found:
${Array.from(new Set(missingNodeTypes)).map(
+ (t) => `- ${t}
`
+ ).join("")}
${hasAddedNodes ? "Nodes that have failed to load will show as red on the graph." : ""}`
+ );
+ this.logging.addEntry("Comfy.App", "warn", {
+ MissingNodes: missingNodeTypes,
+ });
+ }
+
/**
* Populates the graph with the specified workflow data
* @param {*} graphData A serialized graph object
@@ -1587,14 +1598,7 @@ export class ComfyApp {
}
if (missingNodeTypes.length) {
- this.ui.dialog.show(
- `When loading the graph, the following node types were not found: ${Array.from(new Set(missingNodeTypes)).map(
- (t) => `- ${t}
`
- ).join("")}
Nodes that have failed to load will show as red on the graph.`
- );
- this.logging.addEntry("Comfy.App", "warn", {
- MissingNodes: missingNodeTypes,
- });
+ this.showMissingNodesError(missingNodeTypes);
}
}
@@ -1825,9 +1829,11 @@ export class ComfyApp {
} else if (file.type === "application/json" || file.name?.endsWith(".json")) {
const reader = new FileReader();
reader.onload = () => {
- var jsonContent = JSON.parse(reader.result);
+ const jsonContent = JSON.parse(reader.result);
if (jsonContent?.templates) {
this.loadTemplateData(jsonContent);
+ } else if(this.isApiJson(jsonContent)) {
+ this.loadApiJson(jsonContent);
} else {
this.loadGraphData(jsonContent);
}
@@ -1841,6 +1847,51 @@ export class ComfyApp {
}
}
+ isApiJson(data) {
+ return Object.values(data).every((v) => v.class_type);
+ }
+
+ loadApiJson(apiData) {
+ const missingNodeTypes = Object.values(apiData).filter((n) => !LiteGraph.registered_node_types[n.class_type]);
+ if (missingNodeTypes.length) {
+ this.showMissingNodesError(missingNodeTypes.map(t => t.class_type), false);
+ return;
+ }
+
+ const ids = Object.keys(apiData);
+ app.graph.clear();
+ for (const id of ids) {
+ const data = apiData[id];
+ const node = LiteGraph.createNode(data.class_type);
+ node.id = id;
+ graph.add(node);
+ }
+
+ for (const id of ids) {
+ const data = apiData[id];
+ const node = app.graph.getNodeById(id);
+ for (const input in data.inputs ?? {}) {
+ const value = data.inputs[input];
+ if (value instanceof Array) {
+ const [fromId, fromSlot] = value;
+ const fromNode = app.graph.getNodeById(fromId);
+ const toSlot = node.inputs?.findIndex((inp) => inp.name === input);
+ if (toSlot !== -1) {
+ fromNode.connect(fromSlot, node, toSlot);
+ }
+ } else {
+ const widget = node.widgets?.find((w) => w.name === input);
+ if (widget) {
+ widget.value = value;
+ widget.callback?.(value);
+ }
+ }
+ }
+ }
+
+ app.graph.arrange();
+ }
+
/**
* Registers a Comfy web extension with the app
* @param {ComfyExtension} extension