From 922a83d0ce8c9ea5de7d0800cacceb9d20b91ab1 Mon Sep 17 00:00:00 2001 From: rvion Date: Sun, 7 Jan 2024 17:21:59 +0100 Subject: [PATCH 01/67] fix typo ? --- model-list.json | 4 ++-- node_db/new/model-list.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/model-list.json b/model-list.json index 872b2e7d..cd76daf3 100644 --- a/model-list.json +++ b/model-list.json @@ -132,7 +132,7 @@ }, { "name": "stabilityai/stable-diffusion-x4-upscaler", - "type": "checkpoint", + "type": "checkpoints", "base": "upscale", "save_path": "checkpoints/upscale", "description": "[3.53GB] This upscaling model is a latent text-guided diffusion model and should be used with SD_4XUpscale_Conditioning and KSampler.", @@ -532,7 +532,7 @@ }, { "name": "Segmind-Vega", - "type": "checkpoint", + "type": "checkpoints", "base": "segmind-vega", "save_path": "checkpoints/segmind-vega", "description": "The Segmind-Vega Model is a distilled version of the Stable Diffusion XL (SDXL), offering a remarkable 70% reduction in size and an impressive 100% speedup while retaining high-quality text-to-image generation capabilities.", diff --git a/node_db/new/model-list.json b/node_db/new/model-list.json index 8f46d3f0..18b21583 100644 --- a/node_db/new/model-list.json +++ b/node_db/new/model-list.json @@ -23,7 +23,7 @@ }, { "name": "stabilityai/stable-diffusion-x4-upscaler", - "type": "checkpoint", + "type": "checkpoints", "base": "upscale", "save_path": "checkpoints/upscale", "description": "[3.53GB] This upscaling model is a latent text-guided diffusion model and should be used with SD_4XUpscale_Conditioning and KSampler.", @@ -127,7 +127,7 @@ { "name": "Segmind-Vega", - "type": "checkpoint", + "type": "checkpoints", "base": "segmind-vega", "save_path": "checkpoints/segmind-vega", "description": "The Segmind-Vega Model is a distilled version of the Stable Diffusion XL (SDXL), offering a remarkable 70% reduction in size and an impressive 100% speedup while retaining high-quality text-to-image generation capabilities.", From 211532e9f08470213c34b9f7e8222a7b8e3d07e0 Mon Sep 17 00:00:00 2001 From: alexp <5938230+aplex@users.noreply.github.com> Date: Sun, 7 Jan 2024 11:39:20 -0800 Subject: [PATCH 02/67] Add new workflow sharing option Add YouML as an option to share workflows and convert them into interactive apps. --- README.md | 4 +- __init__.py | 31 ++ js/comfyui-manager.js | 26 +- js/comfyui-share-common.js | 34 ++- js/comfyui-share-youml.js | 568 +++++++++++++++++++++++++++++++++++++ 5 files changed, 658 insertions(+), 5 deletions(-) create mode 100644 js/comfyui-share-youml.js diff --git a/README.md b/README.md index 54253335..576cba0d 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,9 @@ This repository provides Colab notebooks that allow you to install and use Comfy ![menu](misc/main.jpg) ![share](misc/share.jpg) * You can share the workflow by clicking the Share button at the bottom of the main menu or selecting Share Output from the Context Menu of the Image node. - * Currently, it supports sharing via [https://comfyworkflows.com/](https://comfyworkflows.com/) and [https://openart.ai](https://openart.ai/workflows/dev), as well as through the Matrix channel. + * Currently, it supports sharing via [https://comfyworkflows.com/](https://comfyworkflows.com/), + [https://openart.ai](https://openart.ai/workflows/dev), [https://youml.com](https://youml.com) + as well as through the Matrix channel. ![menu](misc/share-setting.jpg) diff --git a/__init__.py b/__init__.py index 54845510..2b58c29f 100644 --- a/__init__.py +++ b/__init__.py @@ -1874,6 +1874,22 @@ def get_comfyworkflows_auth(): return None +def get_youml_settings(): + if not os.path.exists(os.path.join(comfyui_manager_path, ".youml")): + return None + try: + with open(os.path.join(comfyui_manager_path, ".youml"), "r") as f: + youml_settings = f.read().strip() + return youml_settings if youml_settings else None + except: + return None + + +def set_youml_settings(settings): + with open(os.path.join(comfyui_manager_path, ".youml"), "w") as f: + f.write(settings) + + @server.PromptServer.instance.routes.get("/manager/get_openart_auth") async def api_get_openart_auth(request): # print("Getting stored Matrix credentials...") @@ -1901,6 +1917,21 @@ async def api_get_matrix_auth(request): return web.json_response(matrix_auth) +@server.PromptServer.instance.routes.get("/manager/youml/settings") +async def api_get_youml_settings(request): + youml_settings = get_youml_settings() + if not youml_settings: + return web.Response(status=404) + return web.json_response(json.loads(youml_settings)) + + +@server.PromptServer.instance.routes.post("/manager/youml/settings") +async def api_set_youml_settings(request): + json_data = await request.json() + set_youml_settings(json.dumps(json_data)) + return web.Response(status=200) + + @server.PromptServer.instance.routes.get("/manager/get_comfyworkflows_auth") async def api_get_comfyworkflows_auth(request): # Check if the user has provided Matrix credentials in a file called 'matrix_accesstoken' diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index 856f9562..d2fac79e 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -1,7 +1,15 @@ import { app } from "../../scripts/app.js"; import { api } from "../../scripts/api.js" import { ComfyDialog, $el } from "../../scripts/ui.js"; -import { ShareDialog, SUPPORTED_OUTPUT_NODE_TYPES, getPotentialOutputsAndOutputNodes, ShareDialogChooser, showOpenArtShareDialog, showShareDialog } from "./comfyui-share-common.js"; +import { + ShareDialog, + SUPPORTED_OUTPUT_NODE_TYPES, + getPotentialOutputsAndOutputNodes, + ShareDialogChooser, + showOpenArtShareDialog, + showShareDialog, + showYouMLShareDialog +} from "./comfyui-share-common.js"; import { OpenArtShareDialog } from "./comfyui-share-openart.js"; import { CustomNodesInstaller } from "./custom-nodes-downloader.js"; import { AlternativesInstaller } from "./a1111-alter-downloader.js"; @@ -734,6 +742,7 @@ class ManagerMenuDialog extends ComfyDialog { const share_options = [ ['none', 'None'], ['openart', 'OpenArt AI'], + ['youml', 'YouML'], ['matrix', 'Matrix Server'], ['comfyworkflows', 'ComfyWorkflows'], ['all', 'All'], @@ -985,6 +994,9 @@ class ManagerMenuDialog extends ComfyDialog { } else if (share_option === 'matrix' || share_option === 'comfyworkflows') { showShareDialog(share_option); return; + } else if (share_option === 'youml') { + showYouMLShareDialog(); + return; } if (!ShareDialogChooser.instance) { @@ -1001,6 +1013,15 @@ class ManagerMenuDialog extends ComfyDialog { window.open(url, "comfyui-workflow-gallery"); modifyButtonStyle(url); }, + }, + { + title: "Open 'youml.com'", + callback: () => { + const url = "https://youml.com/?from=comfyui-share"; + localStorage.setItem("wg_last_visited", url); + window.open(url, "comfyui-workflow-gallery"); + modifyButtonStyle(url); + }, }, { title: "Open 'comfyworkflows.com'", @@ -1067,6 +1088,9 @@ app.registerExtension({ } else if (share_option === 'matrix' || share_option === 'comfyworkflows') { showShareDialog(share_option); return; + } else if (share_option === 'youml') { + showYouMLShareDialog(); + return; } if(!ShareDialogChooser.instance) { diff --git a/js/comfyui-share-common.js b/js/comfyui-share-common.js index d85637e1..74ab6af6 100644 --- a/js/comfyui-share-common.js +++ b/js/comfyui-share-common.js @@ -2,6 +2,7 @@ import { app } from "../../scripts/app.js"; import { api } from "../../scripts/api.js"; import { ComfyDialog, $el } from "../../scripts/ui.js"; import { OpenArtShareDialog } from "./comfyui-share-openart.js"; +import { YouMLShareDialog } from "./comfyui-share-youml.js"; export const SUPPORTED_OUTPUT_NODE_TYPES = [ "PreviewImage", @@ -179,6 +180,23 @@ export const showOpenArtShareDialog = () => { }) } + +export const showYouMLShareDialog = () => { + if (!YouMLShareDialog.instance) { + YouMLShareDialog.instance = new YouMLShareDialog(); + } + + return app.graphToPrompt() + .then(prompt => { + return app.graph._nodes; + }) + .then(nodes => { + const { potential_outputs, potential_output_nodes } = getPotentialOutputsAndOutputNodes(nodes); + YouMLShareDialog.instance.show(potential_outputs, potential_output_nodes); + }) +} + + export const showShareDialog = async (share_option) => { if (!ShareDialog.instance) { ShareDialog.instance = new ShareDialog(share_option); @@ -233,6 +251,16 @@ export class ShareDialogChooser extends ComfyDialog { this.close(); } }, + { + key: "youml", + textContent: "YouML", + website: "https://youml.com", + description: "Share your workflow or transform it into an interactive app on YouML.com", + onclick: () => { + showYouMLShareDialog(); + this.close(); + } + }, { key: "matrix", textContent: "Matrix Server", @@ -264,7 +292,7 @@ export class ShareDialogChooser extends ComfyDialog { display: "flex", 'flex-wrap': 'wrap', 'justify-content': 'space-around', - 'padding': '20px', + 'padding': '10px', } }); @@ -297,7 +325,7 @@ export class ShareDialogChooser extends ComfyDialog { 'text-align': 'left', color: 'white', 'font-size': '14px', - 'margin-bottom': '10px', + 'margin-bottom': '0', }, }); @@ -335,7 +363,7 @@ export class ShareDialogChooser extends ComfyDialog { style: { 'flex-basis': '100%', 'margin': '10px', - 'padding': '20px', + 'padding': '10px 20px', 'border': '1px solid #ddd', 'border-radius': '5px', 'box-shadow': '0 2px 4px rgba(0, 0, 0, 0.1)', diff --git a/js/comfyui-share-youml.js b/js/comfyui-share-youml.js new file mode 100644 index 00000000..80077b25 --- /dev/null +++ b/js/comfyui-share-youml.js @@ -0,0 +1,568 @@ +import {app} from "../../scripts/app.js"; +import {api} from "../../scripts/api.js"; +import {ComfyDialog, $el} from "../../scripts/ui.js"; + +const BASE_URL = "https://youml.com"; +//const BASE_URL = "http://localhost:3000"; +const DEFAULT_HOMEPAGE_URL = `${BASE_URL}/?from=comfyui`; +const TOKEN_PAGE_URL = `${BASE_URL}/my-token`; +const API_ENDPOINT = `${BASE_URL}/api`; + +const style = ` + .youml-share-dialog { + overflow-y: auto; + } + .youml-share-dialog .dialog-header { + text-align: center; + color: white; + margin: 0 0 10px 0; + } + .youml-share-dialog .dialog-section { + margin-bottom: 0; + padding: 0; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + display: flex; + flex-direction: column; + justify-content: center; + } + .youml-share-dialog input, .youml-share-dialog textarea { + display: block; + min-width: 500px; + width: 100%; + padding: 10px; + margin: 10px 0; + border-radius: 4px; + border: 1px solid #ddd; + box-sizing: border-box; + } + .youml-share-dialog textarea { + color: var(--input-text); + background-color: var(--comfy-input-bg); + } + .youml-share-dialog .workflow-description { + min-height: 75px; + } + .youml-share-dialog label { + color: #f8f8f8; + display: block; + margin: 5px 0 0 0; + font-weight: bold; + text-decoration: none; + } + .youml-share-dialog .action-button { + padding: 10px 80px; + margin: 10px 5px; + border-radius: 4px; + border: none; + cursor: pointer; + } + .youml-share-dialog .share-button { + color: #fff; + background-color: #007bff; + } + .youml-share-dialog .close-button { + background-color: none; + } + .youml-share-dialog .action-button-panel { + text-align: right; + display: flex; + justify-content: space-between; + } + .youml-share-dialog .status-message { + color: #fd7909; + text-align: center; + padding: 5px; + font-size: 18px; + } + .youml-share-dialog .status-message a { + color: white; + } + .youml-share-dialog .output-panel { + overflow: auto; + max-height: 180px; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + grid-template-rows: auto; + grid-column-gap: 10px; + grid-row-gap: 10px; + margin-bottom: 10px; + padding: 10px; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + background-color: var(--bg-color); + } + .youml-share-dialog .output-panel .output-image { + width: 100px; + height: 100px; + objectFit: cover; + borderRadius: 5px; + } + + .youml-share-dialog .output-panel .radio-button { + color:var(--fg-color); + } + .youml-share-dialog .output-panel .radio-text { + color: gray; + display: block; + font-size: 12px; + overflow-x: hidden; + text-overflow: ellipsis; + text-wrap: nowrap; + max-width: 100px; + } + .youml-share-dialog .output-panel .node-id { + color: #FBFBFD; + display: block; + background-color: rgba(0, 0, 0, 0.5); + font-size: 12px; + overflow-x: hidden; + padding: 2px 3px; + text-overflow: ellipsis; + text-wrap: nowrap; + max-width: 100px; + position: absolute; + top: 3px; + left: 3px; + border-radius: 3px; + } + .youml-share-dialog .output-panel .output-label { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-bottom: 10px; + cursor: pointer; + position: relative; + border: 5px solid transparent; + } + .youml-share-dialog .output-panel .output-label:hover { + border: 5px solid #007bff; + } + .youml-share-dialog .output-panel .output-label.checked { + border: 5px solid #007bff; + } + .youml-share-dialog .missing-output-message{ + color: #fd7909; + font-size: 16px; + margin-bottom:10px + } + .youml-share-dialog .select-output-message{ + color: white; + margin-bottom:5px + } +`; + +export class YouMLShareDialog extends ComfyDialog { + static instance = null; + + constructor() { + super(); + $el("style", { + textContent: style, + parent: document.head, + }); + this.element = $el( + "div.comfy-modal.youml-share-dialog", + { + parent: document.body, + }, + [$el("div.comfy-modal-content", {}, [...this.createLayout()])] + ); + this.selectedOutputIndex = 0; + this.selectedNodeId = null; + this.uploadedImages = []; + this.selectedFile = null; + } + + async loadToken() { + let key = "" + try { + const response = await api.fetchApi(`/manager/youml/settings`) + const settings = await response.json() + return settings.token + } catch (error) { + } + return key || ""; + } + + async saveToken(value) { + await api.fetchApi(`/manager/youml/settings`, { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ + token: value + }) + }); + } + + createLayout() { + // Header Section + const headerSection = $el("h3.dialog-header", { + textContent: "Share your workflow to YouML.com", + size: 3, + }); + + // Workflow Info Section + this.nameInput = $el("input", { + type: "text", + placeholder: "Name (required)", + }); + this.descriptionInput = $el("textarea.workflow-description", { + placeholder: "Description (optional, markdown supported)", + }); + const workflowMetadata = $el("div.dialog-section", {}, [ + $el("label", {}, ["Workflow info"]), + this.nameInput, + this.descriptionInput, + ]); + + // Outputs Section + this.outputsSection = $el("div.dialog-section", { + id: "selectOutputs", + }, []); + + const outputUploadSection = $el("div.dialog-section", {}, [ + $el("label", {}, ["Thumbnail"]), + this.outputsSection, + ]); + + // API Token Section + this.apiTokenInput = $el("input", { + type: "password", + placeholder: "Copy & paste your API token", + }); + const getAPITokenButton = $el("button", { + href: DEFAULT_HOMEPAGE_URL, + target: "_blank", + onclick: () => window.open(TOKEN_PAGE_URL, "_blank"), + }, ["Get your API Token"]) + + const apiTokenSection = $el("div.dialog-section", {}, [ + $el("label", {}, ["YouML API Token"]), + this.apiTokenInput, + getAPITokenButton, + ]); + + // Message Section + this.message = $el("div.status-message", {}, []); + + // Share and Close Buttons + this.shareButton = $el("button.action-button.share-button", { + type: "submit", + textContent: "Share", + onclick: () => { + this.handleShareButtonClick(); + }, + }); + + const buttonsSection = $el( + "div.action-button-panel", + {}, + [ + $el("button.action-button.close-button", { + type: "button", + textContent: "Close", + onclick: () => { + this.close(); + }, + }), + this.shareButton, + ] + ); + + // Composing the full layout + const layout = [ + headerSection, + workflowMetadata, + outputUploadSection, + apiTokenSection, + this.message, + buttonsSection, + ]; + + return layout; + } + + async fetchYoumlApi(path, options, statusText) { + if (statusText) { + this.message.textContent = statusText; + } + + const fullPath = new URL(API_ENDPOINT + path) + + const fetchOptions = Object.assign({}, options) + + fetchOptions.headers = { + ...fetchOptions.headers, + "Authorization": `Bearer ${this.apiTokenInput.value}`, + "User-Agent": "ComfyUI-Manager-Youml/1.0.0", + } + + const response = await fetch(fullPath, fetchOptions); + + if (!response.ok) { + throw new Error(response.statusText + " " + (await response.text())); + } + + if (statusText) { + this.message.textContent = ""; + } + const data = await response.json(); + return { + ok: response.ok, + statusText: response.statusText, + status: response.status, + data, + }; + } + + async uploadThumbnail(uploadFile, recipeId) { + const form = new FormData(); + form.append("file", uploadFile, uploadFile.name); + try { + const res = await this.fetchYoumlApi( + `/v1/comfy/recipes/${recipeId}/thumbnail`, + { + method: "POST", + body: form, + }, + "Uploading thumbnail..." + ); + + } catch (e) { + if (e?.response?.status === 413) { + throw new Error("File size is too large (max 20MB)"); + } else { + throw new Error("Error uploading thumbnail: " + e.message); + } + } + } + + async handleShareButtonClick() { + this.message.textContent = ""; + await this.saveToken(this.apiTokenInput.value); + try { + this.shareButton.disabled = true; + this.shareButton.textContent = "Sharing..."; + await this.share(); + } catch (e) { + alert(e.message); + } finally { + this.shareButton.disabled = false; + this.shareButton.textContent = "Share"; + } + } + + async share() { + const prompt = await app.graphToPrompt(); + const workflowJSON = prompt["workflow"]; + const workflowAPIJSON = prompt["output"]; + const form_values = { + name: this.nameInput.value, + description: this.descriptionInput.value, + }; + + if (!this.apiTokenInput.value) { + throw new Error("API token is required"); + } + + if (!this.selectedFile) { + throw new Error("Thumbnail is required"); + } + + if (!form_values.name) { + throw new Error("Title is required"); + } + + + try { + let snapshotData = null; + try { + const snapshot = await api.fetchApi(`/snapshot/get_current`) + snapshotData = await snapshot.json() + } catch (e) { + console.error("Failed to get snapshot", e) + } + + const request = { + name: this.nameInput.value, + description: this.descriptionInput.value, + workflowUiJson: JSON.stringify(workflowJSON), + workflowApiJson: JSON.stringify(workflowAPIJSON), + } + + if (snapshotData) { + request.snapshotJson = JSON.stringify(snapshotData) + } + + const response = await this.fetchYoumlApi( + "/v1/comfy/recipes", + { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify(request), + }, + "Uploading workflow..." + ); + + if (response.ok) { + const {id, recipePageUrl, editorPageUrl} = response.data; + if (id) { + let messagePrefix = "Workflow has been shared." + if (this.selectedFile) { + try { + await this.uploadThumbnail(this.selectedFile, id); + } catch (e) { + console.error("Thumbnail upload failed: ", e); + messagePrefix = "Workflow has been shared, but thumbnail upload failed. You can create a thumbnail on YouML later." + } + } + this.message.innerHTML = `${messagePrefix} To turn your workflow into an interactive app, ` + + `visit it on YouML`; + + this.uploadedImages = []; + this.nameInput.value = ""; + this.descriptionInput.value = ""; + this.radioButtons.forEach((ele) => { + ele.checked = false; + ele.parentElement.classList.remove("checked"); + }); + this.selectedOutputIndex = 0; + this.selectedNodeId = null; + this.selectedFile = null; + } + } + } catch (e) { + throw new Error("Error sharing workflow: " + e.message); + } + } + + async fetchImageBlob(url) { + const response = await fetch(url); + const blob = await response.blob(); + return blob; + } + + async show(potentialOutputs, potentialOutputNodes) { + const potentialOutputsToOrder = {}; + potentialOutputNodes.forEach((node, index) => { + if (node.id in potentialOutputsToOrder) { + potentialOutputsToOrder[node.id][1].push(potentialOutputs[index]); + } else { + potentialOutputsToOrder[node.id] = [node, [potentialOutputs[index]]]; + } + }) + const sortedPotentialOutputsToOrder = Object.fromEntries( + Object.entries(potentialOutputsToOrder).sort((a, b) => a[0].id - b[0].id) + ); + const sortedPotentialOutputs = [] + const sortedPotentiaOutputNodes = [] + for (const [key, value] of Object.entries(sortedPotentialOutputsToOrder)) { + sortedPotentiaOutputNodes.push(value[0]); + sortedPotentialOutputs.push(...value[1]); + } + potentialOutputNodes = sortedPotentiaOutputNodes; + potentialOutputs = sortedPotentialOutputs; + + + // If `selectedNodeId` is provided, we will select the corresponding radio + // button for the node. In addition, we move the selected radio button to + // the top of the list. + if (this.selectedNodeId) { + const index = potentialOutputNodes.findIndex(node => node.id === this.selectedNodeId); + if (index >= 0) { + this.selectedOutputIndex = index; + } + } + + this.radioButtons = []; + const newRadioButtons = $el("div.output-panel", + { + id: "selectOutput-Options", + }, + potentialOutputs.map((output, index) => { + const {node_id: nodeId} = output; + const radioButton = $el("input.radio-button", { + type: "radio", + name: "selectOutputImages", + value: index, + required: index === 0 + }, []) + let radioButtonImage; + let filename; + if (output.type === "image" || output.type === "temp") { + radioButtonImage = $el("img.output-image", { + src: `/view?filename=${output.image.filename}&subfolder=${output.image.subfolder}&type=${output.image.type}`, + }, []); + filename = output.image.filename + } else if (output.type === "output") { + radioButtonImage = $el("img.output-image", { + src: output.output.value, + }, []); + filename = output.output.filename + } else { + radioButtonImage = $el("img.output-image", { + src: "", + }, []); + } + const radioButtonText = $el("span.radio-text", {}, [output.title]) + const nodeIdChip = $el("span.node-id", {}, [`Node: ${nodeId}`]) + radioButton.checked = this.selectedOutputIndex === index; + + radioButton.onchange = async () => { + this.selectedOutputIndex = parseInt(radioButton.value); + + // Remove the "checked" class from all radio buttons + this.radioButtons.forEach((ele) => { + ele.parentElement.classList.remove("checked"); + }); + radioButton.parentElement.classList.add("checked"); + + this.fetchImageBlob(radioButtonImage.src).then((blob) => { + const file = new File([blob], filename, { + type: blob.type, + }); + this.selectedFile = file; + }) + }; + + if (radioButton.checked) { + this.fetchImageBlob(radioButtonImage.src).then((blob) => { + const file = new File([blob], filename, { + type: blob.type, + }); + this.selectedFile = file; + }) + } + + this.radioButtons.push(radioButton); + + return $el(`label.output-label${radioButton.checked ? '.checked' : ''}`, {}, + [radioButtonImage, radioButtonText, radioButton, nodeIdChip]); + }) + ); + + let header; + if (this.radioButtons.length === 0) { + header = $el("div.missing-output-message", {textContent: "Queue Prompt to see the outputs and select a thumbnail"}, []) + } else { + header = $el("div.select-output-message", {textContent: "Choose one from the outputs (scroll to see all)"}, []) + } + + this.outputsSection.innerHTML = ""; + this.outputsSection.appendChild(header); + if (this.radioButtons.length > 0) { + this.outputsSection.appendChild(newRadioButtons); + } + + this.message.innerHTML = ""; + this.message.textContent = ""; + + const token = await this.loadToken(); + this.apiTokenInput.value = token; + this.uploadedImages = []; + + this.element.style.display = "block"; + } +} From 929192b3b4333012995ceeccf301b9a951d8c56d Mon Sep 17 00:00:00 2001 From: Alex Prokofiev <5938230+aplex@users.noreply.github.com> Date: Sun, 7 Jan 2024 12:09:51 -0800 Subject: [PATCH 03/67] Code style fixes --- js/comfyui-manager.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index d2fac79e..772e45df 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -1014,14 +1014,14 @@ class ManagerMenuDialog extends ComfyDialog { modifyButtonStyle(url); }, }, - { + { title: "Open 'youml.com'", - callback: () => { - const url = "https://youml.com/?from=comfyui-share"; - localStorage.setItem("wg_last_visited", url); - window.open(url, "comfyui-workflow-gallery"); - modifyButtonStyle(url); - }, + callback: () => { + const url = "https://youml.com/?from=comfyui-share"; + localStorage.setItem("wg_last_visited", url); + window.open(url, "comfyui-workflow-gallery"); + modifyButtonStyle(url); + }, }, { title: "Open 'comfyworkflows.com'", From 9947b36151a9cc950f8ec048ec6445d3fecd1955 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Tue, 9 Jan 2024 00:29:49 +0900 Subject: [PATCH 04/67] update DB --- extension-node-map.json | 7 +++++-- node_db/new/extension-node-map.json | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/extension-node-map.json b/extension-node-map.json index 57b771fd..d23a65e1 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -1945,6 +1945,7 @@ "CR Text List Cross Join", "CR Text List Simple", "CR Text List To String", + "CR Text Replace", "CR Text Scheduler", "CR Thumbnail Preview", "CR Trigger", @@ -1967,7 +1968,7 @@ ], { "author": "Suzie1", - "description": "160 custom nodes for artists, designers and animators.", + "description": "161 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2006,6 +2007,7 @@ [ "FC CropAndPaste", "FC CropBottom", + "FC CropToOrigin", "FC FaceDetectCrop", "FC FaceFusion", "FC FaceSegAndReplace", @@ -4503,7 +4505,8 @@ [ "Image(s) To Websocket (Base64)", "ImageOutput", - "Load Image(s) From Websocket (Base64)" + "Load Image (Base64)", + "Load Images (Base64)" ], { "title_aux": "Knodes" diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 57b771fd..d23a65e1 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -1945,6 +1945,7 @@ "CR Text List Cross Join", "CR Text List Simple", "CR Text List To String", + "CR Text Replace", "CR Text Scheduler", "CR Thumbnail Preview", "CR Trigger", @@ -1967,7 +1968,7 @@ ], { "author": "Suzie1", - "description": "160 custom nodes for artists, designers and animators.", + "description": "161 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2006,6 +2007,7 @@ [ "FC CropAndPaste", "FC CropBottom", + "FC CropToOrigin", "FC FaceDetectCrop", "FC FaceFusion", "FC FaceSegAndReplace", @@ -4503,7 +4505,8 @@ [ "Image(s) To Websocket (Base64)", "ImageOutput", - "Load Image(s) From Websocket (Base64)" + "Load Image (Base64)", + "Load Images (Base64)" ], { "title_aux": "Knodes" From 27a9a0035872f45960b089cc953320e46da9a15d Mon Sep 17 00:00:00 2001 From: Steph Ng Date: Tue, 9 Jan 2024 15:00:49 +0800 Subject: [PATCH 05/67] add custom node --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index ea246d24..b7c3d692 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4431,6 +4431,16 @@ ], "install_type": "unzip", "description": "This is a node to convert an image into a CMYK Halftone dot image." + }, + { + "author": "glowcone", + "title": "Load Image From Base64 URI", + "reference": "https://github.com/glowcone/comfyui-base64-to-image", + "files": [ + "https://github.com/glowcone/comfyui-base64-to-image/raw/main/nodes.py" + ], + "install_type": "copy", + "description": "Nodes: LoadImageFromBase64. Loads an image and its transparency mask from a base64-encoded data URI for easy API connection." } ] } From 9d2f2cfd084b27f65102e8aadc74450240333490 Mon Sep 17 00:00:00 2001 From: Steph Ng Date: Tue, 9 Jan 2024 15:20:52 +0800 Subject: [PATCH 06/67] change install type for custom node --- custom-node-list.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index b7c3d692..5dda6867 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4437,9 +4437,9 @@ "title": "Load Image From Base64 URI", "reference": "https://github.com/glowcone/comfyui-base64-to-image", "files": [ - "https://github.com/glowcone/comfyui-base64-to-image/raw/main/nodes.py" + "https://github.com/glowcone/comfyui-base64-to-image" ], - "install_type": "copy", + "install_type": "git-clone", "description": "Nodes: LoadImageFromBase64. Loads an image and its transparency mask from a base64-encoded data URI for easy API connection." } ] From 3c65a6486644af7b30b2635d83a1eb3c2e53f53d Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Tue, 9 Jan 2024 16:26:15 +0900 Subject: [PATCH 07/67] update DB --- custom-node-list.json | 31 ++++++++++++++------- extension-node-map.json | 34 ++++++++++++++++++++++- node_db/dev/custom-node-list.json | 10 +++++++ node_db/new/custom-node-list.json | 42 ++++++++++++++--------------- node_db/new/extension-node-map.json | 34 ++++++++++++++++++++++- 5 files changed, 118 insertions(+), 33 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index 5dda6867..66df6431 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4124,6 +4124,27 @@ "install_type": "git-clone", "description": "Nodes:SegToMask" }, + { + "author": "glowcone", + "title": "Load Image From Base64 URI", + "reference": "https://github.com/glowcone/comfyui-base64-to-image", + "files": [ + "https://github.com/glowcone/comfyui-base64-to-image" + ], + "install_type": "git-clone", + "description": "Nodes: LoadImageFromBase64. Loads an image and its transparency mask from a base64-encoded data URI for easy API connection." + }, + { + "author": "AInseven", + "title": "ComfyUI-fastblend", + "reference": "https://github.com/AInseven/ComfyUI-fastblend", + "files": [ + "https://github.com/AInseven/ComfyUI-fastblend" + ], + "install_type": "git-clone", + "description": "fastblend for comfyui, and other nodes that I write for video2video. rebatch image, my openpose" + }, + { "author": "Ser-Hilary", @@ -4431,16 +4452,6 @@ ], "install_type": "unzip", "description": "This is a node to convert an image into a CMYK Halftone dot image." - }, - { - "author": "glowcone", - "title": "Load Image From Base64 URI", - "reference": "https://github.com/glowcone/comfyui-base64-to-image", - "files": [ - "https://github.com/glowcone/comfyui-base64-to-image" - ], - "install_type": "git-clone", - "description": "Nodes: LoadImageFromBase64. Loads an image and its transparency mask from a base64-encoded data URI for easy API connection." } ] } diff --git a/extension-node-map.json b/extension-node-map.json index d23a65e1..e2ba233d 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -70,6 +70,19 @@ "title_aux": "ComfyUI-Static-Primitives" } ], + "https://github.com/AInseven/ComfyUI-fastblend": [ + [ + "FillDarkMask", + "InterpolateKeyFrame", + "MaskListcaptoBatch", + "MyOpenPoseNode", + "SmoothVideo", + "reBatchImage" + ], + { + "title_aux": "ComfyUI-fastblend" + } + ], "https://github.com/AIrjen/OneButtonPrompt": [ [ "AutoNegativePrompt", @@ -1029,8 +1042,10 @@ [ "VHS_DuplicateImages", "VHS_DuplicateLatents", + "VHS_DuplicateMasks", "VHS_GetImageCount", "VHS_GetLatentCount", + "VHS_GetMaskCount", "VHS_LoadAudio", "VHS_LoadImages", "VHS_LoadImagesPath", @@ -1038,10 +1053,13 @@ "VHS_LoadVideoPath", "VHS_MergeImages", "VHS_MergeLatents", + "VHS_MergeMasks", "VHS_SelectEveryNthImage", "VHS_SelectEveryNthLatent", + "VHS_SelectEveryNthMask", "VHS_SplitImages", "VHS_SplitLatents", + "VHS_SplitMasks", "VHS_VAEDecodeBatched", "VHS_VAEEncodeBatched", "VHS_VideoCombine" @@ -2058,6 +2076,7 @@ "tri3d-extract-parts-batch2", "tri3d-extract-parts-mask-batch", "tri3d-face-recognise", + "tri3d-float-to-image", "tri3d-fuzzification", "tri3d-interaction-canny", "tri3d-load-pose-json", @@ -3726,6 +3745,7 @@ "BatchCount+", "CLIPTextEncodeSDXL+", "ConsoleDebug+", + "DebugTensorShape+", "ExtractKeyframes+", "GetImageSize+", "ImageCASharpening+", @@ -3747,7 +3767,6 @@ "ModelCompile+", "SDXLResolutionPicker+", "SimpleMath+", - "StableZero123_Increments", "TransitionMask+" ], { @@ -4201,6 +4220,14 @@ "title_aux": "ComfyUI-GlifNodes" } ], + "https://github.com/glowcone/comfyui-base64-to-image": [ + [ + "LoadImageFromBase64" + ], + { + "title_aux": "Load Image From Base64 URI" + } + ], "https://github.com/guoyk93/yk-node-suite-comfyui": [ [ "YKImagePadForOutpaint", @@ -4961,11 +4988,13 @@ "GlobalSampler //Inspire", "GlobalSeed //Inspire", "HEDPreprocessor_Provider_for_SEGS //Inspire", + "ImageBatchSplitter //Inspire", "InpaintPreprocessor_Provider_for_SEGS //Inspire", "KSampler //Inspire", "KSamplerAdvanced //Inspire", "KSamplerAdvancedProgress //Inspire", "KSamplerProgress //Inspire", + "LatentBatchSplitter //Inspire", "LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", "LineArt_Preprocessor_Provider_for_SEGS //Inspire", "ListCounter //Inspire", @@ -4985,6 +5014,7 @@ "OpenPose_Preprocessor_Provider_for_SEGS //Inspire", "PromptBuilder //Inspire", "PromptExtractor //Inspire", + "RandomGeneratorForList //Inspire", "RegionalConditioningColorMask //Inspire", "RegionalConditioningSimple //Inspire", "RegionalIPAdapterColorMask //Inspire", @@ -5681,6 +5711,7 @@ "LoadImagesFromPath", "LoadImagesFromURL", "MergeLayers", + "MirroredImage", "MultiplicationNode", "NewLayer", "NoiseImage", @@ -5698,6 +5729,7 @@ "SplitLongMask", "SvgImage", "SwitchByIndex", + "TESTNODE_", "TextImage", "TextInput_", "TextToNumber", diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index 26bcfe6a..217fd1ac 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "MrAdamBlack", + "title": "CheckProgress [WIP]", + "reference": "https://github.com/MrAdamBlack/CheckProgress", + "files": [ + "https://github.com/MrAdamBlack/CheckProgress" + ], + "install_type": "git-clone", + "description": "I was looking for a node to put in place to ensure my prompt etc where going as expected before the rest of the flow executed. To end the session, I just return the input image as None (see expected error). Recommend using it alongside PreviewImage, then output to the rest of the flow and Save Image." + }, { "author": "11cafe", "title": "ComfyUI Model Manager [WIP]", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index b5b57448..ac7b7378 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -9,7 +9,27 @@ "description": "If you see this message, your ComfyUI-Manager is outdated.\nRecent channel provides only the list of the latest nodes. If you want to find the complete node list, please go to the Default channel." }, - + + { + "author": "AInseven", + "title": "ComfyUI-fastblend", + "reference": "https://github.com/AInseven/ComfyUI-fastblend", + "files": [ + "https://github.com/AInseven/ComfyUI-fastblend" + ], + "install_type": "git-clone", + "description": "fastblend for comfyui, and other nodes that I write for video2video. rebatch image, my openpose" + }, + { + "author": "glowcone", + "title": "Load Image From Base64 URI", + "reference": "https://github.com/glowcone/comfyui-base64-to-image", + "files": [ + "https://github.com/glowcone/comfyui-base64-to-image" + ], + "install_type": "git-clone", + "description": "Nodes: LoadImageFromBase64. Loads an image and its transparency mask from a base64-encoded data URI for easy API connection." + }, { "author": "shiimizu", "title": "Tiled Diffusion & VAE for ComfyUI", @@ -673,26 +693,6 @@ ], "install_type": "git-clone", "description": "ComfyUI nodes to facilitate parameter/prompt keyframing using comfyui nodes for defining and manipulating parameter curves. Essentially provides a ComfyUI interface to the [a/keyframed](https://github.com/dmarx/keyframed) library." - }, - { - "author": "TripleHeadedMonkey", - "title": "ComfyUI_MileHighStyler", - "reference": "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler", - "files": [ - "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler" - ], - "install_type": "git-clone", - "description": "This extension provides various SDXL Prompt Stylers. See: [a/youtube](https://youtu.be/WBHI-2uww7o?si=dijvDaUI4nmx4VkF)" - }, - { - "author": "Extraltodeus", - "title": "sigmas_tools_and_the_golden_scheduler", - "reference": "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler", - "files": [ - "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler" - ], - "install_type": "git-clone", - "description": "A few nodes to mix sigmas and a custom scheduler that uses phi, then one using eval() to be able to schedule with custom formulas." } ] } diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index d23a65e1..e2ba233d 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -70,6 +70,19 @@ "title_aux": "ComfyUI-Static-Primitives" } ], + "https://github.com/AInseven/ComfyUI-fastblend": [ + [ + "FillDarkMask", + "InterpolateKeyFrame", + "MaskListcaptoBatch", + "MyOpenPoseNode", + "SmoothVideo", + "reBatchImage" + ], + { + "title_aux": "ComfyUI-fastblend" + } + ], "https://github.com/AIrjen/OneButtonPrompt": [ [ "AutoNegativePrompt", @@ -1029,8 +1042,10 @@ [ "VHS_DuplicateImages", "VHS_DuplicateLatents", + "VHS_DuplicateMasks", "VHS_GetImageCount", "VHS_GetLatentCount", + "VHS_GetMaskCount", "VHS_LoadAudio", "VHS_LoadImages", "VHS_LoadImagesPath", @@ -1038,10 +1053,13 @@ "VHS_LoadVideoPath", "VHS_MergeImages", "VHS_MergeLatents", + "VHS_MergeMasks", "VHS_SelectEveryNthImage", "VHS_SelectEveryNthLatent", + "VHS_SelectEveryNthMask", "VHS_SplitImages", "VHS_SplitLatents", + "VHS_SplitMasks", "VHS_VAEDecodeBatched", "VHS_VAEEncodeBatched", "VHS_VideoCombine" @@ -2058,6 +2076,7 @@ "tri3d-extract-parts-batch2", "tri3d-extract-parts-mask-batch", "tri3d-face-recognise", + "tri3d-float-to-image", "tri3d-fuzzification", "tri3d-interaction-canny", "tri3d-load-pose-json", @@ -3726,6 +3745,7 @@ "BatchCount+", "CLIPTextEncodeSDXL+", "ConsoleDebug+", + "DebugTensorShape+", "ExtractKeyframes+", "GetImageSize+", "ImageCASharpening+", @@ -3747,7 +3767,6 @@ "ModelCompile+", "SDXLResolutionPicker+", "SimpleMath+", - "StableZero123_Increments", "TransitionMask+" ], { @@ -4201,6 +4220,14 @@ "title_aux": "ComfyUI-GlifNodes" } ], + "https://github.com/glowcone/comfyui-base64-to-image": [ + [ + "LoadImageFromBase64" + ], + { + "title_aux": "Load Image From Base64 URI" + } + ], "https://github.com/guoyk93/yk-node-suite-comfyui": [ [ "YKImagePadForOutpaint", @@ -4961,11 +4988,13 @@ "GlobalSampler //Inspire", "GlobalSeed //Inspire", "HEDPreprocessor_Provider_for_SEGS //Inspire", + "ImageBatchSplitter //Inspire", "InpaintPreprocessor_Provider_for_SEGS //Inspire", "KSampler //Inspire", "KSamplerAdvanced //Inspire", "KSamplerAdvancedProgress //Inspire", "KSamplerProgress //Inspire", + "LatentBatchSplitter //Inspire", "LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", "LineArt_Preprocessor_Provider_for_SEGS //Inspire", "ListCounter //Inspire", @@ -4985,6 +5014,7 @@ "OpenPose_Preprocessor_Provider_for_SEGS //Inspire", "PromptBuilder //Inspire", "PromptExtractor //Inspire", + "RandomGeneratorForList //Inspire", "RegionalConditioningColorMask //Inspire", "RegionalConditioningSimple //Inspire", "RegionalIPAdapterColorMask //Inspire", @@ -5681,6 +5711,7 @@ "LoadImagesFromPath", "LoadImagesFromURL", "MergeLayers", + "MirroredImage", "MultiplicationNode", "NewLayer", "NoiseImage", @@ -5698,6 +5729,7 @@ "SplitLongMask", "SvgImage", "SwitchByIndex", + "TESTNODE_", "TextImage", "TextInput_", "TextToNumber", From 8aada09e8fa2b53687c59034dfffe6e1bb976e0b Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 10 Jan 2024 00:55:58 +0900 Subject: [PATCH 08/67] update DB update .gitignore --- .gitignore | 1 + extension-node-map.json | 5 +++- node_db/dev/extension-node-map.json | 43 +++++++++++++++++++++++++++++ node_db/new/extension-node-map.json | 5 +++- 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 8eea45d4..e2354725 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ config.ini snapshots/** startup-scripts/** .openart_key +.youml matrix_auth channels.list comfyworkflows_sharekey diff --git a/extension-node-map.json b/extension-node-map.json index e2ba233d..a97d92ec 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -1926,6 +1926,7 @@ "CR Select Model", "CR Set Value On Binary", "CR Set Value On Boolean", + "CR Set Value on String", "CR Simple Annotations", "CR Simple Banner", "CR Simple Binary Pattern", @@ -1986,7 +1987,7 @@ ], { "author": "Suzie1", - "description": "161 custom nodes for artists, designers and animators.", + "description": "162 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2711,6 +2712,7 @@ "Aegisflow CLIP Pass", "Aegisflow Image Pass", "Aegisflow Latent Pass", + "Aegisflow Mask Pass", "Aegisflow Model Pass", "Aegisflow VAE Pass", "Aegisflow controlnet preprocessor bus", @@ -6631,6 +6633,7 @@ "easy imageSizeByLongerSide", "easy imageSizeBySide", "easy kSampler", + "easy kSamplerDownscaleUnet", "easy kSamplerInpainting", "easy kSamplerSDTurbo", "easy kSamplerTiled", diff --git a/node_db/dev/extension-node-map.json b/node_db/dev/extension-node-map.json index e081749a..64f8dab0 100644 --- a/node_db/dev/extension-node-map.json +++ b/node_db/dev/extension-node-map.json @@ -61,6 +61,14 @@ "title_aux": "comfy-consistency-vae" } ], + "https://github.com/MrAdamBlack/CheckProgress": [ + [ + "CHECK_PROGRESS" + ], + { + "title_aux": "CheckProgress [WIP]" + } + ], "https://github.com/PluMaZero/ComfyUI-SpaceFlower": [ [ "SpaceFlower_HangulPrompt", @@ -98,6 +106,14 @@ "title_aux": "pre-comfyui-stablsr" } ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": [ + [ + "AnyTextNode_Zho" + ], + { + "title_aux": "ComfyUI-AnyText\uff08WIP\uff09" + } + ], "https://github.com/alt-key-project/comfyui-dream-video-batches": [ [ "Blended Transition [DVB]", @@ -138,6 +154,30 @@ "title_aux": "Dream Project Video Batches [WIP]" } ], + "https://github.com/birnam/ComfyUI-GenData-Pack": [ + [ + "Checkpoint From String \ud83d\udc69\u200d\ud83d\udcbb", + "Checkpoint Rerouter \ud83d\udc69\u200d\ud83d\udcbb", + "Checkpoint Selector Stacker \ud83d\udc69\u200d\ud83d\udcbb", + "Checkpoint Selector \ud83d\udc69\u200d\ud83d\udcbb", + "Checkpoint to String \ud83d\udc69\u200d\ud83d\udcbb", + "Decode GenData \ud83d\udc69\u200d\ud83d\udcbb", + "Encode GenData \ud83d\udc69\u200d\ud83d\udcbb", + "GenData Stacker \ud83d\udc69\u200d\ud83d\udcbb", + "LoRA Stack to String \ud83d\udc69\u200d\ud83d\udcbb", + "LoRA Stacker From Prompt \ud83d\udc69\u200d\ud83d\udcbb", + "Load Checkpoints From File \ud83d\udc69\u200d\ud83d\udcbb", + "Load GenData From Dir \ud83d\udc69\u200d\ud83d\udcbb", + "Parse GenData \ud83d\udc69\u200d\ud83d\udcbb", + "Save Image From GenData \ud83d\udc69\u200d\ud83d\udcbb", + "VAE From String \ud83d\udc69\u200d\ud83d\udcbb", + "VAE to String \ud83d\udc69\u200d\ud83d\udcbb", + "\u00d7 Product CheckpointXGenDatas \ud83d\udc69\u200d\ud83d\udcbb" + ], + { + "title_aux": "Gen Data Tester [WIP]" + } + ], "https://github.com/comfyanonymous/ComfyUI": [ [ "BasicScheduler", @@ -456,9 +496,12 @@ ], "https://github.com/kadirnar/comfyui_helpers": [ [ + "CLIPSeg", "CircularVAEDecode", + "CombineMasks", "CustomKSamplerAdvancedTile", "ImageLoaderAndProcessor", + "ImageToContrastMask", "JDC_AutoContrast", "JDC_BlendImages", "JDC_BrownNoise", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index e2ba233d..a97d92ec 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -1926,6 +1926,7 @@ "CR Select Model", "CR Set Value On Binary", "CR Set Value On Boolean", + "CR Set Value on String", "CR Simple Annotations", "CR Simple Banner", "CR Simple Binary Pattern", @@ -1986,7 +1987,7 @@ ], { "author": "Suzie1", - "description": "161 custom nodes for artists, designers and animators.", + "description": "162 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2711,6 +2712,7 @@ "Aegisflow CLIP Pass", "Aegisflow Image Pass", "Aegisflow Latent Pass", + "Aegisflow Mask Pass", "Aegisflow Model Pass", "Aegisflow VAE Pass", "Aegisflow controlnet preprocessor bus", @@ -6631,6 +6633,7 @@ "easy imageSizeByLongerSide", "easy imageSizeBySide", "easy kSampler", + "easy kSamplerDownscaleUnet", "easy kSamplerInpainting", "easy kSamplerSDTurbo", "easy kSamplerTiled", From f8a55105020c6e7f336e7eeb311b4da63d42be31 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 10 Jan 2024 01:01:56 +0900 Subject: [PATCH 09/67] update DB --- model-list.json | 20 ++++++++++++ node_db/new/model-list.json | 64 +++++++++++++------------------------ 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/model-list.json b/model-list.json index 792f7ed1..47a23615 100644 --- a/model-list.json +++ b/model-list.json @@ -1590,6 +1590,26 @@ "filename": "ip-adapter-faceid_sd15_lora.safetensors", "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sd15_lora.safetensors" }, + { + "name": "ip-adapter-faceid-plusv2_sd15.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID-Plus V2 Model (SD1.5)", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plusv2_sd15.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15.bin" + }, + { + "name": "ip-adapter-faceid-plus_sd15_lora.safetensors", + "type": "lora", + "base": "SD1.5", + "save_path": "loras/ipadapter", + "description": "IP-Adapter-FaceID-Plus V2 LoRA Model (SD1.5)", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plus_sd15_lora.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15_lora.safetensors" + }, { "name": "ip-adapter_sdxl.safetensors", "type": "IP-Adapter", diff --git a/node_db/new/model-list.json b/node_db/new/model-list.json index 18b21583..e32ba77a 100644 --- a/node_db/new/model-list.json +++ b/node_db/new/model-list.json @@ -11,6 +11,27 @@ "url": "https://huggingface.co/TencentARC/MotionCtrl/resolve/main/motionctrl.pth" }, + { + "name": "ip-adapter-faceid-plusv2_sd15.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID-Plus V2 Model (SD1.5)", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plusv2_sd15.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15.bin" + }, + { + "name": "ip-adapter-faceid-plus_sd15_lora.safetensors", + "type": "lora", + "base": "SD1.5", + "save_path": "loras/ipadapter", + "description": "IP-Adapter-FaceID-Plus V2 LoRA Model (SD1.5)", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plus_sd15_lora.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15_lora.safetensors" + }, + { "name": "ControlNet-HandRefiner-pruned (inpaint-depth-hand; fp16)", "type": "controlnet", @@ -676,47 +697,6 @@ "reference": "https://huggingface.co/h94/IP-Adapter", "filename": "pytorch_model.bin", "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/image_encoder/pytorch_model.bin" - }, - - { - "name": "stabilityai/control-lora-canny-rank128.safetensors", - "type": "controlnet", - "base": "SDXL", - "save_path": "default", - "description": "Control-LoRA: canny rank128", - "reference": "https://huggingface.co/stabilityai/control-lora", - "filename": "control-lora-canny-rank128.safetensors", - "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-canny-rank128.safetensors" - }, - { - "name": "stabilityai/control-lora-depth-rank128.safetensors", - "type": "controlnet", - "base": "SDXL", - "save_path": "default", - "description": "Control-LoRA: depth rank128", - "reference": "https://huggingface.co/stabilityai/control-lora", - "filename": "control-lora-depth-rank128.safetensors", - "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-depth-rank128.safetensors" - }, - { - "name": "stabilityai/control-lora-recolor-rank128.safetensors", - "type": "controlnet", - "base": "SDXL", - "save_path": "default", - "description": "Control-LoRA: recolor rank128", - "reference": "https://huggingface.co/stabilityai/control-lora", - "filename": "control-lora-recolor-rank128.safetensors", - "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-recolor-rank128.safetensors" - }, - { - "name": "stabilityai/control-lora-sketch-rank128-metadata.safetensors", - "type": "controlnet", - "base": "SDXL", - "save_path": "default", - "description": "Control-LoRA: sketch rank128 metadata", - "reference": "https://huggingface.co/stabilityai/control-lora", - "filename": "control-lora-sketch-rank128-metadata.safetensors", - "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-sketch-rank128-metadata.safetensors" } - ] + ] } From 81ebd412a3798a2b72185bd8a1e9356c0ae001b8 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 10 Jan 2024 01:04:45 +0900 Subject: [PATCH 10/67] model list fixed --- model-list.json | 6 +++--- node_db/new/model-list.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/model-list.json b/model-list.json index 47a23615..5260b3a8 100644 --- a/model-list.json +++ b/model-list.json @@ -1601,14 +1601,14 @@ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15.bin" }, { - "name": "ip-adapter-faceid-plus_sd15_lora.safetensors", + "name": "ip-adapter-faceid-plusv2_sd15_lora.safetensors", "type": "lora", "base": "SD1.5", "save_path": "loras/ipadapter", "description": "IP-Adapter-FaceID-Plus V2 LoRA Model (SD1.5)", "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", - "filename": "ip-adapter-faceid-plus_sd15_lora.safetensors", - "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15_lora.safetensors" + "filename": "ip-adapter-faceid-plusv2_sd15_lora.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15_lora.safetensors" }, { "name": "ip-adapter_sdxl.safetensors", diff --git a/node_db/new/model-list.json b/node_db/new/model-list.json index e32ba77a..eaf193d6 100644 --- a/node_db/new/model-list.json +++ b/node_db/new/model-list.json @@ -22,14 +22,14 @@ "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15.bin" }, { - "name": "ip-adapter-faceid-plus_sd15_lora.safetensors", + "name": "ip-adapter-faceid-plusv2_sd15_lora.safetensors", "type": "lora", "base": "SD1.5", "save_path": "loras/ipadapter", "description": "IP-Adapter-FaceID-Plus V2 LoRA Model (SD1.5)", "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", - "filename": "ip-adapter-faceid-plus_sd15_lora.safetensors", - "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15_lora.safetensors" + "filename": "ip-adapter-faceid-plusv2_sd15_lora.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15_lora.safetensors" }, { From b32d63aa4cfd687783c3ce54cbd0a3d64b3a9b8b Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 10 Jan 2024 01:38:19 +0900 Subject: [PATCH 11/67] update DB --- extension-node-map.json | 7 ++++++- node_db/new/extension-node-map.json | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/extension-node-map.json b/extension-node-map.json index a97d92ec..e90643eb 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -4006,7 +4006,12 @@ ], "https://github.com/edenartlab/eden_comfy_pipelines": [ [ - "CLIP_Interrogator" + "CLIP_Interrogator", + "Filepicker", + "IMG_padder", + "IMG_scaler", + "IMG_unpadder", + "VAEDecode_to_folder" ], { "title_aux": "eden_comfy_pipelines" diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index a97d92ec..e90643eb 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -4006,7 +4006,12 @@ ], "https://github.com/edenartlab/eden_comfy_pipelines": [ [ - "CLIP_Interrogator" + "CLIP_Interrogator", + "Filepicker", + "IMG_padder", + "IMG_scaler", + "IMG_unpadder", + "VAEDecode_to_folder" ], { "title_aux": "eden_comfy_pipelines" From b61b68ee1e3eb9ee84a84e728384e07f40a886da Mon Sep 17 00:00:00 2001 From: johnqiao Date: Tue, 9 Jan 2024 14:21:18 -0700 Subject: [PATCH 12/67] Temporary remove contest related content from sharing via OpenArt. --- js/comfyui-share-openart.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/js/comfyui-share-openart.js b/js/comfyui-share-openart.js index 5a7f1273..15770907 100644 --- a/js/comfyui-share-openart.js +++ b/js/comfyui-share-openart.js @@ -264,9 +264,10 @@ export class OpenArtShareDialog extends ComfyDialog { ]); // OpenArt Contest Section + /* this.joinContestCheckbox = $el("input", { type: 'checkbox', - id: "join_contest" + id: "join_contest"s }, []) this.joinContestDescription = $el("a", { style: { @@ -290,6 +291,7 @@ export class OpenArtShareDialog extends ComfyDialog { const contestSection = $el("div", {style: sectionStyle}, [ this.joinContestLabel, ]); + */ // Message Section this.message = $el( @@ -349,7 +351,7 @@ export class OpenArtShareDialog extends ComfyDialog { outputUploadSection, this.outputsSection, additionalInputsSection, - contestSection, + // contestSection, this.message, buttonsSection, ]; @@ -486,7 +488,7 @@ export class OpenArtShareDialog extends ComfyDialog { } } - const join_contest = this.joinContestCheckbox.checked; + // const join_contest = this.joinContestCheckbox.checked; try { const response = await this.fetchApi( @@ -502,7 +504,7 @@ export class OpenArtShareDialog extends ComfyDialog { workflow_api_json: workflowAPIJSON, snapshot: current_snapshot, }, - join_contest, + // join_contest, }), }, "Uploading workflow..." From fb27da5bb77f075d68fd2e528977135191f7d196 Mon Sep 17 00:00:00 2001 From: underclockeddev <71031886+underclockeddev@users.noreply.github.com> Date: Tue, 9 Jan 2024 19:48:42 -0500 Subject: [PATCH 13/67] Update custom-node-list.json added https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index 66df6431..22070272 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4452,6 +4452,16 @@ ], "install_type": "unzip", "description": "This is a node to convert an image into a CMYK Halftone dot image." + }, + { + "author": "underclockeddev", + "title": "Preview Subselection Node for ComfyUI", + "reference": "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node", + "files": [ + "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node/raw/master/preview_subselection.py" + ], + "install_type": "copy", + "description": "A node which takes in x, y, width, height, total width, and total height, in order to accurately represent the area of an image which is covered by area-based conditioning." } ] } From a679e03fdd22382bfde541dc6f4af0f3c45b9eb7 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 10 Jan 2024 19:04:49 +0900 Subject: [PATCH 14/67] update DB --- custom-node-list.json | 22 +++++++++++----------- extension-node-map.json | 7 ++++++- node_db/new/custom-node-list.json | 12 +++++++++++- node_db/new/extension-node-map.json | 7 ++++++- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index 22070272..95535305 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4052,7 +4052,7 @@ "https://github.com/kft334/Knodes" ], "install_type": "git-clone", - "description": "Nodes: Image(s) To Websocket (Base64)" + "description": "Nodes: Image(s) To Websocket (Base64), Load Image (Base64),Load Images (Base64)" }, { "author": "MrForExample", @@ -4407,6 +4407,16 @@ "install_type": "copy", "description": "Nodes:Simple Gooogle Translator Client, Simple Mustache Parameter Switcher, Simple Latent Resolution Solver." }, + { + "author": "underclockeddev", + "title": "Preview Subselection Node for ComfyUI", + "reference": "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node", + "files": [ + "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node/raw/master/preview_subselection.py" + ], + "install_type": "copy", + "description": "A node which takes in x, y, width, height, total width, and total height, in order to accurately represent the area of an image which is covered by area-based conditioning." + }, { @@ -4452,16 +4462,6 @@ ], "install_type": "unzip", "description": "This is a node to convert an image into a CMYK Halftone dot image." - }, - { - "author": "underclockeddev", - "title": "Preview Subselection Node for ComfyUI", - "reference": "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node", - "files": [ - "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node/raw/master/preview_subselection.py" - ], - "install_type": "copy", - "description": "A node which takes in x, y, width, height, total width, and total height, in order to accurately represent the area of an image which is covered by area-based conditioning." } ] } diff --git a/extension-node-map.json b/extension-node-map.json index e90643eb..8d42dff0 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -126,6 +126,7 @@ "StringToFizz-badger", "TextListToString-badger", "VideoCut-badger", + "deleteDir-badger", "findCenterOfMask-badger", "getImageSide-badger", "getParentDir-badger", @@ -987,6 +988,7 @@ "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": [ [ "ACN_AdvancedControlNetApply", + "ACN_ControlNetLoaderWithLoraAdvanced", "ACN_DefaultUniversalWeights", "ACN_SparseCtrlIndexMethodNode", "ACN_SparseCtrlLoaderAdvanced", @@ -2188,6 +2190,7 @@ "0246.Beautify", "0246.BoxRange", "0246.CastReroute", + "0246.Cloud", "0246.Convert", "0246.Count", "0246.Highway", @@ -2475,6 +2478,9 @@ "Text Concatenate", "Text Dictionary Convert", "Text Dictionary Get", + "Text Dictionary Keys", + "Text Dictionary New", + "Text Dictionary To Text", "Text Dictionary Update", "Text File History Loader", "Text Find and Replace", @@ -2712,7 +2718,6 @@ "Aegisflow CLIP Pass", "Aegisflow Image Pass", "Aegisflow Latent Pass", - "Aegisflow Mask Pass", "Aegisflow Model Pass", "Aegisflow VAE Pass", "Aegisflow controlnet preprocessor bus", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index ac7b7378..f10fe75f 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "underclockeddev", + "title": "Preview Subselection Node for ComfyUI", + "reference": "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node", + "files": [ + "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node/raw/master/preview_subselection.py" + ], + "install_type": "copy", + "description": "A node which takes in x, y, width, height, total width, and total height, in order to accurately represent the area of an image which is covered by area-based conditioning." + }, { "author": "AInseven", "title": "ComfyUI-fastblend", @@ -140,7 +150,7 @@ "https://github.com/kft334/Knodes" ], "install_type": "git-clone", - "description": "Nodes: Image(s) To Websocket (Base64)" + "description": "Nodes: Image(s) To Websocket (Base64), Load Image (Base64),Load Images (Base64)" }, { "author": "alexopus", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index e90643eb..8d42dff0 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -126,6 +126,7 @@ "StringToFizz-badger", "TextListToString-badger", "VideoCut-badger", + "deleteDir-badger", "findCenterOfMask-badger", "getImageSide-badger", "getParentDir-badger", @@ -987,6 +988,7 @@ "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": [ [ "ACN_AdvancedControlNetApply", + "ACN_ControlNetLoaderWithLoraAdvanced", "ACN_DefaultUniversalWeights", "ACN_SparseCtrlIndexMethodNode", "ACN_SparseCtrlLoaderAdvanced", @@ -2188,6 +2190,7 @@ "0246.Beautify", "0246.BoxRange", "0246.CastReroute", + "0246.Cloud", "0246.Convert", "0246.Count", "0246.Highway", @@ -2475,6 +2478,9 @@ "Text Concatenate", "Text Dictionary Convert", "Text Dictionary Get", + "Text Dictionary Keys", + "Text Dictionary New", + "Text Dictionary To Text", "Text Dictionary Update", "Text File History Loader", "Text Find and Replace", @@ -2712,7 +2718,6 @@ "Aegisflow CLIP Pass", "Aegisflow Image Pass", "Aegisflow Latent Pass", - "Aegisflow Mask Pass", "Aegisflow Model Pass", "Aegisflow VAE Pass", "Aegisflow controlnet preprocessor bus", From c4ab7ab5bc8d0243568db2eeb4dd6091b9cf0eea Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Thu, 11 Jan 2024 11:36:51 +0900 Subject: [PATCH 15/67] update DB --- node_db/dev/custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index 217fd1ac..f2f86719 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "kadirnar", + "title": "ComfyUI-Transformers", + "reference": "https://github.com/kadirnar/ComfyUI-Transformers", + "files": [ + "https://github.com/kadirnar/ComfyUI-Transformers" + ], + "install_type": "git-clone", + "description": "Nodes:Transformers Pipeline." + }, { "author": "MrAdamBlack", "title": "CheckProgress [WIP]", From 23a190eeb91d491dee7e3025a3c7afdb49344ebb Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Thu, 11 Jan 2024 14:53:21 +0900 Subject: [PATCH 16/67] update DB --- extension-node-map.json | 18 ++++++++++++++++-- node_db/new/extension-node-map.json | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/extension-node-map.json b/extension-node-map.json index 8d42dff0..19890aee 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -688,6 +688,7 @@ "ColorPreprocessor", "DWPreprocessor", "DensePosePreprocessor", + "FacialPartColoringFromPoseKps", "FakeScribblePreprocessor", "HEDPreprocessor", "HintImageEnchance", @@ -1962,10 +1963,12 @@ "CR Text Cycler", "CR Text Input Switch", "CR Text Input Switch (4 way)", + "CR Text Length", "CR Text List", "CR Text List Cross Join", "CR Text List Simple", "CR Text List To String", + "CR Text Operation", "CR Text Replace", "CR Text Scheduler", "CR Thumbnail Preview", @@ -1989,7 +1992,7 @@ ], { "author": "Suzie1", - "description": "162 custom nodes for artists, designers and animators.", + "description": "164 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2036,7 +2039,7 @@ "FC MaskOP", "FC RemoveCannyFace", "FC ReplaceByMask", - "FCStyleLoraLoad" + "FC StyleLoraLoad" ], { "title_aux": "ComfyUI-FaceChain" @@ -5018,6 +5021,7 @@ "LoadSinglePromptFromFile //Inspire", "LoraBlockInfo //Inspire", "LoraLoaderBlockWeight //Inspire", + "MakeBasicPipe //Inspire", "Manga2Anime_LineArt_Preprocessor_Provider_for_SEGS //Inspire", "MediaPipeFaceMeshDetectorProvider //Inspire", "MediaPipe_FaceMesh_Preprocessor_Provider_for_SEGS //Inspire", @@ -6188,6 +6192,7 @@ "LoadImageNode_LCM", "Loader_SegmindVega", "OutpaintCanvasTool", + "SaveImage_Canvas", "SaveImage_LCM", "SaveImage_Puzzle", "SaveImage_PuzzleV2", @@ -6199,6 +6204,15 @@ "title_aux": "LCM_Inpaint-Outpaint_Comfy" } ], + "https://github.com/talesofai/comfyui-browser": [ + [ + "LoadImageByUrl //Browser", + "SelectInputs //Browser" + ], + { + "title_aux": "ComfyUI Browser" + } + ], "https://github.com/theUpsider/ComfyUI-Logic": [ [ "Bool", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 8d42dff0..19890aee 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -688,6 +688,7 @@ "ColorPreprocessor", "DWPreprocessor", "DensePosePreprocessor", + "FacialPartColoringFromPoseKps", "FakeScribblePreprocessor", "HEDPreprocessor", "HintImageEnchance", @@ -1962,10 +1963,12 @@ "CR Text Cycler", "CR Text Input Switch", "CR Text Input Switch (4 way)", + "CR Text Length", "CR Text List", "CR Text List Cross Join", "CR Text List Simple", "CR Text List To String", + "CR Text Operation", "CR Text Replace", "CR Text Scheduler", "CR Thumbnail Preview", @@ -1989,7 +1992,7 @@ ], { "author": "Suzie1", - "description": "162 custom nodes for artists, designers and animators.", + "description": "164 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2036,7 +2039,7 @@ "FC MaskOP", "FC RemoveCannyFace", "FC ReplaceByMask", - "FCStyleLoraLoad" + "FC StyleLoraLoad" ], { "title_aux": "ComfyUI-FaceChain" @@ -5018,6 +5021,7 @@ "LoadSinglePromptFromFile //Inspire", "LoraBlockInfo //Inspire", "LoraLoaderBlockWeight //Inspire", + "MakeBasicPipe //Inspire", "Manga2Anime_LineArt_Preprocessor_Provider_for_SEGS //Inspire", "MediaPipeFaceMeshDetectorProvider //Inspire", "MediaPipe_FaceMesh_Preprocessor_Provider_for_SEGS //Inspire", @@ -6188,6 +6192,7 @@ "LoadImageNode_LCM", "Loader_SegmindVega", "OutpaintCanvasTool", + "SaveImage_Canvas", "SaveImage_LCM", "SaveImage_Puzzle", "SaveImage_PuzzleV2", @@ -6199,6 +6204,15 @@ "title_aux": "LCM_Inpaint-Outpaint_Comfy" } ], + "https://github.com/talesofai/comfyui-browser": [ + [ + "LoadImageByUrl //Browser", + "SelectInputs //Browser" + ], + { + "title_aux": "ComfyUI Browser" + } + ], "https://github.com/theUpsider/ComfyUI-Logic": [ [ "Bool", From 62d87087f86eb4af38b4d3b6b1b923c252181b77 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Thu, 11 Jan 2024 16:19:41 +0900 Subject: [PATCH 17/67] fix: error by encoding other than utf-8 --- __init__.py | 2 +- prestartup_script.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/__init__.py b/__init__.py index 2b58c29f..3d41afaa 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,7 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [1, 25, 3] +version = [1, 25, 4] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") diff --git a/prestartup_script.py b/prestartup_script.py index 0c764c37..0328849a 100644 --- a/prestartup_script.py +++ b/prestartup_script.py @@ -135,7 +135,7 @@ try: is_start_mode = True is_import_fail_mode = False - log_file = open(f"comfyui{postfix}.log", "w", encoding="utf-8") + log_file = open(f"comfyui{postfix}.log", "w", encoding="utf-8", errors="ignore") log_lock = threading.Lock() class ComfyUIManagerLogger: @@ -338,7 +338,7 @@ if os.path.exists(restore_snapshot_path): cmd_str = [sys.executable, git_script_path, '--apply-snapshot', restore_snapshot_path] exit_code = process_wrap(cmd_str, custom_nodes_path, handler=msg_capture) - with open(restore_snapshot_path, 'r', encoding="UTF-8") as json_file: + with open(restore_snapshot_path, 'r', encoding="UTF-8", errors="ignore") as json_file: info = json.load(json_file) for url in cloned_repos: try: @@ -352,7 +352,7 @@ if os.path.exists(restore_snapshot_path): this_exit_code = 0 if os.path.exists(requirements_path): - with open(requirements_path, 'r', encoding="UTF-8") as file: + with open(requirements_path, 'r', encoding="UTF-8", errors="ignore") as file: for line in file: package_name = line.strip() if package_name and not is_installed(package_name): @@ -413,7 +413,7 @@ if os.path.exists(script_list_path): executed = set() # Read each line from the file and convert it to a list using eval - with open(script_list_path, 'r', encoding="UTF-8") as file: + with open(script_list_path, 'r', encoding="UTF-8", errors="ignore") as file: for line in file: if line in executed: continue From e3c882fbdf52622242a369fe5e5f5c0b4915b6cc Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Fri, 12 Jan 2024 01:05:41 +0900 Subject: [PATCH 18/67] update DB --- custom-node-list.json | 10 ++++++++ extension-node-map.json | 37 ++++++++++++++++++----------- node_db/dev/custom-node-list.json | 2 +- node_db/dev/extension-node-map.json | 10 ++++++++ node_db/new/custom-node-list.json | 10 ++++++++ node_db/new/extension-node-map.json | 37 ++++++++++++++++++----------- 6 files changed, 77 insertions(+), 29 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index 95535305..0481b7c1 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -2417,6 +2417,16 @@ "install_type": "git-clone", "description": "A text-to-speech plugin used under ComfyUI. It utilizes the Microsoft Speech TTS interface to convert text content into MP3 format audio files." }, + { + "author": "chflame163", + "title": "ComfyUI_WordCloud", + "reference": "https://github.com/chflame163/ComfyUI_WordCloud", + "files": [ + "https://github.com/chflame163/ComfyUI_WordCloud" + ], + "install_type": "git-clone", + "description": "Nodes:Word Cloud, Load Text File" + }, { "author": "drustan-hawk", "title": "primitive-types", diff --git a/extension-node-map.json b/extension-node-map.json index 19890aee..bdaf542c 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -272,20 +272,6 @@ "title_aux": "ComfyUI Deploy" } ], - "https://github.com/Bikecicle/ComfyUI-Waveform-Extensions/raw/main/EXT_AudioManipulation.py": [ - [ - "BatchJoinAudio", - "CutAudio", - "DuplicateAudio", - "JoinAudio", - "ResampleAudio", - "ReverseAudio", - "StretchAudio" - ], - { - "title_aux": "Waveform Extensions" - } - ], "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": [ [ "BNK_AddCLIPSDXLParams", @@ -2090,6 +2076,7 @@ "tri3d-pose-to-image", "tri3d-position-hands", "tri3d-position-parts-batch", + "tri3d-recolor", "tri3d-skin-feathered-padded-mask", "tri3d-swap-pixels" ], @@ -2204,6 +2191,7 @@ "0246.JunctionBatch", "0246.Loop", "0246.Merge", + "0246.Meta", "0246.Pick", "0246.RandomInt", "0246.Script", @@ -2719,9 +2707,13 @@ "https://github.com/aegis72/aegisflow_utility_nodes": [ [ "Aegisflow CLIP Pass", + "Aegisflow Conditioning Pass", "Aegisflow Image Pass", "Aegisflow Latent Pass", + "Aegisflow Mask Pass", "Aegisflow Model Pass", + "Aegisflow Pos/Neg Pass", + "Aegisflow SDXL Tuple Pass", "Aegisflow VAE Pass", "Aegisflow controlnet preprocessor bus", "Brightness & Contrast_Ally", @@ -3384,6 +3376,15 @@ "title_aux": "ComfyUI_MSSpeech_TTS" } ], + "https://github.com/chflame163/ComfyUI_WordCloud": [ + [ + "ComfyWordCloud", + "LoadTextFile" + ], + { + "title_aux": "ComfyUI_WordCloud" + } + ], "https://github.com/chibiace/ComfyUI-Chibi-Nodes": [ [ "ConditionText", @@ -3598,6 +3599,7 @@ "ImageSharpen", "ImageToMask", "ImageUpscaleWithModel", + "InpaintModelConditioning", "InvertMask", "JoinImageWithAlpha", "KSampler", @@ -5569,6 +5571,13 @@ [ "Combine ZHGMasks", "Cover ZHGMasks", + "From ZHG pip", + "GroundingDinoModelLoader (zhihuige)", + "GroundingDinoPIPESegment (zhihuige)", + "GroundingDinoSAMSegment (zhihuige)", + "InvertMask (zhihuige)", + "SAMModelLoader (zhihuige)", + "To ZHG pip", "ZHG FaceIndex", "ZHG GetMaskArea", "ZHG Image Levels", diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index f2f86719..a2a43ac6 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -18,7 +18,7 @@ "https://github.com/kadirnar/ComfyUI-Transformers" ], "install_type": "git-clone", - "description": "Nodes:Transformers Pipeline." + "description": "Nodes:DepthEstimation." }, { "author": "MrAdamBlack", diff --git a/node_db/dev/extension-node-map.json b/node_db/dev/extension-node-map.json index 64f8dab0..0c7ef5a3 100644 --- a/node_db/dev/extension-node-map.json +++ b/node_db/dev/extension-node-map.json @@ -237,6 +237,7 @@ "ImageSharpen", "ImageToMask", "ImageUpscaleWithModel", + "InpaintModelConditioning", "InvertMask", "JoinImageWithAlpha", "KSampler", @@ -452,6 +453,7 @@ "JN_KSamplerAdvancedParams", "JN_KSamplerFaceRestoreParams", "JN_KSamplerResizeInputParams", + "JN_KSamplerResizeMaskAreaParams", "JN_KSamplerResizeOutputParams", "JN_KSamplerSeamlessParams", "JN_KSamplerTileParams", @@ -494,6 +496,14 @@ "title_aux": "jn_node_suite_comfyui [WIP]" } ], + "https://github.com/kadirnar/ComfyUI-Transformers": [ + [ + "DepthEstimationPipeline" + ], + { + "title_aux": "ComfyUI-Transformers" + } + ], "https://github.com/kadirnar/comfyui_helpers": [ [ "CLIPSeg", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index f10fe75f..ee77e8f4 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "chflame163", + "title": "ComfyUI_WordCloud", + "reference": "https://github.com/chflame163/ComfyUI_WordCloud", + "files": [ + "https://github.com/chflame163/ComfyUI_WordCloud" + ], + "install_type": "git-clone", + "description": "Nodes:Word Cloud, Load Text File" + }, { "author": "underclockeddev", "title": "Preview Subselection Node for ComfyUI", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 19890aee..bdaf542c 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -272,20 +272,6 @@ "title_aux": "ComfyUI Deploy" } ], - "https://github.com/Bikecicle/ComfyUI-Waveform-Extensions/raw/main/EXT_AudioManipulation.py": [ - [ - "BatchJoinAudio", - "CutAudio", - "DuplicateAudio", - "JoinAudio", - "ResampleAudio", - "ReverseAudio", - "StretchAudio" - ], - { - "title_aux": "Waveform Extensions" - } - ], "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": [ [ "BNK_AddCLIPSDXLParams", @@ -2090,6 +2076,7 @@ "tri3d-pose-to-image", "tri3d-position-hands", "tri3d-position-parts-batch", + "tri3d-recolor", "tri3d-skin-feathered-padded-mask", "tri3d-swap-pixels" ], @@ -2204,6 +2191,7 @@ "0246.JunctionBatch", "0246.Loop", "0246.Merge", + "0246.Meta", "0246.Pick", "0246.RandomInt", "0246.Script", @@ -2719,9 +2707,13 @@ "https://github.com/aegis72/aegisflow_utility_nodes": [ [ "Aegisflow CLIP Pass", + "Aegisflow Conditioning Pass", "Aegisflow Image Pass", "Aegisflow Latent Pass", + "Aegisflow Mask Pass", "Aegisflow Model Pass", + "Aegisflow Pos/Neg Pass", + "Aegisflow SDXL Tuple Pass", "Aegisflow VAE Pass", "Aegisflow controlnet preprocessor bus", "Brightness & Contrast_Ally", @@ -3384,6 +3376,15 @@ "title_aux": "ComfyUI_MSSpeech_TTS" } ], + "https://github.com/chflame163/ComfyUI_WordCloud": [ + [ + "ComfyWordCloud", + "LoadTextFile" + ], + { + "title_aux": "ComfyUI_WordCloud" + } + ], "https://github.com/chibiace/ComfyUI-Chibi-Nodes": [ [ "ConditionText", @@ -3598,6 +3599,7 @@ "ImageSharpen", "ImageToMask", "ImageUpscaleWithModel", + "InpaintModelConditioning", "InvertMask", "JoinImageWithAlpha", "KSampler", @@ -5569,6 +5571,13 @@ [ "Combine ZHGMasks", "Cover ZHGMasks", + "From ZHG pip", + "GroundingDinoModelLoader (zhihuige)", + "GroundingDinoPIPESegment (zhihuige)", + "GroundingDinoSAMSegment (zhihuige)", + "InvertMask (zhihuige)", + "SAMModelLoader (zhihuige)", + "To ZHG pip", "ZHG FaceIndex", "ZHG GetMaskArea", "ZHG Image Levels", From 2c30e7afd6e04ee2d57ba9f97a6349b147756e07 Mon Sep 17 00:00:00 2001 From: chaojie Date: Fri, 12 Jan 2024 00:26:44 +0800 Subject: [PATCH 19/67] Add ComfyUI-DragNUWA --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index 0481b7c1..b715b68b 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4044,6 +4044,16 @@ "install_type": "git-clone", "description": "Nodes: Download the weights of MotionCtrl [a/motionctrl.pth](https://huggingface.co/TencentARC/MotionCtrl/blob/main/motionctrl.pth) and put it to ComfyUI/models/checkpoints" }, + { + "author": "chaojie", + "title": "ComfyUI-DragNUWA", + "reference": "https://github.com/chaojie/ComfyUI-DragNUWA", + "files": [ + "https://github.com/chaojie/ComfyUI-DragNUWA" + ], + "install_type": "git-clone", + "description": "Nodes: Download the weights of DragNUWA [a/drag_nuwa_svd.pth](https://drive.google.com/file/d/1Z4JOley0SJCb35kFF4PCc6N6P1ftfX4i/view) and put it to ComfyUI/models/checkpoints/drag_nuwa_svd.pth" + }, { "author": "alexopus", "title": "ComfyUI Image Saver", From 4598467053d5497ff6a429f5a7c79169ecaf974f Mon Sep 17 00:00:00 2001 From: tototianhao <5173315+toto000888@user.noreply.gitee.com> Date: Fri, 12 Jan 2024 02:20:33 +0800 Subject: [PATCH 20/67] update comfyui-facechain desc --- custom-node-list.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom-node-list.json b/custom-node-list.json index 0481b7c1..3e2aa218 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -2395,7 +2395,7 @@ "https://github.com/THtianhao/ComfyUI-FaceChain" ], "install_type": "git-clone", - "description": "Nodes:FC FaceFusion, FC StyleLoraLoad, FC FaceDetection, FC CropMask, FC ReplaceImage, FC CropBottom, FC CropAndPaste, FC MaskOP" + "description": "The official ComfyUI version of facechain greatly improves the speed of reasoning and has great custom process controls." }, { "author": "zer0TF", From bd829bfe856bc6ec63bcbf4ba0e3cfb485d32d25 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Fri, 12 Jan 2024 10:19:27 +0900 Subject: [PATCH 21/67] update DB --- extension-node-map.json | 28 +++++++++++++++++++++++++++- node_db/new/custom-node-list.json | 10 ++++++++++ node_db/new/extension-node-map.json | 28 +++++++++++++++++++++++++++- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/extension-node-map.json b/extension-node-map.json index bdaf542c..fd742501 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -272,6 +272,20 @@ "title_aux": "ComfyUI Deploy" } ], + "https://github.com/Bikecicle/ComfyUI-Waveform-Extensions/raw/main/EXT_AudioManipulation.py": [ + [ + "BatchJoinAudio", + "CutAudio", + "DuplicateAudio", + "JoinAudio", + "ResampleAudio", + "ReverseAudio", + "StretchAudio" + ], + { + "title_aux": "Waveform Extensions" + } + ], "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": [ [ "BNK_AddCLIPSDXLParams", @@ -1912,6 +1926,7 @@ "CR Schedule To ScheduleList", "CR Seed", "CR Seed to Int", + "CR Select Font", "CR Select Model", "CR Set Value On Binary", "CR Set Value On Boolean", @@ -1978,7 +1993,7 @@ ], { "author": "Suzie1", - "description": "164 custom nodes for artists, designers and animators.", + "description": "165 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -3351,6 +3366,15 @@ "title_aux": "ComfyUI LLaVA Captioner" } ], + "https://github.com/chaojie/ComfyUI-DragNUWA": [ + [ + "DragNUWA Run", + "Load CheckPoint DragNUWA" + ], + { + "title_aux": "ComfyUI-DragNUWA" + } + ], "https://github.com/chaojie/ComfyUI-MotionCtrl": [ [ "Load Motion Camera Preset", @@ -4657,6 +4681,8 @@ ], "https://github.com/kinfolk0117/ComfyUI_SimpleTiles": [ [ + "DynamicTileMerge", + "DynamicTileSplit", "TileCalc", "TileMerge", "TileSplit" diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index ee77e8f4..7b47e7aa 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "chaojie", + "title": "ComfyUI-DragNUWA", + "reference": "https://github.com/chaojie/ComfyUI-DragNUWA", + "files": [ + "https://github.com/chaojie/ComfyUI-DragNUWA" + ], + "install_type": "git-clone", + "description": "Nodes: Download the weights of DragNUWA [a/drag_nuwa_svd.pth](https://drive.google.com/file/d/1Z4JOley0SJCb35kFF4PCc6N6P1ftfX4i/view) and put it to ComfyUI/models/checkpoints/drag_nuwa_svd.pth" + }, { "author": "chflame163", "title": "ComfyUI_WordCloud", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index bdaf542c..fd742501 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -272,6 +272,20 @@ "title_aux": "ComfyUI Deploy" } ], + "https://github.com/Bikecicle/ComfyUI-Waveform-Extensions/raw/main/EXT_AudioManipulation.py": [ + [ + "BatchJoinAudio", + "CutAudio", + "DuplicateAudio", + "JoinAudio", + "ResampleAudio", + "ReverseAudio", + "StretchAudio" + ], + { + "title_aux": "Waveform Extensions" + } + ], "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": [ [ "BNK_AddCLIPSDXLParams", @@ -1912,6 +1926,7 @@ "CR Schedule To ScheduleList", "CR Seed", "CR Seed to Int", + "CR Select Font", "CR Select Model", "CR Set Value On Binary", "CR Set Value On Boolean", @@ -1978,7 +1993,7 @@ ], { "author": "Suzie1", - "description": "164 custom nodes for artists, designers and animators.", + "description": "165 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -3351,6 +3366,15 @@ "title_aux": "ComfyUI LLaVA Captioner" } ], + "https://github.com/chaojie/ComfyUI-DragNUWA": [ + [ + "DragNUWA Run", + "Load CheckPoint DragNUWA" + ], + { + "title_aux": "ComfyUI-DragNUWA" + } + ], "https://github.com/chaojie/ComfyUI-MotionCtrl": [ [ "Load Motion Camera Preset", @@ -4657,6 +4681,8 @@ ], "https://github.com/kinfolk0117/ComfyUI_SimpleTiles": [ [ + "DynamicTileMerge", + "DynamicTileSplit", "TileCalc", "TileMerge", "TileSplit" From 7e93258c4c3dac0e51368454c6150b9b14fd6b65 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Fri, 12 Jan 2024 14:14:34 +0900 Subject: [PATCH 22/67] feat: default_ui --- __init__.py | 25 +++++++++++++--- extension-node-map.json | 1 + js/comfyui-manager.js | 46 +++++++++++++++++++++++++++-- node_db/dev/custom-node-list.json | 12 +++++++- node_db/new/extension-node-map.json | 1 + 5 files changed, 77 insertions(+), 8 deletions(-) diff --git a/__init__.py b/__init__.py index 3d41afaa..d0e6c210 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,7 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [1, 25, 4] +version = [1, 26] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") @@ -169,7 +169,8 @@ def write_config(): 'git_exe': get_config()['git_exe'], 'channel_url': get_config()['channel_url'], 'share_option': get_config()['share_option'], - 'bypass_ssl': get_config()['bypass_ssl'] + 'bypass_ssl': get_config()['bypass_ssl'], + 'default_ui': get_config()['default_ui'], } with open(config_path, 'w') as configfile: config.write(configfile) @@ -188,6 +189,7 @@ def read_config(): 'channel_url': default_conf['channel_url'] if 'channel_url' in default_conf else 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main', 'share_option': default_conf['share_option'] if 'share_option' in default_conf else 'all', 'bypass_ssl': default_conf['bypass_ssl'] if 'bypass_ssl' in default_conf else False, + 'default_ui': default_conf['default_ui'] if 'default_ui' in default_conf else 'none', } except Exception: @@ -197,7 +199,8 @@ def read_config(): 'git_exe': '', 'channel_url': 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main', 'share_option': 'all', - 'bypass_ssl': False + 'bypass_ssl': False, + 'default_ui': 'none' } @@ -234,11 +237,15 @@ def set_preview_method(method): get_config()['preview_method'] = args.preview_method +set_preview_method(get_config()['preview_method']) + + def set_badge_mode(mode): get_config()['badge_mode'] = mode -set_preview_method(get_config()['preview_method']) +def set_default_ui_mode(mode): + get_config()['default_ui'] = mode def try_install_script(url, repo_path, install_cmd): @@ -1749,6 +1756,16 @@ async def badge_mode(request): return web.Response(status=200) +@server.PromptServer.instance.routes.get("/manager/default_ui") +async def default_ui_mode(request): + if "value" in request.rel_url.query: + set_default_ui_mode(request.rel_url.query['value']) + write_config() + else: + return web.Response(text=get_config()['default_ui'], status=200) + + return web.Response(status=200) + @server.PromptServer.instance.routes.get("/manager/channel_url_list") async def channel_url_list(request): channels = get_channel_dict() diff --git a/extension-node-map.json b/extension-node-map.json index fd742501..1998e7b6 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -5031,6 +5031,7 @@ "GlobalSampler //Inspire", "GlobalSeed //Inspire", "HEDPreprocessor_Provider_for_SEGS //Inspire", + "HyperTile //Inspire", "ImageBatchSplitter //Inspire", "InpaintPreprocessor_Provider_for_SEGS //Inspire", "KSampler //Inspire", diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index 772e45df..9a8abfc6 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -21,7 +21,7 @@ var docStyle = document.createElement('style'); docStyle.innerHTML = ` #cm-manager-dialog { width: 1000px; - height: 465px; + height: 495px; box-sizing: content-box; z-index: 10000; } @@ -74,7 +74,7 @@ docStyle.innerHTML = ` .cm-notice-board { width: 310px; padding: 0px !important; - height: 230px; + height: 260px; overflow: auto; color: var(--input-text); border: 1px solid var(--descrip-text); @@ -685,7 +685,7 @@ class ManagerMenuDialog extends ComfyDialog { api.fetchApi('/manager/preview_method') .then(response => response.text()) - .then(data => { preview_combo.value = data; }) + .then(data => { preview_combo.value = data; }); preview_combo.addEventListener('change', function (event) { api.fetchApi(`/manager/preview_method?value=${event.target.value}`); @@ -736,6 +736,21 @@ class ManagerMenuDialog extends ComfyDialog { } }); + // default ui state + let default_ui_combo = document.createElement("select"); + default_ui_combo.className = "cm-menu-combo"; + default_ui_combo.appendChild($el('option', { value: 'none', text: 'Default UI: None' }, [])); + default_ui_combo.appendChild($el('option', { value: 'history', text: 'Default UI: History' }, [])); + default_ui_combo.appendChild($el('option', { value: 'queue', text: 'Default UI: Queue' }, [])); + api.fetchApi('/manager/default_ui') + .then(response => response.text()) + .then(data => { default_ui_combo.value = data; }); + + default_ui_combo.addEventListener('change', function (event) { + api.fetchApi(`/manager/default_ui?value=${event.target.value}`); + }); + + // share let share_combo = document.createElement("select"); share_combo.className = "cm-menu-combo"; @@ -777,6 +792,7 @@ class ManagerMenuDialog extends ComfyDialog { channel_combo, preview_combo, badge_combo, + default_ui_combo, share_combo, $el("br", {}, []), $el("button.cm-button", { @@ -1171,3 +1187,27 @@ app.registerExtension({ } }, }); + + +async function set_default_ui() +{ + let res = await api.fetchApi('/manager/default_ui'); + if(res.status == 200) { + let mode = await res.text(); + switch(mode) { + case 'history': + app.ui.queue.hide(); + app.ui.history.show(); + break; + case 'queue': + app.ui.queue.show(); + app.ui.history.hide(); + break; + default: + // do nothing + break; + } + } +} + +set_default_ui(); \ No newline at end of file diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index a2a43ac6..de2a54d1 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "AIGODLIKE", + "title": "AIGODLIKE/ComfyUI-Model-Manager [WIP]", + "reference": "https://github.com/AIGODLIKE/ComfyUI-Model-Manager", + "files": [ + "https://github.com/AIGODLIKE/ComfyUI-Model-Manager" + ], + "install_type": "git-clone", + "description": "WIP" + }, { "author": "kadirnar", "title": "ComfyUI-Transformers", @@ -32,7 +42,7 @@ }, { "author": "11cafe", - "title": "ComfyUI Model Manager [WIP]", + "title": "11cafe/ComfyUI Model Manager [WIP]", "reference": "https://github.com/11cafe/model-manager-comfyui", "files": [ "https://github.com/11cafe/model-manager-comfyui" diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index fd742501..1998e7b6 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -5031,6 +5031,7 @@ "GlobalSampler //Inspire", "GlobalSeed //Inspire", "HEDPreprocessor_Provider_for_SEGS //Inspire", + "HyperTile //Inspire", "ImageBatchSplitter //Inspire", "InpaintPreprocessor_Provider_for_SEGS //Inspire", "KSampler //Inspire", From be780eda64734b2a56f44b975b66e66420645211 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Sat, 13 Jan 2024 01:11:42 +0900 Subject: [PATCH 23/67] update DB --- custom-node-list.json | 30 +++++++++ extension-node-map.json | 38 +++++++++-- node_db/new/custom-node-list.json | 90 +++++++++----------------- node_db/new/extension-node-map.json | 38 +++++++++-- node_db/tutorial/custom-node-list.json | 10 +++ 5 files changed, 136 insertions(+), 70 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index 7c2ba234..7fe2641b 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -2980,6 +2980,16 @@ "install_type": "git-clone", "description": "Nodes:XL DreamBooth LoRA, S3 Bucket LoRA" }, + { + "author": "komojini", + "title": "komojini-comfyui-nodes", + "reference": "https://github.com/komojini/komojini-comfyui-nodes", + "files": [ + "https://github.com/komojini/komojini-comfyui-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:YouTube Video Loader. Custom ComfyUI Nodes for video generation" + }, { "author": "ZHO-ZHO-ZHO", "title": "ComfyUI-Text_Image-Composite [WIP]", @@ -4164,6 +4174,26 @@ "install_type": "git-clone", "description": "fastblend for comfyui, and other nodes that I write for video2video. rebatch image, my openpose" }, + { + "author": "HebelHuber", + "title": "comfyui-enhanced-save-node", + "reference": "https://github.com/HebelHuber/comfyui-enhanced-save-node", + "files": [ + "https://github.com/HebelHuber/comfyui-enhanced-save-node" + ], + "install_type": "git-clone", + "description": "Nodes:Enhanced Save Node" + }, + { + "author": "LarryJane491", + "title": "Image-Captioning-in-ComfyUI", + "reference": "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI", + "files": [ + "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI" + ], + "install_type": "git-clone", + "description": "The LoRA Caption custom nodes, just like their name suggests, allow you to caption images so they are ready for LoRA training." + }, { diff --git a/extension-node-map.json b/extension-node-map.json index 1998e7b6..6ecdc539 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -868,6 +868,14 @@ "title_aux": "ComfyUI Floodgate" } ], + "https://github.com/HebelHuber/comfyui-enhanced-save-node": [ + [ + "EnhancedSaveNode" + ], + { + "title_aux": "comfyui-enhanced-save-node" + } + ], "https://github.com/IDGallagher/ComfyUI-IG-Nodes": [ [ "IG Analyze SSIM", @@ -1083,6 +1091,15 @@ "title_aux": "ImagesGrid" } ], + "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": [ + [ + "LoRA Caption Load", + "LoRA Caption Save" + ], + { + "title_aux": "Image-Captioning-in-ComfyUI" + } + ], "https://github.com/Lerc/canvas_tab": [ [ "Canvas_Tab", @@ -3185,7 +3202,6 @@ "HypernetworkLoader (dirty)", "ImageBatchToList", "InRange (hsv)", - "InnerCylinder (remap)", "Inpaint", "Input/String to Int Array", "KMeansColor", @@ -3199,13 +3215,14 @@ "MorphologicSkeletoning", "NaiveAutoKMeansColor", "OtsuThreshold", - "OuterCylinder (remap)", "RGB to HSV", "Rect Grab Cut", "Remap", - "RemapInsideParabolas (remap)", - "RemapInsideParabolasAdvanced (remap)", - "RemapQuadrilateral (remap)", + "RemapInsideParabolas", + "RemapInsideParabolasAdvanced", + "RemapToInnerCylinder", + "RemapToOuterCylinder", + "RemapToQuadrilateral", "Repeat Into Grid (image)", "Repeat Into Grid (latent)", "RequestInputs", @@ -4733,6 +4750,14 @@ "title_aux": "ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes" } ], + "https://github.com/komojini/komojini-comfyui-nodes": [ + [ + "YouTubeVideoLoader" + ], + { + "title_aux": "komojini-comfyui-nodes" + } + ], "https://github.com/kwaroran/abg-comfyui": [ [ "Remove Image Background (abg)" @@ -4974,6 +4999,7 @@ "SEGSOrderedFilterDetailerHookProvider", "SEGSPaste", "SEGSPreview", + "SEGSPreviewCNet", "SEGSRangeFilterDetailerHookProvider", "SEGSSwitch", "SEGSToImageList", @@ -6697,6 +6723,7 @@ "easy kSamplerInpainting", "easy kSamplerSDTurbo", "easy kSamplerTiled", + "easy latentMultiplyBySigma", "easy loraStack", "easy negative", "easy pipeIn", @@ -6715,6 +6742,7 @@ "easy showSpentTime", "easy svdLoader", "easy ultralyticsDetectorPipe", + "easy unSampler", "easy wildcards", "easy zero123Loader" ], diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 7b47e7aa..5e70b2ae 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,36 @@ }, + { + "author": "komojini", + "title": "komojini-comfyui-nodes", + "reference": "https://github.com/komojini/komojini-comfyui-nodes", + "files": [ + "https://github.com/komojini/komojini-comfyui-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:YouTube Video Loader. Custom ComfyUI Nodes for video generation" + }, + { + "author": "LarryJane491", + "title": "Image-Captioning-in-ComfyUI", + "reference": "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI", + "files": [ + "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI" + ], + "install_type": "git-clone", + "description": "The LoRA Caption custom nodes, just like their name suggests, allow you to caption images so they are ready for LoRA training." + }, + { + "author": "HebelHuber", + "title": "comfyui-enhanced-save-node", + "reference": "https://github.com/HebelHuber/comfyui-enhanced-save-node", + "files": [ + "https://github.com/HebelHuber/comfyui-enhanced-save-node" + ], + "install_type": "git-clone", + "description": "Nodes:Enhanced Save Node" + }, { "author": "chaojie", "title": "ComfyUI-DragNUWA", @@ -663,66 +693,6 @@ ], "install_type": "git-clone", "description": "Nodes: Combine ZHGMasks, Cover ZHGMasks, ZHG FaceIndex, ZHG SaveImage, ZHG SmoothEdge, ZHG GetMaskArea, ..." - }, - { - "author": "rcsaquino", - "title": "rcsaquino/comfyui-custom-nodes", - "reference": "https://github.com/rcsaquino/comfyui-custom-nodes", - "files": [ - "https://github.com/rcsaquino/comfyui-custom-nodes" - ], - "install_type": "git-clone", - "description": "Nodes: VAE Processor, VAE Loader, Background Remover" - }, - { - "author": "mozman", - "title": "ComfyUI_mozman_nodes", - "reference": "https://github.com/mozman/ComfyUI_mozman_nodes", - "files": [ - "https://github.com/mozman/ComfyUI_mozman_nodes" - ], - "install_type": "git-clone", - "description": "This extension provides styler nodes for SDXL.\n\nNOTE: Due to the dynamic nature of node name definitions, ComfyUI-Manager cannot recognize the node list from this extension. The Missing nodes and Badge features are not available for this extension." - }, - { - "author": "meap158", - "title": "ComfyUI-Background-Replacement", - "reference": "https://github.com/meap158/ComfyUI-Background-Replacement", - "files": [ - "https://github.com/meap158/ComfyUI-Background-Replacement" - ], - "install_type": "git-clone", - "description": "Instantly replace your image's background." - }, - { - "author": "florestefano1975", - "title": "comfyui-portrait-master", - "reference": "https://github.com/florestefano1975/comfyui-portrait-master", - "files": [ - "https://github.com/florestefano1975/comfyui-portrait-master" - ], - "install_type": "git-clone", - "description": "ComfyUI Portrait Master. A node designed to help AI image creators to generate prompts for human portraits." - }, - { - "author": "deroberon", - "title": "StableZero123-comfyui", - "reference": "https://github.com/deroberon/StableZero123-comfyui", - "files": [ - "https://github.com/deroberon/StableZero123-comfyui" - ], - "install_type": "git-clone", - "description": "StableZero123 is a node wrapper that uses the model and technique provided [here](https://github.com/SUDO-AI-3D/zero123plus/). It uses the Zero123plus model to generate 3D views using just one image." - }, - { - "author": "dmarx", - "title": "ComfyUI-Keyframed", - "reference": "https://github.com/dmarx/ComfyUI-Keyframed", - "files": [ - "https://github.com/dmarx/ComfyUI-Keyframed" - ], - "install_type": "git-clone", - "description": "ComfyUI nodes to facilitate parameter/prompt keyframing using comfyui nodes for defining and manipulating parameter curves. Essentially provides a ComfyUI interface to the [a/keyframed](https://github.com/dmarx/keyframed) library." } ] } diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 1998e7b6..6ecdc539 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -868,6 +868,14 @@ "title_aux": "ComfyUI Floodgate" } ], + "https://github.com/HebelHuber/comfyui-enhanced-save-node": [ + [ + "EnhancedSaveNode" + ], + { + "title_aux": "comfyui-enhanced-save-node" + } + ], "https://github.com/IDGallagher/ComfyUI-IG-Nodes": [ [ "IG Analyze SSIM", @@ -1083,6 +1091,15 @@ "title_aux": "ImagesGrid" } ], + "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": [ + [ + "LoRA Caption Load", + "LoRA Caption Save" + ], + { + "title_aux": "Image-Captioning-in-ComfyUI" + } + ], "https://github.com/Lerc/canvas_tab": [ [ "Canvas_Tab", @@ -3185,7 +3202,6 @@ "HypernetworkLoader (dirty)", "ImageBatchToList", "InRange (hsv)", - "InnerCylinder (remap)", "Inpaint", "Input/String to Int Array", "KMeansColor", @@ -3199,13 +3215,14 @@ "MorphologicSkeletoning", "NaiveAutoKMeansColor", "OtsuThreshold", - "OuterCylinder (remap)", "RGB to HSV", "Rect Grab Cut", "Remap", - "RemapInsideParabolas (remap)", - "RemapInsideParabolasAdvanced (remap)", - "RemapQuadrilateral (remap)", + "RemapInsideParabolas", + "RemapInsideParabolasAdvanced", + "RemapToInnerCylinder", + "RemapToOuterCylinder", + "RemapToQuadrilateral", "Repeat Into Grid (image)", "Repeat Into Grid (latent)", "RequestInputs", @@ -4733,6 +4750,14 @@ "title_aux": "ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes" } ], + "https://github.com/komojini/komojini-comfyui-nodes": [ + [ + "YouTubeVideoLoader" + ], + { + "title_aux": "komojini-comfyui-nodes" + } + ], "https://github.com/kwaroran/abg-comfyui": [ [ "Remove Image Background (abg)" @@ -4974,6 +4999,7 @@ "SEGSOrderedFilterDetailerHookProvider", "SEGSPaste", "SEGSPreview", + "SEGSPreviewCNet", "SEGSRangeFilterDetailerHookProvider", "SEGSSwitch", "SEGSToImageList", @@ -6697,6 +6723,7 @@ "easy kSamplerInpainting", "easy kSamplerSDTurbo", "easy kSamplerTiled", + "easy latentMultiplyBySigma", "easy loraStack", "easy negative", "easy pipeIn", @@ -6715,6 +6742,7 @@ "easy showSpentTime", "easy svdLoader", "easy ultralyticsDetectorPipe", + "easy unSampler", "easy wildcards", "easy zero123Loader" ], diff --git a/node_db/tutorial/custom-node-list.json b/node_db/tutorial/custom-node-list.json index ee843043..d7ede227 100644 --- a/node_db/tutorial/custom-node-list.json +++ b/node_db/tutorial/custom-node-list.json @@ -29,6 +29,16 @@ ], "install_type": "git-clone", "description": "Nodes:ElGogh Positive Prompt, ElGogh NEGATIVE Prompt, ElGogh Empty Latent Image, ElGogh Checkpoint Loader Simple" + }, + { + "author": "LarryJane491", + "title": "Custom-Node-Base", + "reference": "https://github.com/LarryJane491/Custom-Node-Base", + "files": [ + "https://github.com/LarryJane491/Custom-Node-Base" + ], + "install_type": "git-clone", + "description": "This project is an `empty` custom node that is already in its own folder. It serves as a base to build any custom node. Whenever you want to create a custom node, you can download that, put it in custom_nodes, then you just have to change the names and fill it with code!" } ] } \ No newline at end of file From 1bff12211ee83f40b34b1c69854ab5c416e62f3a Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Sat, 13 Jan 2024 15:27:40 +0900 Subject: [PATCH 24/67] update DB --- README.md | 1 + custom-node-list.json | 10 ++++++++++ extension-node-map.json | 17 +++++++++++++++-- node_db/dev/custom-node-list.json | 10 ++++++++++ node_db/new/custom-node-list.json | 10 ++++++++++ node_db/new/extension-node-map.json | 17 +++++++++++++++-- 6 files changed, 61 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 576cba0d..0c171d74 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,7 @@ NODE_CLASS_MAPPINGS.update({ * https://github.com/senshilabs/NINJA-plugin * https://github.com/MockbaTheBorg/Nodes * https://github.com/StartHua/Comfyui_GPT_Story +* https://github.com/NielsGercama/comfyui_customsampling ## Roadmap diff --git a/custom-node-list.json b/custom-node-list.json index 7fe2641b..eefb0aa6 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4194,6 +4194,16 @@ "install_type": "git-clone", "description": "The LoRA Caption custom nodes, just like their name suggests, allow you to caption images so they are ready for LoRA training." }, + { + "author": "Layer-norm", + "title": "Comfyui lama remover", + "reference": "https://github.com/Layer-norm/comfyui-lama-remover", + "files": [ + "https://github.com/Layer-norm/comfyui-lama-remover" + ], + "install_type": "git-clone", + "description": "A very simple ComfyUI node to remove item with mask." + }, { diff --git a/extension-node-map.json b/extension-node-map.json index 6ecdc539..c56ab8eb 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -1100,6 +1100,15 @@ "title_aux": "Image-Captioning-in-ComfyUI" } ], + "https://github.com/Layer-norm/comfyui-lama-remover": [ + [ + "LamaRemover", + "LamaRemoverIMG" + ], + { + "title_aux": "Comfyui lama remover" + } + ], "https://github.com/Lerc/canvas_tab": [ [ "Canvas_Tab", @@ -1772,6 +1781,8 @@ "CR 3D Camera Static", "CR 3D Polygon", "CR 3D Solids", + "CR 8 Channel In", + "CR 8 Channel Out", "CR ASCII Pattern", "CR Add Annotation", "CR Alternate Latents", @@ -1818,6 +1829,8 @@ "CR Cycle Styles", "CR Cycle Text", "CR Cycle Text Simple", + "CR Data Bus In", + "CR Data Bus Out", "CR Debatch Frames", "CR Display Font", "CR Draw OBJ", @@ -2010,7 +2023,7 @@ ], { "author": "Suzie1", - "description": "165 custom nodes for artists, designers and animators.", + "description": "169 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -4752,6 +4765,7 @@ ], "https://github.com/komojini/komojini-comfyui-nodes": [ [ + "ImageMerger", "YouTubeVideoLoader" ], { @@ -5767,7 +5781,6 @@ "CLIPSeg_", "CharacterInText", "ChatGPTOpenAI", - "ClipInterrogator", "Color", "CombineMasks_", "CombineSegMasks", diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index de2a54d1..ccebd5f6 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "LarryJane491", + "title": "ComfyUI-ModelUnloader", + "reference": "https://github.com/LarryJane491/ComfyUI-ModelUnloader", + "files": [ + "https://github.com/LarryJane491/ComfyUI-ModelUnloader" + ], + "install_type": "git-clone", + "description": "A simple custom node that unloads all models. Useful for developers or users who want to free some memory." + }, { "author": "AIGODLIKE", "title": "AIGODLIKE/ComfyUI-Model-Manager [WIP]", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 5e70b2ae..c61bab9f 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "Layer-norm", + "title": "Comfyui lama remover", + "reference": "https://github.com/Layer-norm/comfyui-lama-remover", + "files": [ + "https://github.com/Layer-norm/comfyui-lama-remover" + ], + "install_type": "git-clone", + "description": "A very simple ComfyUI node to remove item with mask." + }, { "author": "komojini", "title": "komojini-comfyui-nodes", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 6ecdc539..c56ab8eb 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -1100,6 +1100,15 @@ "title_aux": "Image-Captioning-in-ComfyUI" } ], + "https://github.com/Layer-norm/comfyui-lama-remover": [ + [ + "LamaRemover", + "LamaRemoverIMG" + ], + { + "title_aux": "Comfyui lama remover" + } + ], "https://github.com/Lerc/canvas_tab": [ [ "Canvas_Tab", @@ -1772,6 +1781,8 @@ "CR 3D Camera Static", "CR 3D Polygon", "CR 3D Solids", + "CR 8 Channel In", + "CR 8 Channel Out", "CR ASCII Pattern", "CR Add Annotation", "CR Alternate Latents", @@ -1818,6 +1829,8 @@ "CR Cycle Styles", "CR Cycle Text", "CR Cycle Text Simple", + "CR Data Bus In", + "CR Data Bus Out", "CR Debatch Frames", "CR Display Font", "CR Draw OBJ", @@ -2010,7 +2023,7 @@ ], { "author": "Suzie1", - "description": "165 custom nodes for artists, designers and animators.", + "description": "169 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -4752,6 +4765,7 @@ ], "https://github.com/komojini/komojini-comfyui-nodes": [ [ + "ImageMerger", "YouTubeVideoLoader" ], { @@ -5767,7 +5781,6 @@ "CLIPSeg_", "CharacterInText", "ChatGPTOpenAI", - "ClipInterrogator", "Color", "CombineMasks_", "CombineSegMasks", From 9c555cb07ee638dd6109b3af5335601458031162 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Sat, 13 Jan 2024 21:43:15 +0900 Subject: [PATCH 25/67] update DB --- custom-node-list.json | 20 ++++++++++++++++++++ extension-node-map.json | 17 +++++++++++++++++ node_db/new/custom-node-list.json | 22 +++++++++++++++++++++- node_db/new/extension-node-map.json | 17 +++++++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) diff --git a/custom-node-list.json b/custom-node-list.json index eefb0aa6..27d5ea14 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4184,6 +4184,16 @@ "install_type": "git-clone", "description": "Nodes:Enhanced Save Node" }, + { + "author": "LarryJane491", + "title": "Lora-Training-in-Comfy", + "reference": "https://github.com/LarryJane491/Lora-Training-in-Comfy", + "files": [ + "https://github.com/LarryJane491/Lora-Training-in-Comfy" + ], + "install_type": "git-clone", + "description": "If you see this message, your ComfyUI-Manager is outdated.\nRecent channel provides only the list of the latest nodes. If you want to find the complete node list, please go to the Default channel.\nMaking LoRA has never been easier!" + }, { "author": "LarryJane491", "title": "Image-Captioning-in-ComfyUI", @@ -4204,6 +4214,16 @@ "install_type": "git-clone", "description": "A very simple ComfyUI node to remove item with mask." }, + { + "author": "Taremin", + "title": "ComfyUI Prompt ExtraNetworks", + "reference": "https://github.com/Taremin/comfyui-prompt-extranetworks", + "files": [ + "https://github.com/Taremin/comfyui-prompt-extranetworks" + ], + "install_type": "git-clone", + "description": "Instead of LoraLoader or HypernetworkLoader, it receives a prompt and loads and applies LoRA or HN based on the specifications within the prompt. The main purpose of this custom node is to allow changes without reconnecting the LoraLoader node when the prompt is randomly altered, etc." + }, { diff --git a/extension-node-map.json b/extension-node-map.json index c56ab8eb..b7b9e103 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -1100,6 +1100,14 @@ "title_aux": "Image-Captioning-in-ComfyUI" } ], + "https://github.com/LarryJane491/Lora-Training-in-Comfy": [ + [ + "Lora Training in ComfyUI" + ], + { + "title_aux": "Lora-Training-in-Comfy" + } + ], "https://github.com/Layer-norm/comfyui-lama-remover": [ [ "LamaRemover", @@ -2129,6 +2137,14 @@ "title_aux": "tri3d-comfyui-nodes" } ], + "https://github.com/Taremin/comfyui-prompt-extranetworks": [ + [ + "PromptExtraNetworks" + ], + { + "title_aux": "ComfyUI Prompt ExtraNetworks" + } + ], "https://github.com/TeaCrab/ComfyUI-TeaNodes": [ [ "TC_ColorFill", @@ -6736,6 +6752,7 @@ "easy kSamplerInpainting", "easy kSamplerSDTurbo", "easy kSamplerTiled", + "easy latentCompositeMaskedWithCond", "easy latentMultiplyBySigma", "easy loraStack", "easy negative", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index c61bab9f..bea99c4d 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -6,10 +6,30 @@ "reference": "https://github.com/ltdrdata/ComfyUI-Manager", "files": [], "install_type": "git-clone", - "description": "If you see this message, your ComfyUI-Manager is outdated.\nRecent channel provides only the list of the latest nodes. If you want to find the complete node list, please go to the Default channel." + "description": "If you see this message, your ComfyUI-Manager is outdated.\nRecent channel provides only the list of the latest nodes. If you want to find the complete node list, please go to the Default channel.\nMaking LoRA has never been easier!" }, + { + "author": "LarryJane491", + "title": "Lora-Training-in-Comfy", + "reference": "https://github.com/LarryJane491/Lora-Training-in-Comfy", + "files": [ + "https://github.com/LarryJane491/Lora-Training-in-Comfy" + ], + "install_type": "git-clone", + "description": "This custom node lets you train LoRA directly in ComfyUI! By default, it saves directly in your ComfyUI lora folder. That means you just have to refresh after training (...and select the LoRA) to test it!" + }, + { + "author": "Taremin", + "title": "ComfyUI Prompt ExtraNetworks", + "reference": "https://github.com/Taremin/comfyui-prompt-extranetworks", + "files": [ + "https://github.com/Taremin/comfyui-prompt-extranetworks" + ], + "install_type": "git-clone", + "description": "Instead of LoraLoader or HypernetworkLoader, it receives a prompt and loads and applies LoRA or HN based on the specifications within the prompt. The main purpose of this custom node is to allow changes without reconnecting the LoraLoader node when the prompt is randomly altered, etc." + }, { "author": "Layer-norm", "title": "Comfyui lama remover", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index c56ab8eb..b7b9e103 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -1100,6 +1100,14 @@ "title_aux": "Image-Captioning-in-ComfyUI" } ], + "https://github.com/LarryJane491/Lora-Training-in-Comfy": [ + [ + "Lora Training in ComfyUI" + ], + { + "title_aux": "Lora-Training-in-Comfy" + } + ], "https://github.com/Layer-norm/comfyui-lama-remover": [ [ "LamaRemover", @@ -2129,6 +2137,14 @@ "title_aux": "tri3d-comfyui-nodes" } ], + "https://github.com/Taremin/comfyui-prompt-extranetworks": [ + [ + "PromptExtraNetworks" + ], + { + "title_aux": "ComfyUI Prompt ExtraNetworks" + } + ], "https://github.com/TeaCrab/ComfyUI-TeaNodes": [ [ "TC_ColorFill", @@ -6736,6 +6752,7 @@ "easy kSamplerInpainting", "easy kSamplerSDTurbo", "easy kSamplerTiled", + "easy latentCompositeMaskedWithCond", "easy latentMultiplyBySigma", "easy loraStack", "easy negative", From 629f025f04e36b8fd32eef38ce73311b3fb263f1 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 13:52:54 +0900 Subject: [PATCH 26/67] update DB --- custom-node-list.json | 11 ++- extension-node-map.json | 101 +++++++++++++------------ node_db/dev/extension-node-map.json | 8 ++ node_db/new/custom-node-list.json | 10 +++ node_db/new/extension-node-map.json | 101 +++++++++++++------------ node_db/tutorial/custom-node-list.json | 30 ++++++++ 6 files changed, 160 insertions(+), 101 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index 27d5ea14..0c381bbe 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4224,7 +4224,16 @@ "install_type": "git-clone", "description": "Instead of LoraLoader or HypernetworkLoader, it receives a prompt and loads and applies LoRA or HN based on the specifications within the prompt. The main purpose of this custom node is to allow changes without reconnecting the LoraLoader node when the prompt is randomly altered, etc." }, - + { + "author": "foxtrot-roger", + "title": "RF Nodes", + "reference": "https://github.com/foxtrot-roger/comfyui-rf-nodes", + "files": [ + "https://github.com/foxtrot-roger/comfyui-rf-nodes" + ], + "install_type": "git-clone", + "description": "A bunch of nodes that can be useful to manipulate primitive types (numbers, text, ...) Also some helpers to generate text and timestamps." + }, { "author": "Ser-Hilary", diff --git a/extension-node-map.json b/extension-node-map.json index b7b9e103..245ac1cd 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -116,6 +116,8 @@ [ "ApplyMaskToImage-badger", "CropImageByMask-badger", + "ExpandImageWithColor-badger", + "FindThickLinesFromCanny-badger", "FloatToInt-badger", "FloatToString-badger", "ImageNormalization-badger", @@ -125,6 +127,7 @@ "SegmentToMaskByPoint-badger", "StringToFizz-badger", "TextListToString-badger", + "TrimTransparentEdges-badger", "VideoCut-badger", "deleteDir-badger", "findCenterOfMask-badger", @@ -1785,16 +1788,8 @@ ], "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes": [ [ - "CR 3D Camera Drone", - "CR 3D Camera Static", - "CR 3D Polygon", - "CR 3D Solids", "CR 8 Channel In", "CR 8 Channel Out", - "CR ASCII Pattern", - "CR Add Annotation", - "CR Alternate Latents", - "CR Apply Annotations", "CR Apply ControlNet", "CR Apply LoRA Stack", "CR Apply Model Merge", @@ -1810,7 +1805,6 @@ "CR Binary To Bit List", "CR Bit Schedule", "CR Central Schedule", - "CR Check Job Complete", "CR Checker Pattern", "CR Clamp Value", "CR Clip Input Switch", @@ -1820,28 +1814,20 @@ "CR Color Tint", "CR Combine Schedules", "CR Comic Panel Templates", - "CR Comic Panel Templates (Advanced)", - "CR Comic Panel Templates Advanced", "CR Composite Text", "CR Conditioning Input Switch", "CR Conditioning Mixer", - "CR Continuous Rotation", - "CR Continuous Track", - "CR Continuous Zoom", "CR ControlNet Input Switch", "CR Current Frame", "CR Cycle Images", "CR Cycle Images Simple", "CR Cycle LoRAs", "CR Cycle Models", - "CR Cycle Styles", "CR Cycle Text", "CR Cycle Text Simple", "CR Data Bus In", "CR Data Bus Out", "CR Debatch Frames", - "CR Display Font", - "CR Draw OBJ", "CR Draw Perspective Text", "CR Draw Pie", "CR Draw Shape", @@ -1870,7 +1856,6 @@ "CR Image Pipe In", "CR Image Pipe Out", "CR Image Size", - "CR Image Transition", "CR Image XY Panel", "CR Img2Img Process Switch", "CR Increment Float", @@ -1884,19 +1869,11 @@ "CR Integer Range List", "CR Integer To String", "CR Interpolate Latents", - "CR Interpolate Prompt Weights", - "CR Interpolate Rotation", - "CR Interpolate Track", - "CR Interpolate Zoom", "CR Intertwine Lists", - "CR Job Current Frame", - "CR Job List", - "CR Job Scheduler", "CR KSampler", "CR Keyframe List", "CR Latent Batch Size", "CR Latent Input Switch", - "CR List Schedule", "CR LoRA List", "CR LoRA Stack", "CR Load Animation Frames", @@ -1911,8 +1888,6 @@ "CR Load Scheduled LoRAs", "CR Load Scheduled Models", "CR Load Text List", - "CR Load Workflow", - "CR Load XY Annotation From File", "CR Loop List", "CR Mask Text", "CR Math Operation", @@ -1924,7 +1899,6 @@ "CR Module Pipe Loader", "CR Multi Upscale Stack", "CR Multi-ControlNet Stack", - "CR Multi-Panel Meme Template", "CR Multiline Text", "CR Output Flow Frames", "CR Output Schedule To File", @@ -1933,14 +1907,11 @@ "CR Page Layout", "CR Pipe Switch", "CR Polygons", - "CR Popular Meme Templates", "CR Prompt List", "CR Prompt List Keyframes", "CR Prompt Scheduler", "CR Prompt Text", - "CR Prompt Weight Scheduler", "CR Radial Gradient", - "CR Radial Gradient Map", "CR Random Hex Color", "CR Random LoRA Stack", "CR Random Multiline Colors", @@ -1950,6 +1921,7 @@ "CR Random RGB Gradient", "CR Random Shape Pattern", "CR Random Weight LoRA", + "CR Repeater", "CR SD1.5 Aspect Ratio", "CR SDXL Aspect Ratio", "CR SDXL Base Prompt Encoder", @@ -1957,11 +1929,9 @@ "CR SDXL Prompt Mixer", "CR SDXL Style Text", "CR Save Text To File", - "CR Schedule Camera Movements", - "CR Schedule ControlNets", "CR Schedule Input Switch", - "CR Schedule Styles", "CR Schedule To ScheduleList", + "CR Seamless Checker", "CR Seed", "CR Seed to Int", "CR Select Font", @@ -1969,12 +1939,10 @@ "CR Set Value On Binary", "CR Set Value On Boolean", "CR Set Value on String", - "CR Simple Annotations", "CR Simple Banner", "CR Simple Binary Pattern", "CR Simple Binary Pattern Simple", "CR Simple Image Compare", - "CR Simple Image Watermark", "CR Simple List", "CR Simple Meme Template", "CR Simple Prompt List", @@ -1986,25 +1954,21 @@ "CR Simple Text Watermark", "CR Simple Titles", "CR Simple Value Scheduler", - "CR Spawn Workflow Instance", "CR Split String", "CR Starburst Colors", "CR Starburst Lines", "CR String To Combo", "CR String To Number", - "CR Strobe Images", "CR Style Bars", - "CR Style List", "CR Switch Model and CLIP", - "CR System TrueType Font", "CR Text", + "CR Text Blacklist", "CR Text Concatenate", "CR Text Cycler", "CR Text Input Switch", "CR Text Input Switch (4 way)", "CR Text Length", "CR Text List", - "CR Text List Cross Join", "CR Text List Simple", "CR Text List To String", "CR Text Operation", @@ -2019,19 +1983,16 @@ "CR Value Scheduler", "CR Vignette Filter", "CR XY From Folder", - "CR XY Grid", "CR XY Index", "CR XY Interpolate", "CR XY List", "CR XY Product", "CR XY Save Grid Image", - "CR XYZ Index", - "CR XYZ Interpolate", - "CR XYZ List" + "CR XYZ Index" ], { "author": "Suzie1", - "description": "169 custom nodes for artists, designers and animators.", + "description": "170 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2464,6 +2425,7 @@ "Integer place counter", "KSampler (WAS)", "KSampler Cycle", + "Latent Batch", "Latent Input Switch", "Latent Noise Injection", "Latent Size to Number", @@ -2806,7 +2768,7 @@ "https://github.com/alexopus/ComfyUI-Image-Saver": [ [ "Cfg Literal (Image Saver)", - "Checkpoint Selector (Image Saver)", + "Checkpoint Loader with Name (Image Saver)", "Float Literal (Image Saver)", "Image Saver", "Int Literal (Image Saver)", @@ -3449,7 +3411,8 @@ "https://github.com/chflame163/ComfyUI_WordCloud": [ [ "ComfyWordCloud", - "LoadTextFile" + "LoadTextFile", + "RGB_Picker" ], { "title_aux": "ComfyUI_WordCloud" @@ -3831,6 +3794,7 @@ "ExtractKeyframes+", "GetImageSize+", "ImageCASharpening+", + "ImageCompositeFromMaskBatch+", "ImageCrop+", "ImageDesaturate+", "ImageEnhanceDifference+", @@ -4263,6 +4227,38 @@ "title_aux": "As_ComfyUI_CustomNodes" } ], + "https://github.com/foxtrot-roger/comfyui-rf-nodes": [ + [ + "LogBool", + "LogFloat", + "LogInt", + "LogNumber", + "LogString", + "LogVec2", + "LogVec3", + "RF_BoolToString", + "RF_FloatToString", + "RF_IntToString", + "RF_JsonStyleLoader", + "RF_MergeLines", + "RF_NumberToString", + "RF_RangeFloat", + "RF_RangeInt", + "RF_RangeNumber", + "RF_SplitLines", + "RF_TextConcatenate", + "RF_TextInput", + "RF_TextReplace", + "RF_Timestamp", + "RF_ToString", + "RF_Vec2ToString", + "RF_Vec3ToString", + "TextLine" + ], + { + "title_aux": "RF Nodes" + } + ], "https://github.com/gemell1/ComfyUI_GMIC": [ [ "GmicCliWrapper" @@ -4782,6 +4778,7 @@ "https://github.com/komojini/komojini-comfyui-nodes": [ [ "ImageMerger", + "UltimateVideoLoader", "YouTubeVideoLoader" ], { @@ -6165,6 +6162,7 @@ "GroundingDinoModelLoader (segment anything)", "GroundingDinoSAMSegment (segment anything)", "InvertMask (segment anything)", + "IsMaskEmpty", "SAMModelLoader (segment anything)" ], { @@ -6252,6 +6250,7 @@ ], "https://github.com/taabata/LCM_Inpaint-Outpaint_Comfy": [ [ + "ComfyNodesToSaveCanvas", "FloatNumber", "FreeU_LCM", "ImageOutputToComfyNodes", @@ -6298,7 +6297,8 @@ "https://github.com/talesofai/comfyui-browser": [ [ "LoadImageByUrl //Browser", - "SelectInputs //Browser" + "SelectInputs //Browser", + "XyzPlot //Browser" ], { "title_aux": "ComfyUI Browser" @@ -6395,6 +6395,7 @@ "Iterative Mixing KSampler Advanced", "IterativeMixingSampler", "IterativeMixingScheduler", + "IterativeMixingSchedulerAdvanced", "Latent Batch Comparison Plot", "Latent Batch Statistics Plot", "MixingMaskGenerator" diff --git a/node_db/dev/extension-node-map.json b/node_db/dev/extension-node-map.json index 0c7ef5a3..6a420de5 100644 --- a/node_db/dev/extension-node-map.json +++ b/node_db/dev/extension-node-map.json @@ -61,6 +61,14 @@ "title_aux": "comfy-consistency-vae" } ], + "https://github.com/LarryJane491/ComfyUI-ModelUnloader": [ + [ + "Model Unloader" + ], + { + "title_aux": "ComfyUI-ModelUnloader" + } + ], "https://github.com/MrAdamBlack/CheckProgress": [ [ "CHECK_PROGRESS" diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index bea99c4d..28e44464 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "foxtrot-roger", + "title": "RF Nodes", + "reference": "https://github.com/foxtrot-roger/comfyui-rf-nodes", + "files": [ + "https://github.com/foxtrot-roger/comfyui-rf-nodes" + ], + "install_type": "git-clone", + "description": "A bunch of nodes that can be useful to manipulate primitive types (numbers, text, ...) Also some helpers to generate text and timestamps." + }, { "author": "LarryJane491", "title": "Lora-Training-in-Comfy", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index b7b9e103..245ac1cd 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -116,6 +116,8 @@ [ "ApplyMaskToImage-badger", "CropImageByMask-badger", + "ExpandImageWithColor-badger", + "FindThickLinesFromCanny-badger", "FloatToInt-badger", "FloatToString-badger", "ImageNormalization-badger", @@ -125,6 +127,7 @@ "SegmentToMaskByPoint-badger", "StringToFizz-badger", "TextListToString-badger", + "TrimTransparentEdges-badger", "VideoCut-badger", "deleteDir-badger", "findCenterOfMask-badger", @@ -1785,16 +1788,8 @@ ], "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes": [ [ - "CR 3D Camera Drone", - "CR 3D Camera Static", - "CR 3D Polygon", - "CR 3D Solids", "CR 8 Channel In", "CR 8 Channel Out", - "CR ASCII Pattern", - "CR Add Annotation", - "CR Alternate Latents", - "CR Apply Annotations", "CR Apply ControlNet", "CR Apply LoRA Stack", "CR Apply Model Merge", @@ -1810,7 +1805,6 @@ "CR Binary To Bit List", "CR Bit Schedule", "CR Central Schedule", - "CR Check Job Complete", "CR Checker Pattern", "CR Clamp Value", "CR Clip Input Switch", @@ -1820,28 +1814,20 @@ "CR Color Tint", "CR Combine Schedules", "CR Comic Panel Templates", - "CR Comic Panel Templates (Advanced)", - "CR Comic Panel Templates Advanced", "CR Composite Text", "CR Conditioning Input Switch", "CR Conditioning Mixer", - "CR Continuous Rotation", - "CR Continuous Track", - "CR Continuous Zoom", "CR ControlNet Input Switch", "CR Current Frame", "CR Cycle Images", "CR Cycle Images Simple", "CR Cycle LoRAs", "CR Cycle Models", - "CR Cycle Styles", "CR Cycle Text", "CR Cycle Text Simple", "CR Data Bus In", "CR Data Bus Out", "CR Debatch Frames", - "CR Display Font", - "CR Draw OBJ", "CR Draw Perspective Text", "CR Draw Pie", "CR Draw Shape", @@ -1870,7 +1856,6 @@ "CR Image Pipe In", "CR Image Pipe Out", "CR Image Size", - "CR Image Transition", "CR Image XY Panel", "CR Img2Img Process Switch", "CR Increment Float", @@ -1884,19 +1869,11 @@ "CR Integer Range List", "CR Integer To String", "CR Interpolate Latents", - "CR Interpolate Prompt Weights", - "CR Interpolate Rotation", - "CR Interpolate Track", - "CR Interpolate Zoom", "CR Intertwine Lists", - "CR Job Current Frame", - "CR Job List", - "CR Job Scheduler", "CR KSampler", "CR Keyframe List", "CR Latent Batch Size", "CR Latent Input Switch", - "CR List Schedule", "CR LoRA List", "CR LoRA Stack", "CR Load Animation Frames", @@ -1911,8 +1888,6 @@ "CR Load Scheduled LoRAs", "CR Load Scheduled Models", "CR Load Text List", - "CR Load Workflow", - "CR Load XY Annotation From File", "CR Loop List", "CR Mask Text", "CR Math Operation", @@ -1924,7 +1899,6 @@ "CR Module Pipe Loader", "CR Multi Upscale Stack", "CR Multi-ControlNet Stack", - "CR Multi-Panel Meme Template", "CR Multiline Text", "CR Output Flow Frames", "CR Output Schedule To File", @@ -1933,14 +1907,11 @@ "CR Page Layout", "CR Pipe Switch", "CR Polygons", - "CR Popular Meme Templates", "CR Prompt List", "CR Prompt List Keyframes", "CR Prompt Scheduler", "CR Prompt Text", - "CR Prompt Weight Scheduler", "CR Radial Gradient", - "CR Radial Gradient Map", "CR Random Hex Color", "CR Random LoRA Stack", "CR Random Multiline Colors", @@ -1950,6 +1921,7 @@ "CR Random RGB Gradient", "CR Random Shape Pattern", "CR Random Weight LoRA", + "CR Repeater", "CR SD1.5 Aspect Ratio", "CR SDXL Aspect Ratio", "CR SDXL Base Prompt Encoder", @@ -1957,11 +1929,9 @@ "CR SDXL Prompt Mixer", "CR SDXL Style Text", "CR Save Text To File", - "CR Schedule Camera Movements", - "CR Schedule ControlNets", "CR Schedule Input Switch", - "CR Schedule Styles", "CR Schedule To ScheduleList", + "CR Seamless Checker", "CR Seed", "CR Seed to Int", "CR Select Font", @@ -1969,12 +1939,10 @@ "CR Set Value On Binary", "CR Set Value On Boolean", "CR Set Value on String", - "CR Simple Annotations", "CR Simple Banner", "CR Simple Binary Pattern", "CR Simple Binary Pattern Simple", "CR Simple Image Compare", - "CR Simple Image Watermark", "CR Simple List", "CR Simple Meme Template", "CR Simple Prompt List", @@ -1986,25 +1954,21 @@ "CR Simple Text Watermark", "CR Simple Titles", "CR Simple Value Scheduler", - "CR Spawn Workflow Instance", "CR Split String", "CR Starburst Colors", "CR Starburst Lines", "CR String To Combo", "CR String To Number", - "CR Strobe Images", "CR Style Bars", - "CR Style List", "CR Switch Model and CLIP", - "CR System TrueType Font", "CR Text", + "CR Text Blacklist", "CR Text Concatenate", "CR Text Cycler", "CR Text Input Switch", "CR Text Input Switch (4 way)", "CR Text Length", "CR Text List", - "CR Text List Cross Join", "CR Text List Simple", "CR Text List To String", "CR Text Operation", @@ -2019,19 +1983,16 @@ "CR Value Scheduler", "CR Vignette Filter", "CR XY From Folder", - "CR XY Grid", "CR XY Index", "CR XY Interpolate", "CR XY List", "CR XY Product", "CR XY Save Grid Image", - "CR XYZ Index", - "CR XYZ Interpolate", - "CR XYZ List" + "CR XYZ Index" ], { "author": "Suzie1", - "description": "169 custom nodes for artists, designers and animators.", + "description": "170 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2464,6 +2425,7 @@ "Integer place counter", "KSampler (WAS)", "KSampler Cycle", + "Latent Batch", "Latent Input Switch", "Latent Noise Injection", "Latent Size to Number", @@ -2806,7 +2768,7 @@ "https://github.com/alexopus/ComfyUI-Image-Saver": [ [ "Cfg Literal (Image Saver)", - "Checkpoint Selector (Image Saver)", + "Checkpoint Loader with Name (Image Saver)", "Float Literal (Image Saver)", "Image Saver", "Int Literal (Image Saver)", @@ -3449,7 +3411,8 @@ "https://github.com/chflame163/ComfyUI_WordCloud": [ [ "ComfyWordCloud", - "LoadTextFile" + "LoadTextFile", + "RGB_Picker" ], { "title_aux": "ComfyUI_WordCloud" @@ -3831,6 +3794,7 @@ "ExtractKeyframes+", "GetImageSize+", "ImageCASharpening+", + "ImageCompositeFromMaskBatch+", "ImageCrop+", "ImageDesaturate+", "ImageEnhanceDifference+", @@ -4263,6 +4227,38 @@ "title_aux": "As_ComfyUI_CustomNodes" } ], + "https://github.com/foxtrot-roger/comfyui-rf-nodes": [ + [ + "LogBool", + "LogFloat", + "LogInt", + "LogNumber", + "LogString", + "LogVec2", + "LogVec3", + "RF_BoolToString", + "RF_FloatToString", + "RF_IntToString", + "RF_JsonStyleLoader", + "RF_MergeLines", + "RF_NumberToString", + "RF_RangeFloat", + "RF_RangeInt", + "RF_RangeNumber", + "RF_SplitLines", + "RF_TextConcatenate", + "RF_TextInput", + "RF_TextReplace", + "RF_Timestamp", + "RF_ToString", + "RF_Vec2ToString", + "RF_Vec3ToString", + "TextLine" + ], + { + "title_aux": "RF Nodes" + } + ], "https://github.com/gemell1/ComfyUI_GMIC": [ [ "GmicCliWrapper" @@ -4782,6 +4778,7 @@ "https://github.com/komojini/komojini-comfyui-nodes": [ [ "ImageMerger", + "UltimateVideoLoader", "YouTubeVideoLoader" ], { @@ -6165,6 +6162,7 @@ "GroundingDinoModelLoader (segment anything)", "GroundingDinoSAMSegment (segment anything)", "InvertMask (segment anything)", + "IsMaskEmpty", "SAMModelLoader (segment anything)" ], { @@ -6252,6 +6250,7 @@ ], "https://github.com/taabata/LCM_Inpaint-Outpaint_Comfy": [ [ + "ComfyNodesToSaveCanvas", "FloatNumber", "FreeU_LCM", "ImageOutputToComfyNodes", @@ -6298,7 +6297,8 @@ "https://github.com/talesofai/comfyui-browser": [ [ "LoadImageByUrl //Browser", - "SelectInputs //Browser" + "SelectInputs //Browser", + "XyzPlot //Browser" ], { "title_aux": "ComfyUI Browser" @@ -6395,6 +6395,7 @@ "Iterative Mixing KSampler Advanced", "IterativeMixingSampler", "IterativeMixingScheduler", + "IterativeMixingSchedulerAdvanced", "Latent Batch Comparison Plot", "Latent Batch Statistics Plot", "MixingMaskGenerator" diff --git a/node_db/tutorial/custom-node-list.json b/node_db/tutorial/custom-node-list.json index d7ede227..dd6b3650 100644 --- a/node_db/tutorial/custom-node-list.json +++ b/node_db/tutorial/custom-node-list.json @@ -39,6 +39,36 @@ ], "install_type": "git-clone", "description": "This project is an `empty` custom node that is already in its own folder. It serves as a base to build any custom node. Whenever you want to create a custom node, you can download that, put it in custom_nodes, then you just have to change the names and fill it with code!" + }, + { + "author": "foxtrot-roger", + "title": "comfyui-custom-nodes", + "reference": "https://github.com/foxtrot-roger/comfyui-custom-nodes", + "files": [ + "https://github.com/foxtrot-roger/comfyui-custom-nodes" + ], + "install_type": "git-clone", + "description": "Tutorial nodes" + }, + { + "author": "GraftingRayman", + "title": "ComfyUI-Trajectory", + "reference": "https://github.com/GraftingRayman/ComfyUI-Trajectory", + "files": [ + "https://github.com/GraftingRayman/ComfyUI-Trajectory" + ], + "install_type": "git-clone", + "description": "Nodes:GR Trajectory" + }, + { + "author": "wailovet", + "title": "ComfyUI-WW", + "reference": "https://github.com/wailovet/ComfyUI-WW", + "files": [ + "https://github.com/wailovet/ComfyUI-WW" + ], + "install_type": "git-clone", + "description": "Nodes:WW_ImageResize" } ] } \ No newline at end of file From 2f3e7943dfb4dfc3dfa5e8fe0bc0f631363910e7 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 14:00:57 +0900 Subject: [PATCH 27/67] improve: better style for 'a tag' in lists --- __init__.py | 2 +- js/comfyui-manager.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index d0e6c210..69499083 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,7 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [1, 26] +version = [1, 26, 1] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index 9a8abfc6..4ebc2104 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -71,6 +71,39 @@ docStyle.innerHTML = ` position: relative; } +#custom-nodes-grid a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +#custom-nodes-grid a:hover { + color: #7777FF; + text-decoration: underline; +} + +#external-models-grid a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +#external-models-grid a:hover { + color: #7777FF; + text-decoration: underline; +} + +#alternatives-grid a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +#alternatives-grid a:hover { + color: #7777FF; + text-decoration: underline; +} + .cm-notice-board { width: 310px; padding: 0px !important; From ff5db97c4a14f2c5c3ed70a9e2f29bcd4a3debe2 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 15:12:18 +0900 Subject: [PATCH 28/67] update DB --- extension-node-map.json | 3 +++ node_db/new/custom-node-list.json | 40 ----------------------------- node_db/new/extension-node-map.json | 3 +++ 3 files changed, 6 insertions(+), 40 deletions(-) diff --git a/extension-node-map.json b/extension-node-map.json index 245ac1cd..570803e6 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -5089,7 +5089,9 @@ "InpaintPreprocessor_Provider_for_SEGS //Inspire", "KSampler //Inspire", "KSamplerAdvanced //Inspire", + "KSamplerAdvancedPipe //Inspire", "KSamplerAdvancedProgress //Inspire", + "KSamplerPipe //Inspire", "KSamplerProgress //Inspire", "LatentBatchSplitter //Inspire", "LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", @@ -5798,6 +5800,7 @@ "CombineMasks_", "CombineSegMasks", "DynamicDelayProcessor", + "EmbeddingPrompt", "EnhanceImage", "FaceToMask", "FeatheredMask", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 28e44464..9f63f16a 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -693,46 +693,6 @@ ], "install_type": "git-clone", "description": "This is an Extension for ComfyUI, which allows you to control the logic flow with just one click!" - }, - { - "author": "Trung0246", - "title": "ComfyUI-0246", - "reference": "https://github.com/Trung0246/ComfyUI-0246", - "files": [ - "https://github.com/Trung0246/ComfyUI-0246" - ], - "install_type": "git-clone", - "description": "Random nodes for ComfyUI I made to solve my struggle with ComfyUI (ex: pipe, process). Have varying quality." - }, - { - "author": "violet-chen", - "title": "comfyui-psd2png", - "reference": "https://github.com/violet-chen/comfyui-psd2png", - "files": [ - "https://github.com/violet-chen/comfyui-psd2png" - ], - "install_type": "git-clone", - "description": "Nodes: Psd2Png." - }, - { - "author": "IDGallagher", - "title": "IG Interpolation Nodes", - "reference": "https://github.com/IDGallagher/ComfyUI-IG-Nodes", - "files": [ - "https://github.com/IDGallagher/ComfyUI-IG-Nodes" - ], - "install_type": "git-clone", - "description": "Custom nodes to aid in the exploration of Latent Space" - }, - { - "author": "rcfcu2000", - "title": "zhihuige-nodes-comfyui", - "reference": "https://github.com/rcfcu2000/zhihuige-nodes-comfyui", - "files": [ - "https://github.com/rcfcu2000/zhihuige-nodes-comfyui" - ], - "install_type": "git-clone", - "description": "Nodes: Combine ZHGMasks, Cover ZHGMasks, ZHG FaceIndex, ZHG SaveImage, ZHG SmoothEdge, ZHG GetMaskArea, ..." } ] } diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 245ac1cd..570803e6 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -5089,7 +5089,9 @@ "InpaintPreprocessor_Provider_for_SEGS //Inspire", "KSampler //Inspire", "KSamplerAdvanced //Inspire", + "KSamplerAdvancedPipe //Inspire", "KSamplerAdvancedProgress //Inspire", + "KSamplerPipe //Inspire", "KSamplerProgress //Inspire", "LatentBatchSplitter //Inspire", "LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", @@ -5798,6 +5800,7 @@ "CombineMasks_", "CombineSegMasks", "DynamicDelayProcessor", + "EmbeddingPrompt", "EnhanceImage", "FaceToMask", "FeatheredMask", From 019897eae2773e34a2434a93e1bfc8fadbeb2992 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 16:24:14 +0900 Subject: [PATCH 29/67] update DB --- alter-list.json | 5 +++++ custom-node-list.json | 11 +++++++++++ extension-node-map.json | 20 ++++++++++++++++++++ js/comfyui-manager.js | 9 +++++++++ node_db/new/custom-node-list.json | 10 ++++++++++ node_db/new/extension-node-map.json | 20 ++++++++++++++++++++ 6 files changed, 75 insertions(+) diff --git a/alter-list.json b/alter-list.json index f165a674..e79915c1 100644 --- a/alter-list.json +++ b/alter-list.json @@ -194,6 +194,11 @@ "id":"https://github.com/shiimizu/ComfyUI-TiledDiffusion", "tags":"multidiffusion", "description": "This extension provides custom nodes for [a/Mixture of Diffusers](https://github.com/albarji/mixture-of-diffusers) and [a/MultiDiffusion](https://github.com/omerbt/MultiDiffusion)" + }, + { + "id":"https://github.com/abyz22/image_control", + "tags":"BMAB", + "description": "This extension provides some alternative functionalities of the [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab) extension." } ] } \ No newline at end of file diff --git a/custom-node-list.json b/custom-node-list.json index 0c381bbe..56d4c25e 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4234,6 +4234,17 @@ "install_type": "git-clone", "description": "A bunch of nodes that can be useful to manipulate primitive types (numbers, text, ...) Also some helpers to generate text and timestamps." }, + { + "author": "abyz22", + "title": "image_control", + "reference": "https://github.com/abyz22/image_control", + "files": [ + "https://github.com/abyz22/image_control" + ], + "install_type": "git-clone", + "description": "Nodes:abyz22_Padding Image, abyz22_ImpactWildcardEncode, abyz22_setimageinfo, abyz22_SaveImage, abyz22_ImpactWildcardEncode_GetPrompt, abyz22_SetQueue, abyz22_drawmask, abyz22_FirstNonNull, abyz22_blendimages, abyz22_blend_onecolor" + }, + { "author": "Ser-Hilary", diff --git a/extension-node-map.json b/extension-node-map.json index 570803e6..910662fd 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -2714,6 +2714,26 @@ "title_aux": "ComfyUI-AudioScheduler" } ], + "https://github.com/abyz22/image_control": [ + [ + "abyz22_FirstNonNull", + "abyz22_FromBasicPipe_v2", + "abyz22_ImpactWildcardEncode", + "abyz22_ImpactWildcardEncode_GetPrompt", + "abyz22_Ksampler", + "abyz22_Padding Image", + "abyz22_SaveImage", + "abyz22_SetQueue", + "abyz22_ToBasicPipe", + "abyz22_blend_onecolor", + "abyz22_blendimages", + "abyz22_drawmask", + "abyz22_setimageinfo" + ], + { + "title_aux": "image_control" + } + ], "https://github.com/adieyal/comfyui-dynamicprompts": [ [ "DPCombinatorialGenerator", diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index 4ebc2104..b0dd5355 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -16,6 +16,7 @@ import { AlternativesInstaller } from "./a1111-alter-downloader.js"; import { SnapshotManager } from "./snapshot.js"; import { ModelInstaller } from "./model-downloader.js"; import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models } from "./common.js"; +import { save_as_component } from "./components-manager.js"; var docStyle = document.createElement('style'); docStyle.innerHTML = ` @@ -1184,6 +1185,14 @@ app.registerExtension({ const origGetExtraMenuOptions = node.prototype.getExtraMenuOptions; node.prototype.getExtraMenuOptions = function (_, options) { origGetExtraMenuOptions?.apply?.(this, arguments); + + if (node.comfyClass.startsWith('workflow/')) { + options.push({ + content: "Save As Component", + callback: (obj) => { save_as_component(node, app); } + }, null); + } + if (isOutputNode(node)) { const { potential_outputs } = getPotentialOutputsAndOutputNodes([this]); const hasOutput = potential_outputs.length > 0; diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 9f63f16a..13ca128c 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "abyz22", + "title": "image_control", + "reference": "https://github.com/abyz22/image_control", + "files": [ + "https://github.com/abyz22/image_control" + ], + "install_type": "git-clone", + "description": "Nodes:abyz22_Padding Image, abyz22_ImpactWildcardEncode, abyz22_setimageinfo, abyz22_SaveImage, abyz22_ImpactWildcardEncode_GetPrompt, abyz22_SetQueue, abyz22_drawmask, abyz22_FirstNonNull, abyz22_blendimages, abyz22_blend_onecolor" + }, { "author": "foxtrot-roger", "title": "RF Nodes", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 570803e6..910662fd 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -2714,6 +2714,26 @@ "title_aux": "ComfyUI-AudioScheduler" } ], + "https://github.com/abyz22/image_control": [ + [ + "abyz22_FirstNonNull", + "abyz22_FromBasicPipe_v2", + "abyz22_ImpactWildcardEncode", + "abyz22_ImpactWildcardEncode_GetPrompt", + "abyz22_Ksampler", + "abyz22_Padding Image", + "abyz22_SaveImage", + "abyz22_SetQueue", + "abyz22_ToBasicPipe", + "abyz22_blend_onecolor", + "abyz22_blendimages", + "abyz22_drawmask", + "abyz22_setimageinfo" + ], + { + "title_aux": "image_control" + } + ], "https://github.com/adieyal/comfyui-dynamicprompts": [ [ "DPCombinatorialGenerator", From 7f10374a9f7bcd9b4e4cf39efef5a580ec1bd277 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 18:48:23 +0900 Subject: [PATCH 30/67] feat: A functionality to save a group node as a component. --- __init__.py | 56 +++++++++++- components/.gitignore | 1 + js/comfyui-manager.js | 10 +- js/common.js | 2 +- js/components-manager.js | 191 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 257 insertions(+), 3 deletions(-) create mode 100644 components/.gitignore create mode 100644 js/components-manager.js diff --git a/__init__.py b/__init__.py index 69499083..9ebf8c77 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,7 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [1, 26, 1] +version = [2, 0] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") @@ -118,6 +118,7 @@ local_db_alter = os.path.join(comfyui_manager_path, "alter-list.json") local_db_custom_node_list = os.path.join(comfyui_manager_path, "custom-node-list.json") local_db_extension_node_mappings = os.path.join(comfyui_manager_path, "extension-node-map.json") git_script_path = os.path.join(os.path.dirname(__file__), "git_helper.py") +components_path = os.path.join(comfyui_manager_path, 'components') startup_script_path = os.path.join(comfyui_manager_path, "startup-scripts") config_path = os.path.join(os.path.dirname(__file__), "config.ini") @@ -1838,6 +1839,59 @@ def restart(self): return os.execv(sys.executable, [sys.executable] + sys.argv) +def sanitize_filename(input_string): + # 알파벳, 숫자, 및 밑줄 이외의 문자를 밑줄로 대체 + result_string = re.sub(r'[^a-zA-Z0-9_]', '_', input_string) + return result_string + + +@server.PromptServer.instance.routes.post("/manager/component/save") +async def save_component(request): + try: + data = await request.json() + name = data['name'] + workflow = data['workflow'] + + if not os.path.exists(components_path): + os.mkdir(components_path) + + sanitized_name = sanitize_filename(name) + + filepath = os.path.join(components_path, sanitized_name+'.json') + components = {} + if os.path.exists(filepath): + with open(filepath) as f: + components = json.load(f) + + components[name] = workflow + + with open(filepath, 'w') as f: + json.dump(components, f, indent=4, sort_keys=True) + return web.Response(text=filepath, status=200) + except: + return web.Response(status=400) + + +@server.PromptServer.instance.routes.post("/manager/component/loads") +async def load_components(request): + try: + json_files = [f for f in os.listdir(components_path) if f.endswith('.json')] + + components = {} + for json_file in json_files: + file_path = os.path.join(components_path, json_file) + with open(file_path, 'r') as file: + try: + components.update(json.load(file)) + except json.JSONDecodeError as e: + print(f"[ComfyUI-Manager] Error decoding component file in file {json_file}: {e}") + + return web.json_response(components) + except Exception as e: + print(f"[ComfyUI-Manager] failed to load components\n{e}") + return web.Response(status=400) + + @server.PromptServer.instance.routes.get("/manager/share_option") async def share_option(request): if "value" in request.rel_url.query: diff --git a/components/.gitignore b/components/.gitignore new file mode 100644 index 00000000..a6c57f5f --- /dev/null +++ b/components/.gitignore @@ -0,0 +1 @@ +*.json diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index b0dd5355..191a9695 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -16,7 +16,7 @@ import { AlternativesInstaller } from "./a1111-alter-downloader.js"; import { SnapshotManager } from "./snapshot.js"; import { ModelInstaller } from "./model-downloader.js"; import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models } from "./common.js"; -import { save_as_component } from "./components-manager.js"; +import { load_components, save_as_component } from "./components-manager.js"; var docStyle = document.createElement('style'); docStyle.innerHTML = ` @@ -1111,6 +1111,14 @@ app.registerExtension({ }); }, async setup() { + let orig_clear = app.graph.clear; + app.graph.clear = function () { + orig_clear.call(app.graph); + load_components(); + }; + + load_components(); + const menu = document.querySelector(".comfy-menu"); const separator = document.createElement("hr"); diff --git a/js/common.js b/js/common.js index f118e145..8d0997d1 100644 --- a/js/common.js +++ b/js/common.js @@ -1,5 +1,5 @@ import { app } from "../../scripts/app.js"; -import { api } from "../../scripts/api.js" +import { api } from "../../scripts/api.js"; export async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); diff --git a/js/components-manager.js b/js/components-manager.js new file mode 100644 index 00000000..c510dc03 --- /dev/null +++ b/js/components-manager.js @@ -0,0 +1,191 @@ +import { app } from "../../scripts/app.js"; +import { api } from "../../scripts/api.js" +import { sleep } from "./common.js"; +import { GroupNodeConfig, GroupNodeHandler } from "../../extensions/core/groupNode.js"; + +function storeGroupNode(name, data) { + let extra = app.graph.extra; + if (!extra) app.graph.extra = extra = {}; + let groupNodes = extra.groupNodes; + if (!groupNodes) extra.groupNodes = groupNodes = {}; + groupNodes[name] = data; +} + +export async function load_components() { + let data = await api.fetchApi('/manager/component/loads', {method: "POST"}); + let components = await data.json(); + +// while(!app.graph) { +// await sleep(100); +// } + + let start_time = Date.now(); + let failed = []; + let failed2 = []; + + for(let name in components) { + if(app.graph.extra?.groupNodes?.[name]) { + continue; + } + + let nodeData = components[name]; + + storeGroupNode(name, nodeData); + + const config = new GroupNodeConfig(name, nodeData); + while(!success) { + var success = false; + try { + await config.registerType(); + } + catch { + let elapsed_time = Date.now() - start_time; + if (elapsed_time > 5000) { + failed.push(name); + success = true; + } else { + await sleep(100); + } + } + } + + const groupNode = LiteGraph.createNode(`workflow/${name}`); + } + + // fallback1 + for(let i in failed) { + let name = failed[i]; + + if(app.graph.extra?.groupNodes?.[name]) { + continue; + } + + let nodeData = components[name]; + + storeGroupNode(name, nodeData); + + const config = new GroupNodeConfig(name, nodeData); + while(!success) { + var success = false; + try { + await config.registerType(); + } + catch { + let elapsed_time = Date.now() - start_time; + if (elapsed_time > 10000) { + failed2.push(name); + success = true; + } else { + await sleep(100); + } + } + } + + const groupNode = LiteGraph.createNode(`workflow/${name}`); + } + + // fallback2 + for(let name in failed2) { + let name = failed2[i]; + + let nodeData = components[name]; + + storeGroupNode(name, nodeData); + + const config = new GroupNodeConfig(name, nodeData); + while(!success) { + var success = false; + try { + await config.registerType(); + } + catch { + let elapsed_time = Date.now() - start_time; + if (elapsed_time > 30000) { + failed.push(name); + success = true; + } else { + await sleep(100); + } + } + } + + const groupNode = LiteGraph.createNode(`workflow/${name}`); + } +} + +export async function save_as_component(node, app) { + let pure_name = node.comfyClass.substring(9); + let subgraph = app.graph.extra?.groupNodes?.[pure_name]; + + if(!subgraph) { + app.ui.dialog.show(`Failed to retrieve the group node '${pure_name}'.`); + return; + } + + if(node.comfyClass.includes('::')) { + let component_name = node.comfyClass.substring(9); + + if(confirm(`Will you save/overwrite component '${component_name}'?`)) { + let subgraph = app.graph.extra?.groupNodes?.[component_name]; + let body = + { + name: component_name, + workflow: subgraph + }; + + const res = await api.fetchApi('/manager/component/save', { + method: "POST", + headers: { "Content-Type": "application/json", }, + body: JSON.stringify(body) + }); + + if(res.status == 200) { + storeGroupNode(name, subgraph); + const config = new GroupNodeConfig(name, subgraph); + await config.registerType(); + + let path = await res.text(); + app.ui.dialog.show(`Component '${component_name}' is saved into:\n${path}`); + } + else + app.ui.dialog.show(`Failed to save component.`); + } + + return; + } + + var prefix = prompt("To save as a component, a unique prefix is required. (e.g., the 'Impact' in Impact::MAKE_BASIC_PIPE)", "PREFIX"); + + if(!prefix) { + return; + } + + prefix = prefix.trim(); + + if(prefix == 'PREFIX') { + app.ui.dialog.show(`The placeholder 'PREFIX' isn't allowed for component prefix.`); + return; + } + + let component_name = prefix+'::'+pure_name; + let body = + { + name: component_name, + workflow: subgraph + }; + + const res = await api.fetchApi('/manager/component/save', { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(body), + }); + + if(res.status == 200) { + let path = await res.text(); + app.ui.dialog.show(`Component '${component_name}' is saved into:\n${path}`); + } + else + app.ui.dialog.show(`Failed to save component.`); +} \ No newline at end of file From 9eef99b868aa5d1470317370e50900c2e80f0e34 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 18:55:29 +0900 Subject: [PATCH 31/67] fix: direct reflect to 'Add Node' context menu after component saving --- __init__.py | 2 +- js/components-manager.js | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/__init__.py b/__init__.py index 9ebf8c77..e2c896ff 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,7 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [2, 0] +version = [2, 0, 1] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") diff --git a/js/components-manager.js b/js/components-manager.js index c510dc03..b22bc14e 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -140,8 +140,8 @@ export async function save_as_component(node, app) { }); if(res.status == 200) { - storeGroupNode(name, subgraph); - const config = new GroupNodeConfig(name, subgraph); + storeGroupNode(component_name, subgraph); + const config = new GroupNodeConfig(component_name, subgraph); await config.registerType(); let path = await res.text(); @@ -183,6 +183,10 @@ export async function save_as_component(node, app) { }); if(res.status == 200) { + storeGroupNode(component_name, subgraph); + const config = new GroupNodeConfig(component_name, subgraph); + await config.registerType(); + let path = await res.text(); app.ui.dialog.show(`Component '${component_name}' is saved into:\n${path}`); } From 3e918e838f407558b9ca5b927029d21e0dc42602 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 22:25:04 +0900 Subject: [PATCH 32/67] update DB --- extension-node-map.json | 36 +++++++++++++++++++++++++++-- node_db/new/extension-node-map.json | 36 +++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/extension-node-map.json b/extension-node-map.json index 910662fd..cab21191 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -1799,6 +1799,7 @@ "CR Aspect Ratio", "CR Aspect Ratio Banners", "CR Aspect Ratio SDXL", + "CR Aspect Ratio Social Media", "CR Batch Images From List", "CR Batch Process Switch", "CR Binary Pattern", @@ -3397,7 +3398,14 @@ "https://github.com/chaojie/ComfyUI-DragNUWA": [ [ "DragNUWA Run", - "Load CheckPoint DragNUWA" + "Get First Image", + "Get Last Image", + "Load CheckPoint DragNUWA", + "Load Pose KeyPoints", + "Loop", + "LoopEnd_IMAGE", + "LoopStart_IMAGE", + "Split Tracking Points" ], { "title_aux": "ComfyUI-DragNUWA" @@ -4152,10 +4160,33 @@ ], "https://github.com/fexli/fexli-util-node-comfyui": [ [ + "FEBCPrompt", + "FEBatchGenStringBCDocker", "FEColor2Image", "FEColorOut", + "FEDataInsertor", + "FEDataPacker", + "FEDataUnpacker", + "FEDeepClone", + "FEDictPacker", + "FEDictUnpacker", + "FEEncLoraLoader", + "FEExtraInfoAdd", + "FEGenStringBCDocker", + "FEGenStringGPT", + "FEImageNoiseGenerate", "FEImagePadForOutpaint", - "FERandomizedColor2Image" + "FEImagePadForOutpaintByImage", + "FEOperatorIf", + "FEPythonStrOp", + "FERandomLoraSelect", + "FERandomPrompt", + "FERandomizedColor2Image", + "FERandomizedColorOut", + "FERerouteWithName", + "FESaveEncryptImage", + "FETextCombine", + "FETextInput" ], { "title_aux": "fexli-util-node-comfyui" @@ -4799,6 +4830,7 @@ [ "ImageMerger", "UltimateVideoLoader", + "UltimateVideoLoader (simple)", "YouTubeVideoLoader" ], { diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 910662fd..cab21191 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -1799,6 +1799,7 @@ "CR Aspect Ratio", "CR Aspect Ratio Banners", "CR Aspect Ratio SDXL", + "CR Aspect Ratio Social Media", "CR Batch Images From List", "CR Batch Process Switch", "CR Binary Pattern", @@ -3397,7 +3398,14 @@ "https://github.com/chaojie/ComfyUI-DragNUWA": [ [ "DragNUWA Run", - "Load CheckPoint DragNUWA" + "Get First Image", + "Get Last Image", + "Load CheckPoint DragNUWA", + "Load Pose KeyPoints", + "Loop", + "LoopEnd_IMAGE", + "LoopStart_IMAGE", + "Split Tracking Points" ], { "title_aux": "ComfyUI-DragNUWA" @@ -4152,10 +4160,33 @@ ], "https://github.com/fexli/fexli-util-node-comfyui": [ [ + "FEBCPrompt", + "FEBatchGenStringBCDocker", "FEColor2Image", "FEColorOut", + "FEDataInsertor", + "FEDataPacker", + "FEDataUnpacker", + "FEDeepClone", + "FEDictPacker", + "FEDictUnpacker", + "FEEncLoraLoader", + "FEExtraInfoAdd", + "FEGenStringBCDocker", + "FEGenStringGPT", + "FEImageNoiseGenerate", "FEImagePadForOutpaint", - "FERandomizedColor2Image" + "FEImagePadForOutpaintByImage", + "FEOperatorIf", + "FEPythonStrOp", + "FERandomLoraSelect", + "FERandomPrompt", + "FERandomizedColor2Image", + "FERandomizedColorOut", + "FERerouteWithName", + "FESaveEncryptImage", + "FETextCombine", + "FETextInput" ], { "title_aux": "fexli-util-node-comfyui" @@ -4799,6 +4830,7 @@ [ "ImageMerger", "UltimateVideoLoader", + "UltimateVideoLoader (simple)", "YouTubeVideoLoader" ], { From bcdb05e03c3b72a011e1cdc5b49989a5e9cc793c Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 22:33:40 +0900 Subject: [PATCH 33/67] update DB --- custom-node-list.json | 2 +- node_db/dev/custom-node-list.json | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index 56d4c25e..a885989d 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4243,7 +4243,7 @@ ], "install_type": "git-clone", "description": "Nodes:abyz22_Padding Image, abyz22_ImpactWildcardEncode, abyz22_setimageinfo, abyz22_SaveImage, abyz22_ImpactWildcardEncode_GetPrompt, abyz22_SetQueue, abyz22_drawmask, abyz22_FirstNonNull, abyz22_blendimages, abyz22_blend_onecolor" - }, + } { diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index ccebd5f6..1135d9d2 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -9,7 +9,17 @@ "description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel." }, - + + { + "author": "poisenbery", + "title": "NudeNet-Detector-Provider [WIP]", + "reference": "https://github.com/poisenbery/NudeNet-Detector-Provider", + "files": [ + "https://github.com/poisenbery/NudeNet-Detector-Provider" + ], + "install_type": "git-clone", + "description": "BBOX Detector Provider for NudeNet. Bethesda version of NudeNet V3 detector provider to work with Impact Pack ComfyUI." + }, { "author": "LarryJane491", "title": "ComfyUI-ModelUnloader", From 8a165549f3f9d5ee65e307989be0e05975deb5bc Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 23:50:03 +0900 Subject: [PATCH 34/67] feat: support component paste feature --- README.md | 19 +++++++++++ __init__.py | 2 +- js/components-manager.js | 70 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 84 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0c171d74..c3fa0783 100644 --- a/README.md +++ b/README.md @@ -208,6 +208,25 @@ NODE_CLASS_MAPPINGS.update({ * **All scripts are executed from the root path of the corresponding custom node.** +## Component Paste +* When pasting a component from the clipboard, it supports text in the following JSON format. (text/plain) +``` +{ + "kind": "ComyUI Components", + "timestamp": , + "components": + { + : + } +} +``` +* `` Ensure that the timestamp is always unique. +* "components" should have the same structure as the content of the file stored in ComfyUI-Manager/components. + * ``: The name should be in the format `::`. + * ``: In the nodedata of the group node. + + + ## Support of missing nodes installation ![missing-menu](misc/missing-menu.png) diff --git a/__init__.py b/__init__.py index e2c896ff..b58cab44 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,7 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [2, 0, 1] +version = [2, 1] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") diff --git a/js/components-manager.js b/js/components-manager.js index b22bc14e..92e20f85 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -127,11 +127,11 @@ export async function save_as_component(node, app) { if(confirm(`Will you save/overwrite component '${component_name}'?`)) { let subgraph = app.graph.extra?.groupNodes?.[component_name]; - let body = - { - name: component_name, - workflow: subgraph - }; + let body = + { + name: component_name, + workflow: subgraph + }; const res = await api.fetchApi('/manager/component/save', { method: "POST", @@ -192,4 +192,62 @@ export async function save_as_component(node, app) { } else app.ui.dialog.show(`Failed to save component.`); -} \ No newline at end of file +} + +async function import_component(component_name, subgraph) { + if(confirm("Will you save component?\n(If canceled, the component won't be saved and can only be used within the current workflow.)")) { + let body = + { + name: component_name, + workflow: subgraph + }; + + const res = await api.fetchApi('/manager/component/save', { + method: "POST", + headers: { "Content-Type": "application/json", }, + body: JSON.stringify(body) + }); + } + + storeGroupNode(component_name, subgraph); + const config = new GroupNodeConfig(component_name, subgraph); + await config.registerType(); +} + +// Using a timestamp prevents duplicate pastes and ensures the prevention of re-deletion of litegrapheditor_clipboard. +let last_paste_timestamp = null; + +function handlePaste(e) { + let data = (e.clipboardData || window.clipboardData); + const items = data.items; + for(const item of items) { + if(item.kind == 'string' && item.type == 'text/plain') { + data = data.getData("text/plain"); + try { + let json_data = JSON.parse(data); + if(json_data.kind == 'ComfyUI Components' && last_paste_timestamp != json_data.timestamp) { + last_paste_timestamp = json_data.timestamp; + + let msg = 'Components are added:\n'; + for(let name in json_data.components) { + let subgraph = json_data.components[name]; + import_component(name, subgraph); + msg += ' - ' + name + '\n'; + } + app.ui.dialog.show(msg); + + // disable paste node + localStorage.removeItem("litegrapheditor_clipboard", null); + } + else { + console.log('This components are already pasted: ignored'); + } + } + catch { + // nothing to do + } + } + } +} + +document.addEventListener("paste", handlePaste); \ No newline at end of file From 3d92470d5ee3ee51cb6aade681b1b0f47cbd0615 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Mon, 15 Jan 2024 23:53:07 +0900 Subject: [PATCH 35/67] update DB --- custom-node-list.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom-node-list.json b/custom-node-list.json index a885989d..56d4c25e 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4243,7 +4243,7 @@ ], "install_type": "git-clone", "description": "Nodes:abyz22_Padding Image, abyz22_ImpactWildcardEncode, abyz22_setimageinfo, abyz22_SaveImage, abyz22_ImpactWildcardEncode_GetPrompt, abyz22_SetQueue, abyz22_drawmask, abyz22_FirstNonNull, abyz22_blendimages, abyz22_blend_onecolor" - } + }, { From d23b01602c39afc6a79acca4b637e502835327de Mon Sep 17 00:00:00 2001 From: johnqiao Date: Mon, 15 Jan 2024 10:11:32 -0700 Subject: [PATCH 36/67] Fix typo --- README.md | 2 +- custom-node-list.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c3fa0783..5852df2a 100644 --- a/README.md +++ b/README.md @@ -212,7 +212,7 @@ NODE_CLASS_MAPPINGS.update({ * When pasting a component from the clipboard, it supports text in the following JSON format. (text/plain) ``` { - "kind": "ComyUI Components", + "kind": "ComfyUI Components", "timestamp": , "components": { diff --git a/custom-node-list.json b/custom-node-list.json index 56d4c25e..f399fb9b 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -2868,7 +2868,7 @@ "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes" ], "install_type": "git-clone", - "description": "ComfyUI-GTSuya-Nodes is a ComyUI extension designed to add several wildcards supports into ComfyUI. Wildcards allow you to use __name__ syntax in your prompt to get a random line from a file named name.txt in a wildcards directory." + "description": "ComfyUI-GTSuya-Nodes is a ComfyUI extension designed to add several wildcards supports into ComfyUI. Wildcards allow you to use __name__ syntax in your prompt to get a random line from a file named name.txt in a wildcards directory." }, { "author": "oyvindg", @@ -3529,7 +3529,7 @@ "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration" ], "install_type": "git-clone", - + "description": "This extension is a reimagined version based on the [a/ComfyUI-QualityOfLifeSuit_Omar92](https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92) extension, and it supports integration with ChatGPT through the new OpenAI API.\nNOTE: See detailed installation instructions on the [a/repository](https://github.com/vienteck/ComfyUI-Chat-GPT-Integration)." }, { @@ -4244,7 +4244,7 @@ "install_type": "git-clone", "description": "Nodes:abyz22_Padding Image, abyz22_ImpactWildcardEncode, abyz22_setimageinfo, abyz22_SaveImage, abyz22_ImpactWildcardEncode_GetPrompt, abyz22_SetQueue, abyz22_drawmask, abyz22_FirstNonNull, abyz22_blendimages, abyz22_blend_onecolor" }, - + { "author": "Ser-Hilary", From 58a2494715a1de58c9c4c1494bc67436c45dd7e3 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Tue, 16 Jan 2024 10:45:24 +0900 Subject: [PATCH 37/67] code formatting update db --- custom-node-list.json | 10 ++ extension-node-map.json | 9 ++ js/comfyui-manager.js | 156 ++++++++++++++-------------- js/components-manager.js | 8 +- js/snapshot.js | 60 +++++------ node_db/dev/custom-node-list.json | 10 ++ node_db/new/custom-node-list.json | 10 ++ node_db/new/extension-node-map.json | 9 ++ 8 files changed, 159 insertions(+), 113 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index f399fb9b..47c50e09 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4244,6 +4244,16 @@ "install_type": "git-clone", "description": "Nodes:abyz22_Padding Image, abyz22_ImpactWildcardEncode, abyz22_setimageinfo, abyz22_SaveImage, abyz22_ImpactWildcardEncode_GetPrompt, abyz22_SetQueue, abyz22_drawmask, abyz22_FirstNonNull, abyz22_blendimages, abyz22_blend_onecolor" }, + { + "author": "HAL41", + "title": "ComfyUI aichemy nodes", + "reference": "https://github.com/HAL41/ComfyUI-aichemy-nodes", + "files": [ + "https://github.com/HAL41/ComfyUI-aichemy-nodes" + ], + "install_type": "git-clone", + "description": "Simple node to handle scaling of YOLOv8 segmentation masks" + }, { diff --git a/extension-node-map.json b/extension-node-map.json index cab21191..5ff51cbd 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -131,6 +131,7 @@ "VideoCut-badger", "deleteDir-badger", "findCenterOfMask-badger", + "frameToVideo-badger", "getImageSide-badger", "getParentDir-badger", "mkdir-badger" @@ -840,6 +841,14 @@ "title_aux": "ReActor Node for ComfyUI" } ], + "https://github.com/HAL41/ComfyUI-aichemy-nodes": [ + [ + "aichemyYOLOv8Segmentation" + ], + { + "title_aux": "ComfyUI aichemy nodes" + } + ], "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes": [ [ "Image Scale Bounding Box", diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index 191a9695..85f1781a 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -15,7 +15,7 @@ import { CustomNodesInstaller } from "./custom-nodes-downloader.js"; import { AlternativesInstaller } from "./a1111-alter-downloader.js"; import { SnapshotManager } from "./snapshot.js"; import { ModelInstaller } from "./model-downloader.js"; -import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models } from "./common.js"; +import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models } from "./common.js"; import { load_components, save_as_component } from "./components-manager.js"; var docStyle = document.createElement('style'); @@ -925,12 +925,12 @@ class ManagerMenuDialog extends ComfyDialog { ]), $el("button", { - id: 'workflowgallery-button', - type: "button", + id: 'workflowgallery-button', + type: "button", style: { - ...(localStorage.getItem("wg_last_visited") ? {height: '50px'} : {}) + ...(localStorage.getItem("wg_last_visited") ? {height: '50px'} : {}) }, - onclick: (e) => { + onclick: (e) => { const last_visited_site = localStorage.getItem("wg_last_visited") if (!!last_visited_site) { window.open(last_visited_site, "comfyui-workflow-gallery"); @@ -940,15 +940,15 @@ class ManagerMenuDialog extends ComfyDialog { }, }, [ $el("p", { - textContent: 'Workflow Gallery', - style: { - 'text-align': 'center', - 'color': 'white', - 'font-size': '18px', - 'margin': 0, - 'padding': 0, - } - }, [ + textContent: 'Workflow Gallery', + style: { + 'text-align': 'center', + 'color': 'white', + 'font-size': '18px', + 'margin': 0, + 'padding': 0, + } + }, [ $el("p", { id: 'workflowgallery-button-last-visited-label', textContent: `(${localStorage.getItem("wg_last_visited") ? localStorage.getItem("wg_last_visited").split('/')[2] : ''})`, @@ -961,10 +961,10 @@ class ManagerMenuDialog extends ComfyDialog { } }) ]), - $el("div.pysssss-workflow-arrow-2", { - id: `comfyworkflows-button-arrow`, - onclick: this.handleWorkflowGalleryButtonClick - }) + $el("div.pysssss-workflow-arrow-2", { + id: `comfyworkflows-button-arrow`, + onclick: this.handleWorkflowGalleryButtonClick + }) ]), $el("button.cm-button", { @@ -1019,10 +1019,10 @@ class ManagerMenuDialog extends ComfyDialog { this.element.style.display = "block"; } - handleWorkflowGalleryButtonClick(e) { - e.preventDefault(); - e.stopPropagation(); - LiteGraph.closeAllContextMenus(); + handleWorkflowGalleryButtonClick(e) { + e.preventDefault(); + e.stopPropagation(); + LiteGraph.closeAllContextMenus(); // Modify the style of the button so that the UI can indicate the last // visited site right away. @@ -1033,72 +1033,72 @@ class ManagerMenuDialog extends ComfyDialog { lastVisitedLabel.textContent = `(${url.split('/')[2]})`; } - const menu = new LiteGraph.ContextMenu( - [ - { - title: "Share your art", - callback: () => { - if (share_option === 'openart') { - showOpenArtShareDialog(); - return; - } else if (share_option === 'matrix' || share_option === 'comfyworkflows') { - showShareDialog(share_option); - return; - } else if (share_option === 'youml') { - showYouMLShareDialog(); - return; - } + const menu = new LiteGraph.ContextMenu( + [ + { + title: "Share your art", + callback: () => { + if (share_option === 'openart') { + showOpenArtShareDialog(); + return; + } else if (share_option === 'matrix' || share_option === 'comfyworkflows') { + showShareDialog(share_option); + return; + } else if (share_option === 'youml') { + showYouMLShareDialog(); + return; + } - if (!ShareDialogChooser.instance) { - ShareDialogChooser.instance = new ShareDialogChooser(); - } - ShareDialogChooser.instance.show(); - }, - }, - { - title: "Open 'openart.ai'", + if (!ShareDialogChooser.instance) { + ShareDialogChooser.instance = new ShareDialogChooser(); + } + ShareDialogChooser.instance.show(); + }, + }, + { + title: "Open 'openart.ai'", callback: () => { const url = "https://openart.ai/workflows/dev"; localStorage.setItem("wg_last_visited", url); window.open(url, "comfyui-workflow-gallery"); modifyButtonStyle(url); }, - }, - { - title: "Open 'youml.com'", - callback: () => { - const url = "https://youml.com/?from=comfyui-share"; - localStorage.setItem("wg_last_visited", url); - window.open(url, "comfyui-workflow-gallery"); - modifyButtonStyle(url); - }, - }, - { - title: "Open 'comfyworkflows.com'", - callback: () => { + }, + { + title: "Open 'youml.com'", + callback: () => { + const url = "https://youml.com/?from=comfyui-share"; + localStorage.setItem("wg_last_visited", url); + window.open(url, "comfyui-workflow-gallery"); + modifyButtonStyle(url); + }, + }, + { + title: "Open 'comfyworkflows.com'", + callback: () => { const url = "https://comfyworkflows.com/"; localStorage.setItem("wg_last_visited", url); - window.open(url, "comfyui-workflow-gallery"); + window.open(url, "comfyui-workflow-gallery"); modifyButtonStyle(url); - }, - }, - { - title: "Close", - callback: () => { - LiteGraph.closeAllContextMenus(); - }, - } - ], - { - event: e, - scale: 1.3, - }, - window - ); - // set the id so that we can override the context menu's z-index to be above the comfyui manager menu - menu.root.id = "workflowgallery-button-menu"; - menu.root.classList.add("pysssss-workflow-popup-2"); - } + }, + }, + { + title: "Close", + callback: () => { + LiteGraph.closeAllContextMenus(); + }, + } + ], + { + event: e, + scale: 1.3, + }, + window + ); + // set the id so that we can override the context menu's z-index to be above the comfyui manager menu + menu.root.id = "workflowgallery-button-menu"; + menu.root.classList.add("pysssss-workflow-popup-2"); + } } diff --git a/js/components-manager.js b/js/components-manager.js index 92e20f85..8f90955c 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -15,10 +15,6 @@ export async function load_components() { let data = await api.fetchApi('/manager/component/loads', {method: "POST"}); let components = await data.json(); -// while(!app.graph) { -// await sleep(100); -// } - let start_time = Date.now(); let failed = []; let failed2 = []; @@ -250,4 +246,6 @@ function handlePaste(e) { } } -document.addEventListener("paste", handlePaste); \ No newline at end of file +document.addEventListener("paste", handlePaste); + + diff --git a/js/snapshot.js b/js/snapshot.js index e4a720ea..2e26df55 100644 --- a/js/snapshot.js +++ b/js/snapshot.js @@ -6,7 +6,7 @@ import { manager_instance, rebootAPI } from "./common.js"; async function restore_snapshot(target) { if(SnapshotManager.instance) { - try { + try { const response = await api.fetchApi(`/snapshot/restore?target=${target}`, { cache: "no-store" }); if(response.status == 400) { app.ui.dialog.show(`Restore snapshot failed: ${target.title} / ${exception}`); @@ -30,7 +30,7 @@ async function restore_snapshot(target) { async function remove_snapshot(target) { if(SnapshotManager.instance) { - try { + try { const response = await api.fetchApi(`/snapshot/remove?target=${target}`, { cache: "no-store" }); if(response.status == 400) { app.ui.dialog.show(`Remove snapshot failed: ${target.title} / ${exception}`); @@ -52,20 +52,20 @@ async function remove_snapshot(target) { } async function save_current_snapshot() { - try { - const response = await api.fetchApi('/snapshot/save', { cache: "no-store" }); - app.ui.dialog.close(); - return true; - } - catch(exception) { - app.ui.dialog.show(`Backup snapshot failed: ${exception}`); - app.ui.dialog.element.style.zIndex = 10010; - return false; - } - finally { - await SnapshotManager.instance.invalidateControl(); - SnapshotManager.instance.updateMessage("
Current snapshot saved."); - } + try { + const response = await api.fetchApi('/snapshot/save', { cache: "no-store" }); + app.ui.dialog.close(); + return true; + } + catch(exception) { + app.ui.dialog.show(`Backup snapshot failed: ${exception}`); + app.ui.dialog.element.style.zIndex = 10010; + return false; + } + finally { + await SnapshotManager.instance.invalidateControl(); + SnapshotManager.instance.updateMessage("
Current snapshot saved."); + } } async function getSnapshotList() { @@ -97,7 +97,7 @@ export class SnapshotManager extends ComfyDialog { async remove_item() { caller.disableButtons(); - await caller.invalidateControl(); + await caller.invalidateControl(); } createControls() { @@ -151,14 +151,14 @@ export class SnapshotManager extends ComfyDialog { var grid = document.createElement('table'); grid.setAttribute('id', 'snapshot-list-grid'); - var thead = document.createElement('thead'); - var tbody = document.createElement('tbody'); + var thead = document.createElement('thead'); + var tbody = document.createElement('tbody'); var headerRow = document.createElement('tr'); thead.style.position = "sticky"; thead.style.top = "0px"; - thead.style.borderCollapse = "collapse"; - thead.style.tableLayout = "fixed"; + thead.style.borderCollapse = "collapse"; + thead.style.tableLayout = "fixed"; var header1 = document.createElement('th'); header1.innerHTML = '  ID  '; @@ -170,7 +170,7 @@ export class SnapshotManager extends ComfyDialog { header_button.innerHTML = 'Action'; header_button.style.width = "100px"; - thead.appendChild(headerRow); + thead.appendChild(headerRow); headerRow.appendChild(header1); headerRow.appendChild(header2); headerRow.appendChild(header_button); @@ -231,17 +231,17 @@ export class SnapshotManager extends ComfyDialog { this.grid_rows[i] = {data:data, control:dataRow}; } - let self = this; + let self = this; const panel = document.createElement('div'); - panel.style.width = "100%"; + panel.style.width = "100%"; panel.appendChild(grid); - function handleResize() { - const parentHeight = self.element.clientHeight; - const gridHeight = parentHeight - 200; + function handleResize() { + const parentHeight = self.element.clientHeight; + const gridHeight = parentHeight - 200; - grid.style.height = gridHeight + "px"; - } + grid.style.height = gridHeight + "px"; + } window.addEventListener("resize", handleResize); grid.style.position = "relative"; @@ -253,7 +253,7 @@ export class SnapshotManager extends ComfyDialog { this.element.style.width = "80%"; this.element.appendChild(panel); - handleResize(); + handleResize(); } async createBottomControls() { diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index 1135d9d2..07951860 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI PhotoMaker (WIP)", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/PhotoMaker](https://github.com/TencentARC/PhotoMaker) for ComfyUI(WIP) Testing……" + }, { "author": "poisenbery", "title": "NudeNet-Detector-Provider [WIP]", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 13ca128c..2fa96461 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "HAL41", + "title": "ComfyUI aichemy nodes", + "reference": "https://github.com/HAL41/ComfyUI-aichemy-nodes", + "files": [ + "https://github.com/HAL41/ComfyUI-aichemy-nodes" + ], + "install_type": "git-clone", + "description": "Simple node to handle scaling of YOLOv8 segmentation masks" + }, { "author": "abyz22", "title": "image_control", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index cab21191..5ff51cbd 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -131,6 +131,7 @@ "VideoCut-badger", "deleteDir-badger", "findCenterOfMask-badger", + "frameToVideo-badger", "getImageSide-badger", "getParentDir-badger", "mkdir-badger" @@ -840,6 +841,14 @@ "title_aux": "ReActor Node for ComfyUI" } ], + "https://github.com/HAL41/ComfyUI-aichemy-nodes": [ + [ + "aichemyYOLOv8Segmentation" + ], + { + "title_aux": "ComfyUI aichemy nodes" + } + ], "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes": [ [ "Image Scale Bounding Box", From 84f91189455f318ffef9a062634978a608bd0a55 Mon Sep 17 00:00:00 2001 From: chaojie Date: Tue, 16 Jan 2024 17:16:18 +0800 Subject: [PATCH 38/67] Update custom-node-list.json --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index 47c50e09..eab47c0a 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4054,6 +4054,16 @@ "install_type": "git-clone", "description": "Nodes: Download the weights of MotionCtrl [a/motionctrl.pth](https://huggingface.co/TencentARC/MotionCtrl/blob/main/motionctrl.pth) and put it to ComfyUI/models/checkpoints" }, + { + "author": "chaojie", + "title": "ComfyUI-MotionCtrl-SVD", + "reference": "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD", + "files": [ + "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD" + ], + "install_type": "git-clone", + "description": "Nodes: Download the weights of MotionCtrl-SVD [a/motionctrl_svd.ckpt](https://huggingface.co/TencentARC/MotionCtrl/blob/main/motionctrl_svd.ckpt) and put it to ComfyUI/models/checkpoints" + }, { "author": "chaojie", "title": "ComfyUI-DragNUWA", From 4bdf7aabe4e0f7d71067db2eb2f5834815d3d29e Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Tue, 16 Jan 2024 16:03:40 +0900 Subject: [PATCH 39/67] feat: component pack builder - support drag & drop - add node if single component importing --- README.md | 14 +- __init__.py | 11 +- components/.gitignore | 1 + js/comfyui-manager.js | 61 ++++- js/common.js | 11 +- js/components-manager.js | 570 +++++++++++++++++++++++++++++++++------ misc/Impact.pack | 444 ++++++++++++++++++++++++++++++ 7 files changed, 1022 insertions(+), 90 deletions(-) create mode 100644 misc/Impact.pack diff --git a/README.md b/README.md index 5852df2a..7787bd2b 100644 --- a/README.md +++ b/README.md @@ -223,9 +223,17 @@ NODE_CLASS_MAPPINGS.update({ * `` Ensure that the timestamp is always unique. * "components" should have the same structure as the content of the file stored in ComfyUI-Manager/components. * ``: The name should be in the format `::`. - * ``: In the nodedata of the group node. - - + * ``: In the nodedata of the group node. + * ``: Only two formats are allowed: `major.minor.patch` or `major.minor`. (e.g. `1.0`, `2.2.1`) + * ``: Saved time + * ``: If the packname is not empty, the category becomes packname/workflow, and it is saved in the .pack file in ComfyUI-Manager/components. + * ``: If there is neither a category nor a packname, it is saved in the components category. + ``` + "version":"1.0", + "datetime": 1705390656516, + "packname": "mypack", + "category": "util/pipe", + ``` ## Support of missing nodes installation diff --git a/__init__.py b/__init__.py index b58cab44..83cc0999 100644 --- a/__init__.py +++ b/__init__.py @@ -1855,9 +1855,12 @@ async def save_component(request): if not os.path.exists(components_path): os.mkdir(components_path) - sanitized_name = sanitize_filename(name) + if 'packname' in workflow and workflow['packname'] != '': + sanitized_name = sanitize_filename(workflow['packname'])+'.pack' + else: + sanitized_name = sanitize_filename(name)+'.json' - filepath = os.path.join(components_path, sanitized_name+'.json') + filepath = os.path.join(components_path, sanitized_name) components = {} if os.path.exists(filepath): with open(filepath) as f: @@ -1876,12 +1879,14 @@ async def save_component(request): async def load_components(request): try: json_files = [f for f in os.listdir(components_path) if f.endswith('.json')] + pack_files = [f for f in os.listdir(components_path) if f.endswith('.pack')] components = {} - for json_file in json_files: + for json_file in json_files + pack_files: file_path = os.path.join(components_path, json_file) with open(file_path, 'r') as file: try: + # When there is a conflict between the .pack and the .json, the pack takes precedence and overrides. components.update(json.load(file)) except json.JSONDecodeError as e: print(f"[ComfyUI-Manager] Error decoding component file in file {json_file}: {e}") diff --git a/components/.gitignore b/components/.gitignore index a6c57f5f..fab7a5e2 100644 --- a/components/.gitignore +++ b/components/.gitignore @@ -1 +1,2 @@ *.json +*.pack diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index 85f1781a..fe1233da 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -16,7 +16,7 @@ import { AlternativesInstaller } from "./a1111-alter-downloader.js"; import { SnapshotManager } from "./snapshot.js"; import { ModelInstaller } from "./model-downloader.js"; import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models } from "./common.js"; -import { load_components, save_as_component } from "./components-manager.js"; +import { ComponentBuilderDialog, load_components } from "./components-manager.js"; var docStyle = document.createElement('style'); docStyle.innerHTML = ` @@ -27,6 +27,35 @@ docStyle.innerHTML = ` z-index: 10000; } +.cb-widget { + width: 400px; + height: 25px; + box-sizing: border-box; + z-index: 10000; + margin-top: 10px; + margin-bottom: 5px; +} + +.cb-widget-input { + width: 305px; + height: 25px; + box-sizing: border-box; +} +.cb-widget-input:disabled { + background-color: #444444; + color: white; +} + +.cb-widget-input-label { + width: 90px; + height: 25px; + box-sizing: border-box; + color: white; + text-align: right; + display: inline-block; + margin-right: 5px; +} + .cm-menu-container { column-gap: 20px; display: flex; @@ -251,6 +280,16 @@ const style = ` box-sizing: border-box; } +.cb-node-label { + width: 400px; + height:28px; + color: black; + background-color: #777777; + font-size: 18px; + text-align: center; + font-weight: bold; +} + #cm-close-button { width: calc(100% - 65px); bottom: 10px; @@ -258,6 +297,16 @@ const style = ` overflow: hidden; } +#cm-save-button { + width: calc(100% - 65px); + bottom:40px; + position: absolute; + overflow: hidden; +} +#cm-save-button:disabled { + background-color: #444444; +} + .pysssss-workflow-arrow-2 { position: absolute; top: 0; @@ -873,7 +922,7 @@ class ManagerMenuDialog extends ComfyDialog { }) ]), ]; -} + } createControlsRight() { const elts = [ @@ -1197,7 +1246,13 @@ app.registerExtension({ if (node.comfyClass.startsWith('workflow/')) { options.push({ content: "Save As Component", - callback: (obj) => { save_as_component(node, app); } + callback: (obj) => { + if (!ComponentBuilderDialog.instance) { + ComponentBuilderDialog.instance = new ComponentBuilderDialog(); + } + ComponentBuilderDialog.instance.target_node = node; + ComponentBuilderDialog.instance.show(); + } }, null); } diff --git a/js/common.js b/js/common.js index 8d0997d1..a45bf75f 100644 --- a/js/common.js +++ b/js/common.js @@ -48,8 +48,7 @@ export async function install_checked_custom_node(grid_rows, target_i, caller, m }); if(response.status == 400) { - app.ui.dialog.show(`${mode} failed: ${target.title}`); - app.ui.dialog.element.style.zIndex = 10010; + show_message(`${mode} failed: ${target.title}`); continue; } @@ -64,8 +63,7 @@ export async function install_checked_custom_node(grid_rows, target_i, caller, m } if(failed != '') { - app.ui.dialog.show(`${mode} failed: ${failed}`); - app.ui.dialog.element.style.zIndex = 10010; + show_message(`${mode} failed: ${failed}`); } await caller.invalidateControl(); @@ -160,4 +158,9 @@ export async function free_models() { app.ui.dialog.show('Unloading of models failed.

Installed ComfyUI may be an outdated version.') } app.ui.dialog.element.style.zIndex = 10010; +} + +export function show_message(msg) { + app.ui.dialog.show(msg); + app.ui.dialog.element.style.zIndex = 10010; } \ No newline at end of file diff --git a/js/components-manager.js b/js/components-manager.js index 8f90955c..d8bd84f5 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -1,7 +1,32 @@ import { app } from "../../scripts/app.js"; import { api } from "../../scripts/api.js" -import { sleep } from "./common.js"; +import { sleep, show_message } from "./common.js"; import { GroupNodeConfig, GroupNodeHandler } from "../../extensions/core/groupNode.js"; +import { ComfyDialog, $el } from "../../scripts/ui.js"; + +let pack_map = {}; +let rpack_map = {}; + +function isValidVersionString(version) { + const versionPattern = /^(\d+)\.(\d+)(\.(\d+))?$/; + + const match = version.match(versionPattern); + + return match !== null && + parseInt(match[1], 10) >= 0 && + parseInt(match[2], 10) >= 0 && + (!match[3] || parseInt(match[4], 10) >= 0); +} + +function register_pack_map(name, data) { + if(data.packname) { + pack_map[data.packname] = name; + rpack_map[name] = [data.packname, data.category, data.version, data.datetime]; + } + else { + rpack_map[name] = [data.packname, data.category, data.version, data.datetime]; + } +} function storeGroupNode(name, data) { let extra = app.graph.extra; @@ -9,6 +34,8 @@ function storeGroupNode(name, data) { let groupNodes = extra.groupNodes; if (!groupNodes) extra.groupNodes = groupNodes = {}; groupNodes[name] = data; + + register_pack_map(name, data); } export async function load_components() { @@ -21,6 +48,22 @@ export async function load_components() { for(let name in components) { if(app.graph.extra?.groupNodes?.[name]) { + if(data) { + let data = components[name]; + + let category = data.packname; + if(data.category) { + category += "/" + data.category; + } + if(category == '') { + category = 'components'; + } + + const config = new GroupNodeConfig(name, data); + await config.registerType(category); + + register_pack_map(name, data); + } continue; } @@ -32,7 +75,16 @@ export async function load_components() { while(!success) { var success = false; try { - await config.registerType(); + let category = nodeData.packname; + if(nodeData.category) { + category += "/" + nodeData.category; + } + if(category == '') { + category = 'components'; + } + + await config.registerType(category); + register_pack_map(name, nodeData); } catch { let elapsed_time = Date.now() - start_time; @@ -44,8 +96,6 @@ export async function load_components() { } } } - - const groupNode = LiteGraph.createNode(`workflow/${name}`); } // fallback1 @@ -64,7 +114,16 @@ export async function load_components() { while(!success) { var success = false; try { - await config.registerType(); + let category = nodeData.packname; + if(nodeData.workflow.category) { + category += "/" + nodeData.category; + } + if(category == '') { + category = 'components'; + } + + await config.registerType(category); + register_pack_map(name, nodeData); } catch { let elapsed_time = Date.now() - start_time; @@ -76,8 +135,6 @@ export async function load_components() { } } } - - const groupNode = LiteGraph.createNode(`workflow/${name}`); } // fallback2 @@ -91,8 +148,18 @@ export async function load_components() { const config = new GroupNodeConfig(name, nodeData); while(!success) { var success = false; + try { - await config.registerType(); + let category = nodeData.workflow.packname; + if(nodeData.workflow.category) { + category += "/" + nodeData.category; + } + if(category == '') { + category = 'components'; + } + + await config.registerType(category); + register_pack_map(name, nodeData); } catch { let elapsed_time = Date.now() - start_time; @@ -104,72 +171,31 @@ export async function load_components() { } } } - - const groupNode = LiteGraph.createNode(`workflow/${name}`); } } -export async function save_as_component(node, app) { - let pure_name = node.comfyClass.substring(9); - let subgraph = app.graph.extra?.groupNodes?.[pure_name]; +async function save_as_component(node, version, prefix, nodename, packname, category) { + let component_name = `${prefix}::${nodename}`; + let subgraph = app.graph.extra?.groupNodes?.[component_name]; if(!subgraph) { - app.ui.dialog.show(`Failed to retrieve the group node '${pure_name}'.`); - return; + subgraph = app.graph.extra?.groupNodes?.[node.comfyClass.substring(9)]; } - if(node.comfyClass.includes('::')) { - let component_name = node.comfyClass.substring(9); + subgraph.version = version; + subgraph.datetime = Date.now(); + subgraph.packname = packname; + subgraph.category = category; - if(confirm(`Will you save/overwrite component '${component_name}'?`)) { - let subgraph = app.graph.extra?.groupNodes?.[component_name]; - let body = - { - name: component_name, - workflow: subgraph - }; - - const res = await api.fetchApi('/manager/component/save', { - method: "POST", - headers: { "Content-Type": "application/json", }, - body: JSON.stringify(body) - }); - - if(res.status == 200) { - storeGroupNode(component_name, subgraph); - const config = new GroupNodeConfig(component_name, subgraph); - await config.registerType(); - - let path = await res.text(); - app.ui.dialog.show(`Component '${component_name}' is saved into:\n${path}`); - } - else - app.ui.dialog.show(`Failed to save component.`); - } - - return; - } - - var prefix = prompt("To save as a component, a unique prefix is required. (e.g., the 'Impact' in Impact::MAKE_BASIC_PIPE)", "PREFIX"); - - if(!prefix) { - return; - } - - prefix = prefix.trim(); - - if(prefix == 'PREFIX') { - app.ui.dialog.show(`The placeholder 'PREFIX' isn't allowed for component prefix.`); - return; - } - - let component_name = prefix+'::'+pure_name; let body = { name: component_name, workflow: subgraph }; + pack_map[packname] = component_name; + rpack_map[component_name] = [body.pack_name, body.category, body.version, body.datetime]; + const res = await api.fetchApi('/manager/component/save', { method: "POST", headers: { @@ -181,21 +207,30 @@ export async function save_as_component(node, app) { if(res.status == 200) { storeGroupNode(component_name, subgraph); const config = new GroupNodeConfig(component_name, subgraph); - await config.registerType(); + + let category = body.workflow.packname; + if(body.workflow.category) { + category += "/" + body.workflow.category; + } + if(category == '') { + category = 'components'; + } + + await config.registerType(category); let path = await res.text(); - app.ui.dialog.show(`Component '${component_name}' is saved into:\n${path}`); + show_message(`Component '${component_name}' is saved into:\n${path}`); } else - app.ui.dialog.show(`Failed to save component.`); + show_message(`Failed to save component.`); } -async function import_component(component_name, subgraph) { - if(confirm("Will you save component?\n(If canceled, the component won't be saved and can only be used within the current workflow.)")) { +async function import_component(component_name, component, mode) { + if(mode) { let body = { name: component_name, - workflow: subgraph + workflow: component }; const res = await api.fetchApi('/manager/component/save', { @@ -205,14 +240,142 @@ async function import_component(component_name, subgraph) { }); } - storeGroupNode(component_name, subgraph); - const config = new GroupNodeConfig(component_name, subgraph); - await config.registerType(); + let category = component.packname; + if(component.category) { + category += "/" + component.category; + } + if(category == '') { + category = 'components'; + } + + storeGroupNode(component_name, component); + const config = new GroupNodeConfig(component_name, component); + await config.registerType(category); } // Using a timestamp prevents duplicate pastes and ensures the prevention of re-deletion of litegrapheditor_clipboard. let last_paste_timestamp = null; +function versionCompare(v1, v2) { + let ver1; + let ver2; + if(v1 && v1 != '') { + ver1 = v1.split('.'); + ver1[0] = parseInt(ver1[0]); + ver1[1] = parseInt(ver1[1]); + if(ver1.length == 2) + ver1.push(0); + else + ver1[2] = parseInt(ver2[2]); + } + else { + ver1 = [0,0,0]; + } + + if(v2 && v2 != '') { + ver2 = v2.split('.'); + ver2[0] = parseInt(ver2[0]); + ver2[1] = parseInt(ver2[1]); + if(ver2.length == 2) + ver2.push(0); + else + ver2[2] = parseInt(ver2[2]); + } + else { + ver2 = [0,0,0]; + } + + if(ver1[0] > ver2[0]) + return -1; + else if(ver1[0] < ver2[0]) + return 1; + + if(ver1[1] > ver2[1]) + return -1; + else if(ver1[1] < ver2[1]) + return 1; + + if(ver1[2] > ver2[2]) + return -1; + else if(ver1[2] < ver2[2]) + return 1; + + return 0; +} + +function checkVersion(name, component) { + let msg = ''; + if(rpack_map[name]) { + let old_version = rpack_map[name][2]; + if(!old_version || old_version == '') { + msg = ` '${name}' Upgrade (V0.0 -> V${component.version})`; + } + else { + let c = versionCompare(old_version, component.version); + if(c < 0) { + msg = ` '${name}' Downgrade (V${old_version} -> V${component.version})`; + } + else if(c > 0) { + msg = ` '${name}' Upgrade (V${old_version} -> V${component.version})`; + } + else { + msg = ` '${name}' Same version (V${component.version})`; + } + } + } + else { + msg = `'${name}' NEW (V${component.version})`; + } + + return msg; +} + +function handle_import_components(components) { + let msg = 'Components:\n'; + let cnt = 0; + for(let name in components) { + let component = components[name]; + let v = checkVersion(name, component); + + if(cnt < 10) { + msg += v + '\n'; + } + else if (cnt == 10) { + msg += '...\n'; + } + else { + // do nothing + } + + cnt++; + } + + let last_name = null; + msg += '\nWill you load components?\n'; + if(confirm(msg)) { + let mode = confirm('\nWill you save components?\n(cancel=load without save)'); + + for(let name in components) { + let component = components[name]; + import_component(name, component, mode); + last_name = name; + } + + if(mode) { + show_message('Components are saved.'); + } + else { + show_message('Components are loaded.'); + } + } + + if(cnt == 1 && last_name) { + const node = LiteGraph.createNode(`workflow/${last_name}`); + node.pos = [app.canvas.graph_mouse[0], app.canvas.graph_mouse[1]]; + app.canvas.graph.add(node, false); + } +} + function handlePaste(e) { let data = (e.clipboardData || window.clipboardData); const items = data.items; @@ -223,14 +386,7 @@ function handlePaste(e) { let json_data = JSON.parse(data); if(json_data.kind == 'ComfyUI Components' && last_paste_timestamp != json_data.timestamp) { last_paste_timestamp = json_data.timestamp; - - let msg = 'Components are added:\n'; - for(let name in json_data.components) { - let subgraph = json_data.components[name]; - import_component(name, subgraph); - msg += ' - ' + name + '\n'; - } - app.ui.dialog.show(msg); + handle_import_components(json_data.components); // disable paste node localStorage.removeItem("litegrapheditor_clipboard", null); @@ -249,3 +405,263 @@ function handlePaste(e) { document.addEventListener("paste", handlePaste); +export class ComponentBuilderDialog extends ComfyDialog { + constructor() { + super(); + } + + clear() { + while (this.element.children.length) { + this.element.removeChild(this.element.children[0]); + } + } + + show() { + this.invalidateControl(); + + this.element.style.display = "block"; + this.element.style.zIndex = 10001; + this.element.style.width = "500px"; + this.element.style.height = "450px"; + } + + invalidateControl() { + this.clear(); + + let self = this; + + const close_button = $el("button", { id: "cm-close-button", type: "button", textContent: "Close", onclick: () => self.close() }); + this.save_button = $el("button", + { id: "cm-save-button", type: "button", textContent: "Save", onclick: () => + { + save_as_component(self.target_node, self.version_string.value.trim(), self.node_prefix.value.trim(), + self.getNodeName(), self.getPackName(), self.category.value.trim()); + } + }); + + let default_nodename = this.target_node.comfyClass.substring(9).trim(); + + let default_packname = ""; + if(rpack_map[default_nodename]) { + default_packname = rpack_map[default_nodename][0]; + } + if(!default_packname) { + default_packname = ''; + } + + let default_category = ""; + if(rpack_map[default_nodename]) { + default_category = rpack_map[default_nodename][1]; + } + if(!default_category) { + default_category = ''; + } + + if(rpack_map[default_nodename]) { + this.default_ver = rpack_map[default_nodename][2]; + } + if(!this.default_ver) { + this.default_ver = '0.0'; + } + + let delimiterIndex = default_nodename.indexOf('::'); + let default_prefix = ""; + if(delimiterIndex != -1) { + default_prefix = default_nodename.substring(0, delimiterIndex); + default_nodename = default_nodename.substring(delimiterIndex + 2); + } + + if(!default_prefix) { + this.save_button.disabled = true; + } + + this.pack_list = this.createPackListCombo(); + + let version_string = this.createLabeledInput('input version (e.g. 1.0)', '*Version : ', this.default_ver); + this.version_string = version_string[1]; + this.version_string.disabled = true; + + let node_prefix = this.createLabeledInput('input node prefix (e.g. mypack)', '*Prefix : ', default_prefix); + this.node_prefix = node_prefix[1]; + + let manual_nodename = this.createLabeledInput('input node name (e.g. MAKE_BASIC_PIPE)', 'Nodename : ', default_nodename); + this.manual_nodename = manual_nodename[1]; + + let manual_packname = this.createLabeledInput('input pack name (e.g. mypack)', 'Packname : ', default_packname); + this.manual_packname = manual_packname[1]; + + let category = this.createLabeledInput('input category (e.g. util/pipe)', 'Category : ', default_category); + this.category = category[1]; + + this.node_label = this.createNodeLabel(); + + let author_mode = this.createAuthorModeCheck(); + this.author_mode = author_mode[0]; + + const content = + $el("div.comfy-modal-content", + [ + $el("tr.cm-title", {}, [ + $el("font", {size:6, color:"white"}, [`ComfyUI-Manager: Component Builder`])] + ), + $el("br", {}, []), + $el("div.cm-menu-container", + [ + author_mode[0], + author_mode[1], + category[0], + node_prefix[0], + manual_nodename[0], + manual_packname[0], + version_string[0], + this.pack_list, + $el("br", {}, []), + this.node_label + ]), + + $el("br", {}, []), + this.save_button, + close_button, + ] + ); + + content.style.width = '100%'; + content.style.height = '100%'; + + this.element = $el("div.comfy-modal", { id:'cm-manager-dialog', parent: document.body }, [ content ]); + } + + validateInput() { + let msg = ""; + + if(!isValidVersionString(this.version_string.value)) { + msg += 'Invalid version string: '+event.value+"\n"; + } + + if(this.node_prefix.value.trim() == '') { + msg += 'Node prefix cannot be empty\n'; + } + + if(this.manual_nodename.value.trim() == '') { + msg += 'Node name cannot be empty\n'; + } + + if(msg != '') { +// alert(msg); + } + + this.save_button.disabled = msg != ""; + } + + getPackName() { + if(this.pack_list.selectedIndex == 0) { + return this.manual_packname.value.trim(); + } + + return this.pack_list.value.trim(); + } + + getNodeName() { + if(this.manual_nodename.value.trim() != '') { + return this.manual_nodename.value.trim(); + } + + return this.target_node.comfyClass.substring(9); + } + + createAuthorModeCheck() { + let check = $el("input",{type:'checkbox', id:"author-mode"},[]) + const check_label = $el("label",{for:"author-mode"},["Enable author mode"]); + check_label.style.color = "var(--fg-color)"; + check_label.style.cursor = "pointer"; + check.checked = false; + + let self = this; + check.onchange = () => { + self.version_string.disabled = !check.checked; + + if(!check.checked) { + self.version_string.value = self.default_ver; + } + else { + alert('If you are not the author, it is not recommended to change the version, as it may cause component update issues.'); + } + }; + + return [check, check_label]; + } + + createNodeLabel() { + let label = $el('p'); + label.className = 'cb-node-label'; + label.textContent = " _::" + this.target_node.comfyClass.substring(9); + return label; + } + + createLabeledInput(placeholder, label, value) { + let textbox = $el('input.cb-widget-input', {type:'text', placeholder:placeholder, value:value}, []); + + let self = this; + textbox.onchange = () => { + this.validateInput.call(self); + this.node_label.textContent = this.node_prefix.value + "::" + this.manual_nodename.value; + } + let row = $el('span.cb-widget', {}, [ $el('span.cb-widget-input-label', label), textbox]); + + return [row, textbox]; + } + + createPackListCombo() { + let combo = document.createElement("select"); + combo.className = "cb-widget"; + let default_packname_option = { value: '##manual', text: 'Packname: Manual' }; + + combo.appendChild($el('option', default_packname_option, [])); + for(let name in pack_map) { + combo.appendChild($el('option', { value: name, text: 'Packname: '+ name }, [])); + } + + let self = this; + combo.onchange = function () { + if(combo.selectedIndex == 0) { + self.manual_packname.disabled = false; + } + else { + self.manual_packname.disabled = true; + } + }; + + return combo; + } +} + +let orig_handleFile = app.handleFile; + +function handleFile(file) { + if (file.name?.endsWith(".json") || file.name?.endsWith(".pack")) { + const reader = new FileReader(); + reader.onload = async () => { + let is_component = false; + const jsonContent = JSON.parse(reader.result); + for(let name in jsonContent) { + let cand = jsonContent[name]; + is_component = cand.datetime && cand.version; + break; + } + + if(is_component) { + handle_import_components(jsonContent); + } + else { + orig_handleFile.call(app, file); + } + }; + reader.readAsText(file); + + return; + } + + orig_handleFile.call(app, file); +} + +app.handleFile = handleFile; diff --git a/misc/Impact.pack b/misc/Impact.pack new file mode 100644 index 00000000..93fd3284 --- /dev/null +++ b/misc/Impact.pack @@ -0,0 +1,444 @@ +{ + "Impact::MAKE_BASIC_PIPE": { + "category": "", + "config": { + "1": { + "input": { + "text": { + "name": "Positive prompt" + } + } + }, + "2": { + "input": { + "text": { + "name": "Negative prompt" + } + } + } + }, + "datetime": 1705418802481, + "external": [], + "links": [ + [ + 0, + 1, + 1, + 0, + 1, + "CLIP" + ], + [ + 0, + 1, + 2, + 0, + 1, + "CLIP" + ], + [ + 0, + 0, + 3, + 0, + 1, + "MODEL" + ], + [ + 0, + 1, + 3, + 1, + 1, + "CLIP" + ], + [ + 0, + 2, + 3, + 2, + 1, + "VAE" + ], + [ + 1, + 0, + 3, + 3, + 3, + "CONDITIONING" + ], + [ + 2, + 0, + 3, + 4, + 4, + "CONDITIONING" + ] + ], + "nodes": [ + { + "flags": {}, + "index": 0, + "mode": 0, + "order": 0, + "outputs": [ + { + "links": [], + "name": "MODEL", + "shape": 3, + "slot_index": 0, + "type": "MODEL" + }, + { + "links": [], + "name": "CLIP", + "shape": 3, + "slot_index": 1, + "type": "CLIP" + }, + { + "links": [], + "name": "VAE", + "shape": 3, + "slot_index": 2, + "type": "VAE" + } + ], + "pos": [ + 550, + 360 + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "size": { + "0": 315, + "1": 98 + }, + "type": "CheckpointLoaderSimple", + "widgets_values": [ + "SDXL/sd_xl_base_1.0_0.9vae.safetensors" + ] + }, + { + "flags": {}, + "index": 1, + "inputs": [ + { + "link": null, + "name": "clip", + "type": "CLIP" + } + ], + "mode": 0, + "order": 1, + "outputs": [ + { + "links": [], + "name": "CONDITIONING", + "shape": 3, + "slot_index": 0, + "type": "CONDITIONING" + } + ], + "pos": [ + 940, + 480 + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "size": { + "0": 263, + "1": 99 + }, + "title": "Positive", + "type": "CLIPTextEncode", + "widgets_values": [ + "" + ] + }, + { + "flags": {}, + "index": 2, + "inputs": [ + { + "link": null, + "name": "clip", + "type": "CLIP" + } + ], + "mode": 0, + "order": 2, + "outputs": [ + { + "links": [], + "name": "CONDITIONING", + "shape": 3, + "slot_index": 0, + "type": "CONDITIONING" + } + ], + "pos": [ + 940, + 640 + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "size": { + "0": 263, + "1": 99 + }, + "title": "Negative", + "type": "CLIPTextEncode", + "widgets_values": [ + "" + ] + }, + { + "flags": {}, + "index": 3, + "inputs": [ + { + "link": null, + "name": "model", + "type": "MODEL" + }, + { + "link": null, + "name": "clip", + "type": "CLIP" + }, + { + "link": null, + "name": "vae", + "type": "VAE" + }, + { + "link": null, + "name": "positive", + "type": "CONDITIONING" + }, + { + "link": null, + "name": "negative", + "type": "CONDITIONING" + } + ], + "mode": 0, + "order": 3, + "outputs": [ + { + "links": null, + "name": "basic_pipe", + "shape": 3, + "slot_index": 0, + "type": "BASIC_PIPE" + } + ], + "pos": [ + 1320, + 360 + ], + "properties": { + "Node name for S&R": "ToBasicPipe" + }, + "size": { + "0": 241.79998779296875, + "1": 106 + }, + "type": "ToBasicPipe" + } + ], + "packname": "Impact", + "version": "1.0" + }, + "Impact::SIMPLE_DETAILER_PIPE": { + "category": "", + "config": { + "0": { + "output": { + "0": { + "visible": false + }, + "1": { + "visible": false + } + } + }, + "2": { + "input": { + "Select to add LoRA": { + "visible": false + }, + "Select to add Wildcard": { + "visible": false + }, + "wildcard": { + "visible": false + } + } + } + }, + "datetime": 1705419147116, + "external": [], + "links": [ + [ + null, + 0, + 2, + 0, + 6, + "BASIC_PIPE" + ], + [ + 0, + 0, + 2, + 1, + 13, + "BBOX_DETECTOR" + ], + [ + 1, + 0, + 2, + 2, + 15, + "SAM_MODEL" + ] + ], + "nodes": [ + { + "flags": {}, + "index": 0, + "mode": 0, + "order": 2, + "outputs": [ + { + "links": [], + "name": "BBOX_DETECTOR", + "shape": 3, + "type": "BBOX_DETECTOR" + }, + { + "links": null, + "name": "SEGM_DETECTOR", + "shape": 3, + "type": "SEGM_DETECTOR" + } + ], + "pos": [ + 590, + 830 + ], + "properties": { + "Node name for S&R": "UltralyticsDetectorProvider" + }, + "size": { + "0": 315, + "1": 78 + }, + "type": "UltralyticsDetectorProvider", + "widgets_values": [ + "bbox/Eyeful_v1.pt" + ] + }, + { + "flags": {}, + "index": 1, + "mode": 0, + "order": 3, + "outputs": [ + { + "links": [], + "name": "SAM_MODEL", + "shape": 3, + "type": "SAM_MODEL" + } + ], + "pos": [ + 590, + 960 + ], + "properties": { + "Node name for S&R": "SAMLoader" + }, + "size": { + "0": 315, + "1": 82 + }, + "type": "SAMLoader", + "widgets_values": [ + "sam_vit_b_01ec64.pth", + "AUTO" + ] + }, + { + "flags": {}, + "index": 2, + "inputs": [ + { + "link": null, + "name": "basic_pipe", + "type": "BASIC_PIPE" + }, + { + "link": null, + "name": "bbox_detector", + "slot_index": 1, + "type": "BBOX_DETECTOR" + }, + { + "link": null, + "name": "sam_model_opt", + "slot_index": 2, + "type": "SAM_MODEL" + }, + { + "link": null, + "name": "segm_detector_opt", + "type": "SEGM_DETECTOR" + }, + { + "link": null, + "name": "detailer_hook", + "type": "DETAILER_HOOK" + } + ], + "mode": 0, + "order": 5, + "outputs": [ + { + "links": null, + "name": "detailer_pipe", + "shape": 3, + "type": "DETAILER_PIPE" + } + ], + "pos": [ + 1044, + 812 + ], + "properties": { + "Node name for S&R": "BasicPipeToDetailerPipe" + }, + "size": { + "0": 400, + "1": 204 + }, + "type": "BasicPipeToDetailerPipe", + "widgets_values": [ + "", + "Select the LoRA to add to the text", + "Select the Wildcard to add to the text" + ] + } + ], + "packname": "Impact", + "version": "1.0" + } +} \ No newline at end of file From 961c2eeb534500c6d216f28d414d546a2facf471 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 17 Jan 2024 00:42:55 +0900 Subject: [PATCH 40/67] update DB --- custom-node-list.json | 21 +++++++++ extension-node-map.json | 70 ++++++++++++++++++++++++++++- node_db/new/custom-node-list.json | 30 +++++++++++++ node_db/new/extension-node-map.json | 70 ++++++++++++++++++++++++++++- 4 files changed, 187 insertions(+), 4 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index eab47c0a..c0ffd7eb 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4264,6 +4264,27 @@ "install_type": "git-clone", "description": "Simple node to handle scaling of YOLOv8 segmentation masks" }, + { + "author": "nkchocoai", + "title": "ComfyUI-SizeFromPresets", + "reference": "https://github.com/nkchocoai/ComfyUI-SizeFromPresets", + "files": [ + "https://github.com/nkchocoai/ComfyUI-SizeFromPresets" + ], + "install_type": "git-clone", + "description": "Add a node that outputs width and height of the size selected from the preset (.csv)." + }, + { + "author": "JaredTherriault", + "title": "ComfyUI-JNodes", + "reference": "https://github.com/JaredTherriault/ComfyUI-JNodes", + "files": [ + "https://github.com/JaredTherriault/ComfyUI-JNodes" + ], + "install_type": "git-clone", + "description": "python and web UX improvements for ComfyUI.\n[w/'DynamicPrompts.js' and 'EditAttention.js' from the core, along with 'ImageFeed.js' and 'favicon.js' from the custom scripts of pythongosssss, are not compatible. Therefore, manual deletion of these files is required to use this web extension.]" + }, + { diff --git a/extension-node-map.json b/extension-node-map.json index 5ff51cbd..8714c4dc 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -120,6 +120,9 @@ "FindThickLinesFromCanny-badger", "FloatToInt-badger", "FloatToString-badger", + "FrameToVideo-badger", + "GetDirName-badger", + "GetUUID-badger", "ImageNormalization-badger", "ImageOverlap-badger", "ImageScaleToSide-badger", @@ -128,10 +131,10 @@ "StringToFizz-badger", "TextListToString-badger", "TrimTransparentEdges-badger", - "VideoCut-badger", + "VideoCutFromDir-badger", + "VideoToFrame-badger", "deleteDir-badger", "findCenterOfMask-badger", - "frameToVideo-badger", "getImageSide-badger", "getParentDir-badger", "mkdir-badger" @@ -266,6 +269,7 @@ "ComfyUIDeployExternalImage", "ComfyUIDeployExternalImageAlpha", "ComfyUIDeployExternalNumber", + "ComfyUIDeployExternalNumberInt", "ComfyUIDeployExternalText" ], { @@ -958,6 +962,44 @@ "title_aux": "JPS Custom Nodes for ComfyUI" } ], + "https://github.com/JaredTherriault/ComfyUI-JNodes": [ + [ + "JNodes_AddOrSetPngInfoKey", + "JNodes_AppendReversedFrames", + "JNodes_BooleanSelectorWithString", + "JNodes_CheckpointSelectorWithString", + "JNodes_GetOutputDirectory", + "JNodes_GetParameterFromList", + "JNodes_GetParameterGlobal", + "JNodes_GetTempDirectory", + "JNodes_ImageFormatSelector", + "JNodes_ImageSizeSelector", + "JNodes_LoadVideo", + "JNodes_LoraExtractor", + "JNodes_OutVideoInfo", + "JNodes_ParseDynamicPrompts", + "JNodes_ParseParametersToGlobalList", + "JNodes_ParseWildcards", + "JNodes_PromptBuilderSingleSubject", + "JNodes_PromptEditor", + "JNodes_RemoveParseableDataForInference", + "JNodes_RemovePngInfoKey", + "JNodes_SamplerSelectorWithString", + "JNodes_SaveImageWithOutput", + "JNodes_SaveVideo", + "JNodes_SchedulerSelectorWithString", + "JNodes_SetNegativePromptInMetaData", + "JNodes_SetPositivePromptInMetaData", + "JNodes_StringLiteral", + "JNodes_SyncedStringLiteral", + "JNodes_TokenCounter", + "JNodes_UploadVideo", + "JNodes_VaeSelectorWithString" + ], + { + "title_aux": "ComfyUI-JNodes" + } + ], "https://github.com/Jcd1230/rembg-comfyui-node": [ [ "Image Remove Background (rembg)" @@ -1946,6 +1988,8 @@ "CR Seed to Int", "CR Select Font", "CR Select Model", + "CR Select Resize Method", + "CR Set Switch From String", "CR Set Value On Binary", "CR Set Value On Boolean", "CR Set Value on String", @@ -3015,6 +3059,7 @@ "ImageBridge", "LoadImageFromRequest", "LoadImageWithAlpha", + "LoadValueFromRequest", "SAM MultiLayer", "Save Image With Workflow" ], @@ -3239,6 +3284,7 @@ "RGB to HSV", "Rect Grab Cut", "Remap", + "RemapFromQuadrilateral (homography)", "RemapInsideParabolas", "RemapInsideParabolasAdvanced", "RemapToInnerCylinder", @@ -3434,6 +3480,16 @@ "title_aux": "ComfyUI-MotionCtrl" } ], + "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD": [ + [ + "Load Motionctrl-SVD Camera Preset", + "Load Motionctrl-SVD Checkpoint", + "Motionctrl-SVD Sample Simple" + ], + { + "title_aux": "ComfyUI-MotionCtrl-SVD" + } + ], "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": [ [ "Input Trigger", @@ -5475,6 +5531,15 @@ "title_aux": "comfyui-NDI" } ], + "https://github.com/nkchocoai/ComfyUI-SizeFromPresets": [ + [ + "SizeFromPresetsSD15", + "SizeFromPresetsSDXL" + ], + { + "title_aux": "ComfyUI-SizeFromPresets" + } + ], "https://github.com/noembryo/ComfyUI-noEmbryo": [ [ "PromptTermList1", @@ -5883,6 +5948,7 @@ "MultiplicationNode", "NewLayer", "NoiseImage", + "OutlineMask", "PromptImage", "PromptSimplification", "PromptSlide", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 2fa96461..32be8b2f 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,36 @@ }, + { + "author": "chaojie", + "title": "ComfyUI-MotionCtrl-SVD", + "reference": "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD", + "files": [ + "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD" + ], + "install_type": "git-clone", + "description": "Nodes: Download the weights of MotionCtrl-SVD [a/motionctrl_svd.ckpt](https://huggingface.co/TencentARC/MotionCtrl/blob/main/motionctrl_svd.ckpt) and put it to ComfyUI/models/checkpoints" + }, + { + "author": "JaredTherriault", + "title": "ComfyUI-JNodes", + "reference": "https://github.com/JaredTherriault/ComfyUI-JNodes", + "files": [ + "https://github.com/JaredTherriault/ComfyUI-JNodes" + ], + "install_type": "git-clone", + "description": "python and web UX improvements for ComfyUI.\n[w/'DynamicPrompts.js' and 'EditAttention.js' from the core, along with 'ImageFeed.js' and 'favicon.js' from the custom scripts of pythongosssss, are not compatible. Therefore, manual deletion of these files is required to use this web extension.]" + }, + { + "author": "nkchocoai", + "title": "ComfyUI-SizeFromPresets", + "reference": "https://github.com/nkchocoai/ComfyUI-SizeFromPresets", + "files": [ + "https://github.com/nkchocoai/ComfyUI-SizeFromPresets" + ], + "install_type": "git-clone", + "description": "Add a node that outputs width and height of the size selected from the preset (.csv)." + }, { "author": "HAL41", "title": "ComfyUI aichemy nodes", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 5ff51cbd..8714c4dc 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -120,6 +120,9 @@ "FindThickLinesFromCanny-badger", "FloatToInt-badger", "FloatToString-badger", + "FrameToVideo-badger", + "GetDirName-badger", + "GetUUID-badger", "ImageNormalization-badger", "ImageOverlap-badger", "ImageScaleToSide-badger", @@ -128,10 +131,10 @@ "StringToFizz-badger", "TextListToString-badger", "TrimTransparentEdges-badger", - "VideoCut-badger", + "VideoCutFromDir-badger", + "VideoToFrame-badger", "deleteDir-badger", "findCenterOfMask-badger", - "frameToVideo-badger", "getImageSide-badger", "getParentDir-badger", "mkdir-badger" @@ -266,6 +269,7 @@ "ComfyUIDeployExternalImage", "ComfyUIDeployExternalImageAlpha", "ComfyUIDeployExternalNumber", + "ComfyUIDeployExternalNumberInt", "ComfyUIDeployExternalText" ], { @@ -958,6 +962,44 @@ "title_aux": "JPS Custom Nodes for ComfyUI" } ], + "https://github.com/JaredTherriault/ComfyUI-JNodes": [ + [ + "JNodes_AddOrSetPngInfoKey", + "JNodes_AppendReversedFrames", + "JNodes_BooleanSelectorWithString", + "JNodes_CheckpointSelectorWithString", + "JNodes_GetOutputDirectory", + "JNodes_GetParameterFromList", + "JNodes_GetParameterGlobal", + "JNodes_GetTempDirectory", + "JNodes_ImageFormatSelector", + "JNodes_ImageSizeSelector", + "JNodes_LoadVideo", + "JNodes_LoraExtractor", + "JNodes_OutVideoInfo", + "JNodes_ParseDynamicPrompts", + "JNodes_ParseParametersToGlobalList", + "JNodes_ParseWildcards", + "JNodes_PromptBuilderSingleSubject", + "JNodes_PromptEditor", + "JNodes_RemoveParseableDataForInference", + "JNodes_RemovePngInfoKey", + "JNodes_SamplerSelectorWithString", + "JNodes_SaveImageWithOutput", + "JNodes_SaveVideo", + "JNodes_SchedulerSelectorWithString", + "JNodes_SetNegativePromptInMetaData", + "JNodes_SetPositivePromptInMetaData", + "JNodes_StringLiteral", + "JNodes_SyncedStringLiteral", + "JNodes_TokenCounter", + "JNodes_UploadVideo", + "JNodes_VaeSelectorWithString" + ], + { + "title_aux": "ComfyUI-JNodes" + } + ], "https://github.com/Jcd1230/rembg-comfyui-node": [ [ "Image Remove Background (rembg)" @@ -1946,6 +1988,8 @@ "CR Seed to Int", "CR Select Font", "CR Select Model", + "CR Select Resize Method", + "CR Set Switch From String", "CR Set Value On Binary", "CR Set Value On Boolean", "CR Set Value on String", @@ -3015,6 +3059,7 @@ "ImageBridge", "LoadImageFromRequest", "LoadImageWithAlpha", + "LoadValueFromRequest", "SAM MultiLayer", "Save Image With Workflow" ], @@ -3239,6 +3284,7 @@ "RGB to HSV", "Rect Grab Cut", "Remap", + "RemapFromQuadrilateral (homography)", "RemapInsideParabolas", "RemapInsideParabolasAdvanced", "RemapToInnerCylinder", @@ -3434,6 +3480,16 @@ "title_aux": "ComfyUI-MotionCtrl" } ], + "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD": [ + [ + "Load Motionctrl-SVD Camera Preset", + "Load Motionctrl-SVD Checkpoint", + "Motionctrl-SVD Sample Simple" + ], + { + "title_aux": "ComfyUI-MotionCtrl-SVD" + } + ], "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": [ [ "Input Trigger", @@ -5475,6 +5531,15 @@ "title_aux": "comfyui-NDI" } ], + "https://github.com/nkchocoai/ComfyUI-SizeFromPresets": [ + [ + "SizeFromPresetsSD15", + "SizeFromPresetsSDXL" + ], + { + "title_aux": "ComfyUI-SizeFromPresets" + } + ], "https://github.com/noembryo/ComfyUI-noEmbryo": [ [ "PromptTermList1", @@ -5883,6 +5948,7 @@ "MultiplicationNode", "NewLayer", "NoiseImage", + "OutlineMask", "PromptImage", "PromptSimplification", "PromptSlide", From 042d5b406ad46d4a9964ebc22f7756ae64d3fe51 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 17 Jan 2024 01:07:03 +0900 Subject: [PATCH 41/67] update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 7787bd2b..9e452e69 100644 --- a/README.md +++ b/README.md @@ -235,6 +235,11 @@ NODE_CLASS_MAPPINGS.update({ "category": "util/pipe", ``` +* Drag & Drop support + * Dragging and dropping a `.pack` or `.json` file will add the corresponding components. + * Example pack: [Impact.pack](misc/Impact.pack) +* Dragging and dropping or pasting a single component will add a node. However, when adding multiple components, nodes will not be added. + ## Support of missing nodes installation ![missing-menu](misc/missing-menu.png) From 4649d216b1842aa48b95d3f064c679a1b698e506 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 17 Jan 2024 01:17:16 +0900 Subject: [PATCH 42/67] component builder - fix initial displayed node name --- js/components-manager.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/components-manager.js b/js/components-manager.js index d8bd84f5..4c7e69af 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -594,7 +594,10 @@ export class ComponentBuilderDialog extends ComfyDialog { createNodeLabel() { let label = $el('p'); label.className = 'cb-node-label'; - label.textContent = " _::" + this.target_node.comfyClass.substring(9); + if(this.target_node.comfyClass.includes('::')) + label.textContent = this.target_node.comfyClass.substring(9); + else + label.textContent = " _::" + this.target_node.comfyClass.substring(9); return label; } From 7342c3d1b47567d97317aac3414af7313c29a5ef Mon Sep 17 00:00:00 2001 From: prozacgod Date: Tue, 16 Jan 2024 15:29:59 -0600 Subject: [PATCH 43/67] Added ComfyUI Multi-Workspace --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index c0ffd7eb..357efa8e 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4603,6 +4603,16 @@ ], "install_type": "unzip", "description": "This is a node to convert an image into a CMYK Halftone dot image." + }, + { + "author": "prozacgod", + "title": "ComfyUI Multi-Workspace", + "reference": "https://github.com/prozacgod/comfyui-pzc-multiworkspace", + "files": [ + "https://github.com/prozacgod/comfyui-pzc-multiworkspace" + ], + "install_type": "git-clone", + "description": "A simple, quick, and dirty implementation of multiple workspaces within ComfyUI." } ] } From 9215f37c02b24cd9d7fdc638a434cf89e7013058 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Wed, 17 Jan 2024 12:46:49 +0900 Subject: [PATCH 44/67] component system - bug fixes and refactor --- __init__.py | 23 +++++++- js/comfyui-manager.js | 56 ++++++++++++++---- js/components-manager.js | 124 ++++++++++++++++++++++++++++++++------- 3 files changed, 166 insertions(+), 37 deletions(-) diff --git a/__init__.py b/__init__.py index 83cc0999..e4bf8a17 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,7 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [2, 1] +version = [2, 2] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") @@ -172,6 +172,7 @@ def write_config(): 'share_option': get_config()['share_option'], 'bypass_ssl': get_config()['bypass_ssl'], 'default_ui': get_config()['default_ui'], + 'component_policy': get_config()['component_policy'], } with open(config_path, 'w') as configfile: config.write(configfile) @@ -191,6 +192,7 @@ def read_config(): 'share_option': default_conf['share_option'] if 'share_option' in default_conf else 'all', 'bypass_ssl': default_conf['bypass_ssl'] if 'bypass_ssl' in default_conf else False, 'default_ui': default_conf['default_ui'] if 'default_ui' in default_conf else 'none', + 'component_policy': default_conf['component_policy'] if 'component_policy' in default_conf else 'workflow', } except Exception: @@ -201,7 +203,8 @@ def read_config(): 'channel_url': 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main', 'share_option': 'all', 'bypass_ssl': False, - 'default_ui': 'none' + 'default_ui': 'none', + 'component_policy': 'workflow' } @@ -249,6 +252,10 @@ def set_default_ui_mode(mode): get_config()['default_ui'] = mode +def set_component_policy(mode): + get_config()['component_policy'] = mode + + def try_install_script(url, repo_path, install_cmd): int_comfyui_revision = 0 @@ -1767,6 +1774,18 @@ async def default_ui_mode(request): return web.Response(status=200) + +@server.PromptServer.instance.routes.get("/manager/component/policy") +async def component_policy(request): + if "value" in request.rel_url.query: + set_component_policy(request.rel_url.query['value']) + write_config() + else: + return web.Response(text=get_config()['component_policy'], status=200) + + return web.Response(status=200) + + @server.PromptServer.instance.routes.get("/manager/channel_url_list") async def channel_url_list(request): channels = get_channel_dict() diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index fe1233da..0dbce9d7 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -16,7 +16,7 @@ import { AlternativesInstaller } from "./a1111-alter-downloader.js"; import { SnapshotManager } from "./snapshot.js"; import { ModelInstaller } from "./model-downloader.js"; import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models } from "./common.js"; -import { ComponentBuilderDialog, load_components } from "./components-manager.js"; +import { ComponentBuilderDialog, load_components, set_component_policy } from "./components-manager.js"; var docStyle = document.createElement('style'); docStyle.innerHTML = ` @@ -721,6 +721,18 @@ class ManagerMenuDialog extends ComfyDialog { } }), + $el("button.cm-button", { + type: "button", + textContent: "Install via Git URL", + onclick: () => { + var url = prompt("Please enter the URL of the Git repository to install", ""); + + if (url !== null) { + install_via_git_url(url, self); + } + } + }), + $el("br", {}, []), update_all_button, update_comfyui_button, @@ -753,6 +765,7 @@ class ManagerMenuDialog extends ComfyDialog { // db mode this.datasrc_combo = document.createElement("select"); + this.datasrc_combo.setAttribute("title", "Configure where to retrieve node/model information. If set to 'local,' the channel is ignored, and if set to 'channel (remote),' it fetches the latest information each time the list is opened."); this.datasrc_combo.className = "cm-menu-combo"; this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'DB: Channel (1day cache)' }, [])); this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'DB: Local' }, [])); @@ -760,6 +773,7 @@ class ManagerMenuDialog extends ComfyDialog { // preview method let preview_combo = document.createElement("select"); + preview_combo.setAttribute("title", "Configure how latent variables will be decoded during preview in the sampling process."); preview_combo.className = "cm-menu-combo"; preview_combo.appendChild($el('option', { value: 'auto', text: 'Preview method: Auto' }, [])); preview_combo.appendChild($el('option', { value: 'taesd', text: 'Preview method: TAESD (slow)' }, [])); @@ -776,6 +790,7 @@ class ManagerMenuDialog extends ComfyDialog { // nickname let badge_combo = document.createElement("select"); + badge_combo.setAttribute("title", "Configure the content to be displayed on the badge at the top right corner of the node. The ID is the identifier of the node. If 'hide built-in' is selected, both unknown nodes and built-in nodes will be omitted, making them indistinguishable"); badge_combo.className = "cm-menu-combo"; badge_combo.appendChild($el('option', { value: 'none', text: 'Badge: None' }, [])); badge_combo.appendChild($el('option', { value: 'nick', text: 'Badge: Nickname' }, [])); @@ -795,6 +810,7 @@ class ManagerMenuDialog extends ComfyDialog { // channel let channel_combo = document.createElement("select"); + channel_combo.setAttribute("title", "Configure the channel for retrieving data from the Custom Node list (including missing nodes) or the Model list. Note that the badge utilizes local information."); channel_combo.className = "cm-menu-combo"; api.fetchApi('/manager/channel_url_list') .then(response => response.json()) @@ -821,6 +837,7 @@ class ManagerMenuDialog extends ComfyDialog { // default ui state let default_ui_combo = document.createElement("select"); + default_ui_combo.setAttribute("title", "Set the default state to be displayed in the main menu when the browser starts."); default_ui_combo.className = "cm-menu-combo"; default_ui_combo.appendChild($el('option', { value: 'none', text: 'Default UI: None' }, [])); default_ui_combo.appendChild($el('option', { value: 'history', text: 'Default UI: History' }, [])); @@ -836,6 +853,7 @@ class ManagerMenuDialog extends ComfyDialog { // share let share_combo = document.createElement("select"); + share_combo.setAttribute("title", "Hide the share button in the main menu or set the default action upon clicking it. Additionally, configure the default share site when sharing via the context menu's share button."); share_combo.className = "cm-menu-combo"; const share_options = [ ['none', 'None'], @@ -849,6 +867,25 @@ class ManagerMenuDialog extends ComfyDialog { share_combo.appendChild($el('option', { value: option[0], text: `Share: ${option[1]}` }, [])); } + // default ui state + let component_policy_combo = document.createElement("select"); + component_policy_combo.setAttribute("title", "When loading the workflow, configure which version of the component to use."); + component_policy_combo.className = "cm-menu-combo"; + component_policy_combo.appendChild($el('option', { value: 'workflow', text: 'Component: Use workflow version' }, [])); + component_policy_combo.appendChild($el('option', { value: 'higher', text: 'Component: Use higher version' }, [])); + component_policy_combo.appendChild($el('option', { value: 'mine', text: 'Component: Use my version' }, [])); + api.fetchApi('/manager/component/policy') + .then(response => response.text()) + .then(data => { + component_policy_combo.value = data; + set_component_policy(data); + }); + + component_policy_combo.addEventListener('change', function (event) { + api.fetchApi(`/manager/component/policy?value=${event.target.value}`); + set_component_policy(event.target.value); + }); + api.fetchApi('/manager/share_option') .then(response => response.text()) .then(data => { @@ -877,18 +914,8 @@ class ManagerMenuDialog extends ComfyDialog { badge_combo, default_ui_combo, share_combo, + component_policy_combo, $el("br", {}, []), - $el("button.cm-button", { - type: "button", - textContent: "Install via Git URL", - onclick: () => { - var url = prompt("Please enter the URL of the Git repository to install", ""); - - if (url !== null) { - install_via_git_url(url, self); - } - } - }), $el("br", {}, []), $el("filedset.cm-experimental", {}, [ @@ -1220,6 +1247,7 @@ app.registerExtension({ async beforeRegisterNodeDef(nodeType, nodeData, app) { this._addExtraNodeContextMenu(nodeType, app); }, + async nodeCreated(node, app) { if(!node.badge_enabled) { node.getNickname = function () { return getNickname(node, node.comfyClass.trim()) }; @@ -1230,6 +1258,7 @@ app.registerExtension({ node.badge_enabled = true; } }, + async loadedGraphNode(node, app) { if(!node.badge_enabled) { const orig = node.onDrawForeground; @@ -1240,10 +1269,11 @@ app.registerExtension({ _addExtraNodeContextMenu(node, app) { const origGetExtraMenuOptions = node.prototype.getExtraMenuOptions; + node.prototype.cm_menu_added = true; node.prototype.getExtraMenuOptions = function (_, options) { origGetExtraMenuOptions?.apply?.(this, arguments); - if (node.comfyClass.startsWith('workflow/')) { + if (node.category.startsWith('group nodes/')) { options.push({ content: "Save As Component", callback: (obj) => { diff --git a/js/components-manager.js b/js/components-manager.js index 4c7e69af..031196a7 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -7,6 +7,13 @@ import { ComfyDialog, $el } from "../../scripts/ui.js"; let pack_map = {}; let rpack_map = {}; +function getPureName(node) { + // group nodes/ + let category = node.category.substring(12); + let purename = node.comfyClass.substring(category.length+1); + return purename; +} + function isValidVersionString(version) { const versionPattern = /^(\d+)\.(\d+)(\.(\d+))?$/; @@ -21,21 +28,23 @@ function isValidVersionString(version) { function register_pack_map(name, data) { if(data.packname) { pack_map[data.packname] = name; - rpack_map[name] = [data.packname, data.category, data.version, data.datetime]; + rpack_map[name] = data; } else { - rpack_map[name] = [data.packname, data.category, data.version, data.datetime]; + rpack_map[name] = data; } } -function storeGroupNode(name, data) { +function storeGroupNode(name, data, register=true) { let extra = app.graph.extra; if (!extra) app.graph.extra = extra = {}; let groupNodes = extra.groupNodes; if (!groupNodes) extra.groupNodes = groupNodes = {}; groupNodes[name] = data; - register_pack_map(name, data); + if(register) { + register_pack_map(name, data); + } } export async function load_components() { @@ -179,7 +188,7 @@ async function save_as_component(node, version, prefix, nodename, packname, cate let subgraph = app.graph.extra?.groupNodes?.[component_name]; if(!subgraph) { - subgraph = app.graph.extra?.groupNodes?.[node.comfyClass.substring(9)]; + subgraph = app.graph.extra?.groupNodes?.[getPureName(node)]; } subgraph.version = version; @@ -194,7 +203,7 @@ async function save_as_component(node, version, prefix, nodename, packname, cate }; pack_map[packname] = component_name; - rpack_map[component_name] = [body.pack_name, body.category, body.version, body.datetime]; + rpack_map[component_name] = subgraph; const res = await api.fetchApi('/manager/component/save', { method: "POST", @@ -253,6 +262,15 @@ async function import_component(component_name, component, mode) { await config.registerType(category); } +function restore_to_loaded_component(component_name) { + if(rpack_map[component_name]) { + let component = rpack_map[component_name]; + storeGroupNode(component_name, component, false); + const config = new GroupNodeConfig(component_name, component); + config.registerType(component.category); + } +} + // Using a timestamp prevents duplicate pastes and ensures the prevention of re-deletion of litegrapheditor_clipboard. let last_paste_timestamp = null; @@ -306,7 +324,7 @@ function versionCompare(v1, v2) { function checkVersion(name, component) { let msg = ''; if(rpack_map[name]) { - let old_version = rpack_map[name][2]; + let old_version = rpack_map[name].version; if(!old_version || old_version == '') { msg = ` '${name}' Upgrade (V0.0 -> V${component.version})`; } @@ -439,27 +457,21 @@ export class ComponentBuilderDialog extends ComfyDialog { } }); - let default_nodename = this.target_node.comfyClass.substring(9).trim(); + let default_nodename = getPureName(this.target_node).trim(); + + let groupNode = app.graph.extra.groupNodes[default_nodename]; + let default_packname = groupNode.packname; - let default_packname = ""; - if(rpack_map[default_nodename]) { - default_packname = rpack_map[default_nodename][0]; - } if(!default_packname) { default_packname = ''; } - let default_category = ""; - if(rpack_map[default_nodename]) { - default_category = rpack_map[default_nodename][1]; - } + let default_category = groupNode.category; if(!default_category) { default_category = ''; } - if(rpack_map[default_nodename]) { - this.default_ver = rpack_map[default_nodename][2]; - } + this.default_ver = groupNode.version; if(!this.default_ver) { this.default_ver = '0.0'; } @@ -566,7 +578,7 @@ export class ComponentBuilderDialog extends ComfyDialog { return this.manual_nodename.value.trim(); } - return this.target_node.comfyClass.substring(9); + return getPureName(this.target_node); } createAuthorModeCheck() { @@ -595,9 +607,9 @@ export class ComponentBuilderDialog extends ComfyDialog { let label = $el('p'); label.className = 'cb-node-label'; if(this.target_node.comfyClass.includes('::')) - label.textContent = this.target_node.comfyClass.substring(9); + label.textContent = getPureName(this.target_node); else - label.textContent = " _::" + this.target_node.comfyClass.substring(9); + label.textContent = " _::" + getPureName(this.target_node); return label; } @@ -668,3 +680,71 @@ function handleFile(file) { } app.handleFile = handleFile; + +let current_component_policy = 'workflow'; +try { + api.fetchApi('/manager/component/policy') + .then(response => response.text()) + .then(data => { current_component_policy = data; }); +} +catch {} + +function getChangedVersion(groupNodes) { + if(!Object.keys(pack_map).length || !groupNodes) + return null; + + let res = {}; + for(let component_name in groupNodes) { + let data = groupNodes[component_name]; + + if(rpack_map[component_name]) { + let v = versionCompare(data.version, rpack_map[component_name].version); + res[component_name] = v; + } + } + + return res; +} + +const loadGraphData = app.loadGraphData; +app.loadGraphData = async function () { + const v = await loadGraphData.apply(this, arguments); + + if(arguments.length == 0) + return v; + + let groupNodes = arguments[0].extra?.groupNodes; + let res = getChangedVersion(groupNodes); + + if(res) { + let target_components = null; + switch(current_component_policy) { + case 'higher': + target_components = Object.keys(res).filter(key => res[key] == 1); + break; + + case 'mine': + target_components = Object.keys(res); + break; + + default: + // do nothing + } + + if(target_components) { + for(let i in target_components) { + let component_name = target_components[i]; + restore_to_loaded_component(component_name); + } + } + } + else { + console.log('Empty components: policy ignored'); + } + + return v; +}; + +export function set_component_policy(v) { + current_component_policy = v; +} \ No newline at end of file From db081659fe9b37cc7aa33c7b676766a470a89000 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Wed, 17 Jan 2024 12:53:37 +0900 Subject: [PATCH 45/67] update DB --- custom-node-list.json | 31 +++++++++++++++++++---------- extension-node-map.json | 16 ++++++++++++++- node_db/new/custom-node-list.json | 20 +++++++++++++++++++ node_db/new/extension-node-map.json | 16 ++++++++++++++- 4 files changed, 71 insertions(+), 12 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index 357efa8e..521ac52f 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4284,6 +4284,27 @@ "install_type": "git-clone", "description": "python and web UX improvements for ComfyUI.\n[w/'DynamicPrompts.js' and 'EditAttention.js' from the core, along with 'ImageFeed.js' and 'favicon.js' from the custom scripts of pythongosssss, are not compatible. Therefore, manual deletion of these files is required to use this web extension.]" }, + { + "author": "prozacgod", + "title": "ComfyUI Multi-Workspace", + "reference": "https://github.com/prozacgod/comfyui-pzc-multiworkspace", + "files": [ + "https://github.com/prozacgod/comfyui-pzc-multiworkspace" + ], + "install_type": "git-clone", + "description": "A simple, quick, and dirty implementation of multiple workspaces within ComfyUI." + }, + { + "author": "Siberpone", + "title": "Lazy Pony Prompter", + "reference": "https://github.com/Siberpone/lazy-pony-prompter", + "files": [ + "https://github.com/Siberpone/lazy-pony-prompter" + ], + "install_type": "git-clone", + "description": "A pony prompt helper extension for AUTOMATIC1111's Stable Diffusion Web UI and ComfyUI that utilizes the full power of your favorite booru query syntax. Currently supports [a/Derpibooru](https://derpibooru/org) and [a/E621](https://e621.net/)." + }, + @@ -4603,16 +4624,6 @@ ], "install_type": "unzip", "description": "This is a node to convert an image into a CMYK Halftone dot image." - }, - { - "author": "prozacgod", - "title": "ComfyUI Multi-Workspace", - "reference": "https://github.com/prozacgod/comfyui-pzc-multiworkspace", - "files": [ - "https://github.com/prozacgod/comfyui-pzc-multiworkspace" - ], - "install_type": "git-clone", - "description": "A simple, quick, and dirty implementation of multiple workspaces within ComfyUI." } ] } diff --git a/extension-node-map.json b/extension-node-map.json index 8714c4dc..f66ed7a3 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -1119,6 +1119,7 @@ "VHS_MergeImages", "VHS_MergeLatents", "VHS_MergeMasks", + "VHS_PruneOutputs", "VHS_SelectEveryNthImage", "VHS_SelectEveryNthLatent", "VHS_SelectEveryNthMask", @@ -1794,6 +1795,19 @@ "title_aux": "SDXL_sizing" } ], + "https://github.com/Siberpone/lazy-pony-prompter": [ + [ + "LPP_Deleter", + "LPP_Derpibooru", + "LPP_E621", + "LPP_Loader_Derpibooru", + "LPP_Loader_E621", + "LPP_Saver" + ], + { + "title_aux": "Lazy Pony Prompter" + } + ], "https://github.com/Smuzzies/comfyui_chatbox_overlay/raw/main/chatbox_overlay.py": [ [ "Chatbox Overlay" @@ -2813,7 +2827,7 @@ "Aegisflow SDXL Tuple Pass", "Aegisflow VAE Pass", "Aegisflow controlnet preprocessor bus", - "Brightness & Contrast_Ally", + "Brightness_Contrast_Ally", "Gaussian Blur_Ally", "Image Flip_ally", "Placeholder Tuple", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 32be8b2f..4db09793 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,26 @@ }, + { + "author": "prozacgod", + "title": "ComfyUI Multi-Workspace", + "reference": "https://github.com/prozacgod/comfyui-pzc-multiworkspace", + "files": [ + "https://github.com/prozacgod/comfyui-pzc-multiworkspace" + ], + "install_type": "git-clone", + "description": "A simple, quick, and dirty implementation of multiple workspaces within ComfyUI." + }, + { + "author": "Siberpone", + "title": "Lazy Pony Prompter", + "reference": "https://github.com/Siberpone/lazy-pony-prompter", + "files": [ + "https://github.com/Siberpone/lazy-pony-prompter" + ], + "install_type": "git-clone", + "description": "A pony prompt helper extension for AUTOMATIC1111's Stable Diffusion Web UI and ComfyUI that utilizes the full power of your favorite booru query syntax. Currently supports [a/Derpibooru](https://derpibooru/org) and [a/E621](https://e621.net/)." + }, { "author": "chaojie", "title": "ComfyUI-MotionCtrl-SVD", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 8714c4dc..f66ed7a3 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -1119,6 +1119,7 @@ "VHS_MergeImages", "VHS_MergeLatents", "VHS_MergeMasks", + "VHS_PruneOutputs", "VHS_SelectEveryNthImage", "VHS_SelectEveryNthLatent", "VHS_SelectEveryNthMask", @@ -1794,6 +1795,19 @@ "title_aux": "SDXL_sizing" } ], + "https://github.com/Siberpone/lazy-pony-prompter": [ + [ + "LPP_Deleter", + "LPP_Derpibooru", + "LPP_E621", + "LPP_Loader_Derpibooru", + "LPP_Loader_E621", + "LPP_Saver" + ], + { + "title_aux": "Lazy Pony Prompter" + } + ], "https://github.com/Smuzzies/comfyui_chatbox_overlay/raw/main/chatbox_overlay.py": [ [ "Chatbox Overlay" @@ -2813,7 +2827,7 @@ "Aegisflow SDXL Tuple Pass", "Aegisflow VAE Pass", "Aegisflow controlnet preprocessor bus", - "Brightness & Contrast_Ally", + "Brightness_Contrast_Ally", "Gaussian Blur_Ally", "Image Flip_ally", "Placeholder Tuple", From e530f657e7510ef936e8fd13a83ec508784802e3 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Wed, 17 Jan 2024 13:48:25 +0900 Subject: [PATCH 46/67] unused group nodes filtering --- __init__.py | 2 +- js/components-manager.js | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/__init__.py b/__init__.py index e4bf8a17..d3b0751f 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,7 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [2, 2] +version = [2, 2, 1] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") diff --git a/js/components-manager.js b/js/components-manager.js index 031196a7..17cc9394 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -747,4 +747,37 @@ app.loadGraphData = async function () { export function set_component_policy(v) { current_component_policy = v; -} \ No newline at end of file +} + +let graphToPrompt = app.graphToPrompt; +app.graphToPrompt = async function () { + let p = await graphToPrompt.call(app); + try { + let groupNodes = p.workflow.extra?.groupNodes; + if(groupNodes) { + p.workflow.extra = { ... p.workflow.extra}; + + // get used group nodes + let used_group_nodes = new Set(); + for(let node of p.workflow.nodes) { + if(node.type.startsWith('workflow/')) { + used_group_nodes.add(node.type.substring(9)); + } + } + + // remove unused group nodes + let new_groupNodes = {}; + for (let key in p.workflow.extra.groupNodes) { + if (used_group_nodes.has(key)) { + new_groupNodes[key] = p.workflow.extra.groupNodes[key]; + } + } + p.workflow.extra.groupNodes = new_groupNodes; + } + } + catch(e) { + console.log(`Failed to filtering group nodes: ${e}`); + } + + return p; +} From 8ea2a744c2caad3860067f7a19134c517efaf492 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Wed, 17 Jan 2024 14:47:24 +0900 Subject: [PATCH 47/67] update DB --- extension-node-map.json | 1 + node_db/new/extension-node-map.json | 1 + 2 files changed, 2 insertions(+) diff --git a/extension-node-map.json b/extension-node-map.json index f66ed7a3..dce239d4 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -123,6 +123,7 @@ "FrameToVideo-badger", "GetDirName-badger", "GetUUID-badger", + "IdentifyLinesBasedOnBorderColor-badger", "ImageNormalization-badger", "ImageOverlap-badger", "ImageScaleToSide-badger", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index f66ed7a3..dce239d4 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -123,6 +123,7 @@ "FrameToVideo-badger", "GetDirName-badger", "GetUUID-badger", + "IdentifyLinesBasedOnBorderColor-badger", "ImageNormalization-badger", "ImageOverlap-badger", "ImageScaleToSide-badger", From b2fc36c5477f2f94263f4d2500bf96647b24644e Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Wed, 17 Jan 2024 16:21:03 +0900 Subject: [PATCH 48/67] update README.md --- README.md | 59 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 9e452e69..5fcfa2d0 100644 --- a/README.md +++ b/README.md @@ -208,38 +208,41 @@ NODE_CLASS_MAPPINGS.update({ * **All scripts are executed from the root path of the corresponding custom node.** -## Component Paste -* When pasting a component from the clipboard, it supports text in the following JSON format. (text/plain) -``` -{ - "kind": "ComfyUI Components", - "timestamp": , - "components": +## Component Sharing +* **Copy & Paste** + * [Demo Page](https://ltdrdata.github.io/component-demo/) + * When pasting a component from the clipboard, it supports text in the following JSON format. (text/plain) + ``` { - : + "kind": "ComfyUI Components", + "timestamp": , + "components": + { + : + } } -} -``` -* `` Ensure that the timestamp is always unique. -* "components" should have the same structure as the content of the file stored in ComfyUI-Manager/components. - * ``: The name should be in the format `::`. - * ``: In the nodedata of the group node. - * ``: Only two formats are allowed: `major.minor.patch` or `major.minor`. (e.g. `1.0`, `2.2.1`) - * ``: Saved time - * ``: If the packname is not empty, the category becomes packname/workflow, and it is saved in the .pack file in ComfyUI-Manager/components. - * ``: If there is neither a category nor a packname, it is saved in the components category. - ``` - "version":"1.0", - "datetime": 1705390656516, - "packname": "mypack", - "category": "util/pipe", - ``` - -* Drag & Drop support + ``` + * `` Ensure that the timestamp is always unique. + * "components" should have the same structure as the content of the file stored in ComfyUI-Manager/components. + * ``: The name should be in the format `::`. + * ``: In the nodedata of the group node. + * ``: Only two formats are allowed: `major.minor.patch` or `major.minor`. (e.g. `1.0`, `2.2.1`) + * ``: Saved time + * ``: If the packname is not empty, the category becomes packname/workflow, and it is saved in the .pack file in ComfyUI-Manager/components. + * ``: If there is neither a category nor a packname, it is saved in the components category. + ``` + "version":"1.0", + "datetime": 1705390656516, + "packname": "mypack", + "category": "util/pipe", + ``` +* **Drag & Drop** * Dragging and dropping a `.pack` or `.json` file will add the corresponding components. * Example pack: [Impact.pack](misc/Impact.pack) + * Dragging and dropping or pasting a single component will add a node. However, when adding multiple components, nodes will not be added. + ## Support of missing nodes installation ![missing-menu](misc/missing-menu.png) @@ -272,11 +275,11 @@ NODE_CLASS_MAPPINGS.update({ - [x] System displaying information about failed custom nodes import. - [x] Guide for missing nodes in ComfyUI vanilla nodes. - [x] Collision checking system for nodes with the same ID across extensions. +- [x] Template sharing system. (-> Component system based on Group Nodes) +- [x] 3rd party API system. - [ ] Auto migration for custom nodes with changed structures. - [ ] Version control feature for nodes. - [ ] List of currently used custom nodes. -- [ ] Template sharing system. -- [ ] 3rd party API system. - [ ] Download support multiple model download. - [ ] Model download via url. - [ ] List sorting. From c80ca12abd60620714690ed0513c6dcb19bd773b Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Wed, 17 Jan 2024 16:21:49 +0900 Subject: [PATCH 49/67] update DB --- extension-node-map.json | 1 + node_db/new/extension-node-map.json | 1 + 2 files changed, 2 insertions(+) diff --git a/extension-node-map.json b/extension-node-map.json index dce239d4..743812fa 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -4625,6 +4625,7 @@ "KSampler Adv. (Efficient)", "KSampler SDXL (Eff.)", "LatentUpscaler", + "LoRA Stack to String converter", "LoRA Stacker", "Manual XY Entry Info", "NNLatentUpscale", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index dce239d4..743812fa 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -4625,6 +4625,7 @@ "KSampler Adv. (Efficient)", "KSampler SDXL (Eff.)", "LatentUpscaler", + "LoRA Stack to String converter", "LoRA Stacker", "Manual XY Entry Info", "NNLatentUpscale", From d84301148af45da52cdc1b88abd00ccfb368d7cf Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 17 Jan 2024 22:39:14 +0900 Subject: [PATCH 50/67] update DB --- custom-node-list.json | 20 ++++++++++++++++++++ extension-node-map.json | 23 +++++++++++++++++++++++ node_db/dev/extension-node-map.json | 17 +++++++++++++++++ node_db/new/custom-node-list.json | 20 ++++++++++++++++++++ node_db/new/extension-node-map.json | 23 +++++++++++++++++++++++ 5 files changed, 103 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index 521ac52f..c954ed14 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4304,6 +4304,26 @@ "install_type": "git-clone", "description": "A pony prompt helper extension for AUTOMATIC1111's Stable Diffusion Web UI and ComfyUI that utilizes the full power of your favorite booru query syntax. Currently supports [a/Derpibooru](https://derpibooru/org) and [a/E621](https://e621.net/)." }, + { + "author": "kijai", + "title": "ComfyUI-DDColor", + "reference": "https://github.com/kijai/ComfyUI-DDColor", + "files": [ + "https://github.com/kijai/ComfyUI-DDColor" + ], + "install_type": "git-clone", + "description": "Node to use [a/DDColor](https://github.com/piddnad/DDColor) in ComfyUI." + }, + { + "author": "chflame163", + "title": "ComfyUI Layer Style", + "reference": "https://github.com/chflame163/ComfyUI_LayerStyle", + "files": [ + "https://github.com/chflame163/ComfyUI_LayerStyle" + ], + "install_type": "git-clone", + "description": "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress." + }, diff --git a/extension-node-map.json b/extension-node-map.json index 743812fa..5f4a77f0 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -1616,7 +1616,11 @@ "ImageListSelect(FaceParsing)", "ImagePadWithBBox(FaceParsing)", "ImageResizeCalculator(FaceParsing)", + "ImageResizeWithBBox(FaceParsing)", "ImageSize(FaceParsing)", + "LatentCropWithBBox(FaceParsing)", + "LatentInsertWithBBox(FaceParsing)", + "LatentSize(FaceParsing)", "MaskComposite(FaceParsing)", "MaskListComposite(FaceParsing)", "MaskListSelect(FaceParsing)", @@ -2026,6 +2030,7 @@ "CR Split String", "CR Starburst Colors", "CR Starburst Lines", + "CR String To Boolean", "CR String To Combo", "CR String To Number", "CR Style Bars", @@ -3505,6 +3510,14 @@ "title_aux": "ComfyUI-MotionCtrl-SVD" } ], + "https://github.com/chflame163/ComfyUI_LayerStyle": [ + [ + "LayerStyle_DropShadow" + ], + { + "title_aux": "ComfyUI Layer Style" + } + ], "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": [ [ "Input Trigger", @@ -4754,6 +4767,14 @@ "title_aux": "Knodes" } ], + "https://github.com/kijai/ComfyUI-DDColor": [ + [ + "DDColor_Colorize" + ], + { + "title_aux": "ComfyUI-DDColor" + } + ], "https://github.com/kijai/ComfyUI-KJNodes": [ [ "AddLabel", @@ -4990,6 +5011,7 @@ "Base64ToMask", "ImageToBase64", "ImageToBase64Advanced", + "LoadImageFromUrl", "LoadImageToBase64", "MaskImageToBase64", "MaskToBase64", @@ -5260,6 +5282,7 @@ "RegionalSeedExplorerMask //Inspire", "RemoveBackendData //Inspire", "RemoveBackendDataNumberKey //Inspire", + "RemoveControlNet //Inspire", "RetrieveBackendData //Inspire", "RetrieveBackendDataNumberKey //Inspire", "SeedExplorer //Inspire", diff --git a/node_db/dev/extension-node-map.json b/node_db/dev/extension-node-map.json index 6a420de5..a0983ca0 100644 --- a/node_db/dev/extension-node-map.json +++ b/node_db/dev/extension-node-map.json @@ -122,6 +122,15 @@ "title_aux": "ComfyUI-AnyText\uff08WIP\uff09" } ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker": [ + [ + "PhotoMaker_Batch_Zho", + "PhotoMaker_Zho" + ], + { + "title_aux": "ComfyUI PhotoMaker (WIP)" + } + ], "https://github.com/alt-key-project/comfyui-dream-video-batches": [ [ "Blended Transition [DVB]", @@ -632,6 +641,14 @@ "title_aux": "comfy-trt-test [WIP]" } ], + "https://github.com/poisenbery/NudeNet-Detector-Provider": [ + [ + "NudeNetDetectorProvider" + ], + { + "title_aux": "NudeNet-Detector-Provider [WIP]" + } + ], "https://github.com/solarpush/comfyui_sendimage_node": [ [ "Send_To_Pod" diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 4db09793..8e6fa89d 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,26 @@ }, + { + "author": "chflame163", + "title": "ComfyUI Layer Style", + "reference": "https://github.com/chflame163/ComfyUI_LayerStyle", + "files": [ + "https://github.com/chflame163/ComfyUI_LayerStyle" + ], + "install_type": "git-clone", + "description": "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress." + }, + { + "author": "kijai", + "title": "ComfyUI-DDColor", + "reference": "https://github.com/kijai/ComfyUI-DDColor", + "files": [ + "https://github.com/kijai/ComfyUI-DDColor" + ], + "install_type": "git-clone", + "description": "Node to use [a/DDColor](https://github.com/piddnad/DDColor) in ComfyUI." + }, { "author": "prozacgod", "title": "ComfyUI Multi-Workspace", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 743812fa..5f4a77f0 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -1616,7 +1616,11 @@ "ImageListSelect(FaceParsing)", "ImagePadWithBBox(FaceParsing)", "ImageResizeCalculator(FaceParsing)", + "ImageResizeWithBBox(FaceParsing)", "ImageSize(FaceParsing)", + "LatentCropWithBBox(FaceParsing)", + "LatentInsertWithBBox(FaceParsing)", + "LatentSize(FaceParsing)", "MaskComposite(FaceParsing)", "MaskListComposite(FaceParsing)", "MaskListSelect(FaceParsing)", @@ -2026,6 +2030,7 @@ "CR Split String", "CR Starburst Colors", "CR Starburst Lines", + "CR String To Boolean", "CR String To Combo", "CR String To Number", "CR Style Bars", @@ -3505,6 +3510,14 @@ "title_aux": "ComfyUI-MotionCtrl-SVD" } ], + "https://github.com/chflame163/ComfyUI_LayerStyle": [ + [ + "LayerStyle_DropShadow" + ], + { + "title_aux": "ComfyUI Layer Style" + } + ], "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": [ [ "Input Trigger", @@ -4754,6 +4767,14 @@ "title_aux": "Knodes" } ], + "https://github.com/kijai/ComfyUI-DDColor": [ + [ + "DDColor_Colorize" + ], + { + "title_aux": "ComfyUI-DDColor" + } + ], "https://github.com/kijai/ComfyUI-KJNodes": [ [ "AddLabel", @@ -4990,6 +5011,7 @@ "Base64ToMask", "ImageToBase64", "ImageToBase64Advanced", + "LoadImageFromUrl", "LoadImageToBase64", "MaskImageToBase64", "MaskToBase64", @@ -5260,6 +5282,7 @@ "RegionalSeedExplorerMask //Inspire", "RemoveBackendData //Inspire", "RemoveBackendDataNumberKey //Inspire", + "RemoveControlNet //Inspire", "RetrieveBackendData //Inspire", "RetrieveBackendDataNumberKey //Inspire", "SeedExplorer //Inspire", From 491ad891bc8437431e8b437eb03d4e7304ab6986 Mon Sep 17 00:00:00 2001 From: chaojie Date: Thu, 18 Jan 2024 00:06:36 +0800 Subject: [PATCH 51/67] add Moore-AnimateAnyone --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index c954ed14..dfdf62ce 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4074,6 +4074,16 @@ "install_type": "git-clone", "description": "Nodes: Download the weights of DragNUWA [a/drag_nuwa_svd.pth](https://drive.google.com/file/d/1Z4JOley0SJCb35kFF4PCc6N6P1ftfX4i/view) and put it to ComfyUI/models/checkpoints/drag_nuwa_svd.pth" }, + { + "author": "chaojie", + "title": "ComfyUI-Moore-AnimateAnyone", + "reference": "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone", + "files": [ + "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone" + ], + "install_type": "git-clone", + "description": "Nodes: Run python tools/download_weights.py first to download weights automatically" + }, { "author": "alexopus", "title": "ComfyUI Image Saver", From 29cb390f7bfffb2821cd6eb9db92eb722ca5198d Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Thu, 18 Jan 2024 10:39:16 +0900 Subject: [PATCH 52/67] update DB --- extension-node-map.json | 33 ++++++++++++++++++++++++++++- node_db/new/custom-node-list.json | 10 +++++++++ node_db/new/extension-node-map.json | 33 ++++++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/extension-node-map.json b/extension-node-map.json index 5f4a77f0..90c80545 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -269,6 +269,7 @@ [ "ComfyUIDeployExternalImage", "ComfyUIDeployExternalImageAlpha", + "ComfyUIDeployExternalLora", "ComfyUIDeployExternalNumber", "ComfyUIDeployExternalNumberInt", "ComfyUIDeployExternalText" @@ -3486,6 +3487,20 @@ "title_aux": "ComfyUI-DragNUWA" } ], + "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": [ + [ + "Moore-AnimateAnyone Denoising Unet", + "Moore-AnimateAnyone Image Encoder", + "Moore-AnimateAnyone Pipeline Loader", + "Moore-AnimateAnyone Pose Guider", + "Moore-AnimateAnyone Reference Unet", + "Moore-AnimateAnyone Simple", + "Moore-AnimateAnyone VAE" + ], + { + "title_aux": "ComfyUI-Moore-AnimateAnyone" + } + ], "https://github.com/chaojie/ComfyUI-MotionCtrl": [ [ "Load Motion Camera Preset", @@ -3745,6 +3760,7 @@ "ImageCrop", "ImageInvert", "ImageOnlyCheckpointLoader", + "ImageOnlyCheckpointSave", "ImagePadForOutpaint", "ImageQuantize", "ImageScale", @@ -3953,7 +3969,20 @@ "https://github.com/daniel-lewis-ab/ComfyUI-Llama": [ [ "Call LLM", - "Load LLM Model" + "LLM_Create_Embedding", + "LLM_Detokenize", + "LLM_Embed", + "LLM_Eval", + "LLM_Generate", + "LLM_Load_State", + "LLM_Reset", + "LLM_Sample", + "LLM_Save_State", + "LLM_Token_BOS", + "LLM_Token_EOS", + "LLM_Tokenize", + "Load LLM Model", + "Load LLM Model Advanced" ], { "title_aux": "ComfyUI-Llama" @@ -4931,6 +4960,8 @@ "https://github.com/komojini/komojini-comfyui-nodes": [ [ "ImageMerger", + "KSamplerAdvancedCacheable", + "KSamplerCacheable", "UltimateVideoLoader", "UltimateVideoLoader (simple)", "YouTubeVideoLoader" diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 8e6fa89d..d7e9871e 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "chaojie", + "title": "ComfyUI-Moore-AnimateAnyone", + "reference": "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone", + "files": [ + "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone" + ], + "install_type": "git-clone", + "description": "Nodes: Run python tools/download_weights.py first to download weights automatically" + }, { "author": "chflame163", "title": "ComfyUI Layer Style", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 5f4a77f0..90c80545 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -269,6 +269,7 @@ [ "ComfyUIDeployExternalImage", "ComfyUIDeployExternalImageAlpha", + "ComfyUIDeployExternalLora", "ComfyUIDeployExternalNumber", "ComfyUIDeployExternalNumberInt", "ComfyUIDeployExternalText" @@ -3486,6 +3487,20 @@ "title_aux": "ComfyUI-DragNUWA" } ], + "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": [ + [ + "Moore-AnimateAnyone Denoising Unet", + "Moore-AnimateAnyone Image Encoder", + "Moore-AnimateAnyone Pipeline Loader", + "Moore-AnimateAnyone Pose Guider", + "Moore-AnimateAnyone Reference Unet", + "Moore-AnimateAnyone Simple", + "Moore-AnimateAnyone VAE" + ], + { + "title_aux": "ComfyUI-Moore-AnimateAnyone" + } + ], "https://github.com/chaojie/ComfyUI-MotionCtrl": [ [ "Load Motion Camera Preset", @@ -3745,6 +3760,7 @@ "ImageCrop", "ImageInvert", "ImageOnlyCheckpointLoader", + "ImageOnlyCheckpointSave", "ImagePadForOutpaint", "ImageQuantize", "ImageScale", @@ -3953,7 +3969,20 @@ "https://github.com/daniel-lewis-ab/ComfyUI-Llama": [ [ "Call LLM", - "Load LLM Model" + "LLM_Create_Embedding", + "LLM_Detokenize", + "LLM_Embed", + "LLM_Eval", + "LLM_Generate", + "LLM_Load_State", + "LLM_Reset", + "LLM_Sample", + "LLM_Save_State", + "LLM_Token_BOS", + "LLM_Token_EOS", + "LLM_Tokenize", + "Load LLM Model", + "Load LLM Model Advanced" ], { "title_aux": "ComfyUI-Llama" @@ -4931,6 +4960,8 @@ "https://github.com/komojini/komojini-comfyui-nodes": [ [ "ImageMerger", + "KSamplerAdvancedCacheable", + "KSamplerCacheable", "UltimateVideoLoader", "UltimateVideoLoader (simple)", "YouTubeVideoLoader" From a7f4ce15822eb29346c8bb733078161bcad864e5 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Thu, 18 Jan 2024 11:39:45 +0900 Subject: [PATCH 53/67] windows async fix https://github.com/ltdrdata/ComfyUI-Manager/issues/339 --- prestartup_script.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/prestartup_script.py b/prestartup_script.py index 0328849a..35157d58 100644 --- a/prestartup_script.py +++ b/prestartup_script.py @@ -456,3 +456,12 @@ if os.path.exists(script_list_path): del processed_install del pip_list + +if platform.system() == 'Windows': + try: + import asyncio + import asyncio.windows_events + asyncio.set_event_loop_policy(asyncio.windows_events.WindowsSelectorEventLoopPolicy()) + print(f"[ComfyUI-Manager] Windows event loop policy mode enabled") + except Exception as e: + print(f"[ComfyUI-Manager] WARN: Windows initialization fail: {e}") \ No newline at end of file From ae743efd0c1d9ef9240f352244f83d3341d69ea8 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Thu, 18 Jan 2024 17:05:37 +0900 Subject: [PATCH 54/67] fix: component loading --- __init__.py | 2 +- js/comfyui-manager.js | 11 +++++++- js/components-manager.js | 58 ++++++++++++++++++++++++++-------------- 3 files changed, 49 insertions(+), 22 deletions(-) diff --git a/__init__.py b/__init__.py index d3b0751f..00b460f4 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,7 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [2, 2, 1] +version = [2, 2, 2] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index 0dbce9d7..d059fb14 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -16,7 +16,7 @@ import { AlternativesInstaller } from "./a1111-alter-downloader.js"; import { SnapshotManager } from "./snapshot.js"; import { ModelInstaller } from "./model-downloader.js"; import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models } from "./common.js"; -import { ComponentBuilderDialog, load_components, set_component_policy } from "./components-manager.js"; +import { ComponentBuilderDialog, load_components, set_component_policy, getPureName } from "./components-manager.js"; var docStyle = document.createElement('style'); docStyle.innerHTML = ` @@ -407,6 +407,15 @@ function getNickname(node, nodename) { if (nicknames[nodename]) { node.nickname = nicknames[nodename]; } + else if(node.getInnerNodes) { + let pure_name = getPureName(node); + let groupNode = app.graph.extra?.groupNodes?.[pure_name]; + if(groupNode) { + let packname = groupNode.packname; + node.nickname = packname; + } + return node.nickname; + } else { for(let i in nickname_patterns) { let item = nickname_patterns[i]; diff --git a/js/components-manager.js b/js/components-manager.js index 17cc9394..e5026711 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -7,11 +7,25 @@ import { ComfyDialog, $el } from "../../scripts/ui.js"; let pack_map = {}; let rpack_map = {}; -function getPureName(node) { +export function getPureName(node) { // group nodes/ - let category = node.category.substring(12); - let purename = node.comfyClass.substring(category.length+1); - return purename; + let category = null; + if(node.category) { + category = node.category.substring(12); + } + else { + category = node.constructor.category?.substring(12); + } + if(category) { + let purename = node.comfyClass.substring(category.length+1); + return purename; + } + else if(node.comfyClass.startsWith('workflow/')) { + return node.comfyClass.substring(9); + } + else { + return node.comfyClass; + } } function isValidVersionString(version) { @@ -72,6 +86,7 @@ export async function load_components() { await config.registerType(category); register_pack_map(name, data); + break; } continue; } @@ -81,8 +96,8 @@ export async function load_components() { storeGroupNode(name, nodeData); const config = new GroupNodeConfig(name, nodeData); - while(!success) { - var success = false; + + while(true) { try { let category = nodeData.packname; if(nodeData.category) { @@ -94,12 +109,13 @@ export async function load_components() { await config.registerType(category); register_pack_map(name, nodeData); + break; } catch { let elapsed_time = Date.now() - start_time; if (elapsed_time > 5000) { failed.push(name); - success = true; + break; } else { await sleep(100); } @@ -120,8 +136,7 @@ export async function load_components() { storeGroupNode(name, nodeData); const config = new GroupNodeConfig(name, nodeData); - while(!success) { - var success = false; + while(true) { try { let category = nodeData.packname; if(nodeData.workflow.category) { @@ -133,12 +148,13 @@ export async function load_components() { await config.registerType(category); register_pack_map(name, nodeData); + break; } catch { let elapsed_time = Date.now() - start_time; if (elapsed_time > 10000) { failed2.push(name); - success = true; + break; } else { await sleep(100); } @@ -155,9 +171,7 @@ export async function load_components() { storeGroupNode(name, nodeData); const config = new GroupNodeConfig(name, nodeData); - while(!success) { - var success = false; - + while(true) { try { let category = nodeData.workflow.packname; if(nodeData.workflow.category) { @@ -169,12 +183,13 @@ export async function load_components() { await config.registerType(category); register_pack_map(name, nodeData); + break; } catch { let elapsed_time = Date.now() - start_time; if (elapsed_time > 30000) { failed.push(name); - success = true; + break; } else { await sleep(100); } @@ -708,12 +723,11 @@ function getChangedVersion(groupNodes) { const loadGraphData = app.loadGraphData; app.loadGraphData = async function () { - const v = await loadGraphData.apply(this, arguments); - if(arguments.length == 0) - return v; + return await loadGraphData.apply(this, arguments); - let groupNodes = arguments[0].extra?.groupNodes; + let graphData = arguments[0]; + let groupNodes = graphData.extra?.groupNodes; let res = getChangedVersion(groupNodes); if(res) { @@ -734,7 +748,10 @@ app.loadGraphData = async function () { if(target_components) { for(let i in target_components) { let component_name = target_components[i]; - restore_to_loaded_component(component_name); + let component = rpack_map[component_name]; + if(component && graphData.extra?.groupNodes) { + graphData.extra.groupNodes[component_name] = component; + } } } } @@ -742,7 +759,8 @@ app.loadGraphData = async function () { console.log('Empty components: policy ignored'); } - return v; + arguments[0] = graphData; + return await loadGraphData.apply(this, arguments); }; export function set_component_policy(v) { From 8d7a3aa1b3b9a4f306ff43187bde9c335d236c11 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Thu, 18 Jan 2024 17:07:09 +0900 Subject: [PATCH 55/67] fix: required ComfyUI revision --- __init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/__init__.py b/__init__.py index 00b460f4..544a30e0 100644 --- a/__init__.py +++ b/__init__.py @@ -28,12 +28,11 @@ except: print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") -version = [2, 2, 2] +version = [2, 2, 3] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') print(f"### Loading: ComfyUI-Manager ({version_str})") -required_comfyui_revision = 1793 comfy_ui_hash = "-" cache_lock = threading.Lock() From 146e0480c0922e7e6d0fdfd252db29d53d43f5e2 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Thu, 18 Jan 2024 17:25:51 +0900 Subject: [PATCH 56/67] update DB --- custom-node-list.json | 10 +++ extension-node-map.json | 16 +++- node_db/dev/custom-node-list.json | 4 +- node_db/new/custom-node-list.json | 120 +++------------------------- node_db/new/extension-node-map.json | 16 +++- 5 files changed, 52 insertions(+), 114 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index dfdf62ce..de533fa3 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4334,6 +4334,16 @@ "install_type": "git-clone", "description": "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress." }, + { + "author": "dave-palt", + "title": "comfyui_DSP_imagehelpers", + "reference": "https://github.com/dave-palt/comfyui_DSP_imagehelpers", + "files": [ + "https://github.com/dave-palt/comfyui_DSP_imagehelpers" + ], + "install_type": "git-clone", + "description": "Nodes: DSP Image Concat" + }, diff --git a/extension-node-map.json b/extension-node-map.json index 90c80545..032c0149 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -121,6 +121,7 @@ "FloatToInt-badger", "FloatToString-badger", "FrameToVideo-badger", + "GarbageCollect-badger", "GetDirName-badger", "GetUUID-badger", "IdentifyLinesBasedOnBorderColor-badger", @@ -1528,10 +1529,13 @@ "Cached Image Load From URL", "Crop Center wigh SEGS", "Crop Center with SEGS", + "Dilate Mask for Each Face", "GW Number Formatting", "Image Crop Fit", "Image Resize Fit", "OFF SEGS to Image", + "Query Gender and Age", + "Safe Mask to Image", "VAE Encode For Inpaint V2", "Watermarking" ], @@ -3988,6 +3992,14 @@ "title_aux": "ComfyUI-Llama" } ], + "https://github.com/dave-palt/comfyui_DSP_imagehelpers": [ + [ + "dsp-imagehelpers-concat" + ], + { + "title_aux": "comfyui_DSP_imagehelpers" + } + ], "https://github.com/dawangraoming/ComfyUI_ksampler_gpu/raw/main/ksampler_gpu.py": [ [ "KSamplerAdvancedGPU", @@ -5042,8 +5054,9 @@ "Base64ToMask", "ImageToBase64", "ImageToBase64Advanced", - "LoadImageFromUrl", + "LoadImageFromURL", "LoadImageToBase64", + "LoadMaskFromURL", "MaskImageToBase64", "MaskToBase64", "MaskToBase64Image", @@ -6009,6 +6022,7 @@ "ImageColorTransfer", "ImageCropByAlpha", "IntNumber", + "JoinWithDelimiter", "LaMaInpainting", "LimitNumber", "LoadImagesFromPath", diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index 07951860..5a6578cf 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -43,9 +43,9 @@ { "author": "AIGODLIKE", "title": "AIGODLIKE/ComfyUI-Model-Manager [WIP]", - "reference": "https://github.com/AIGODLIKE/ComfyUI-Model-Manager", + "reference": "https://github.com/AIGODLIKE/ComfyUI-Studio", "files": [ - "https://github.com/AIGODLIKE/ComfyUI-Model-Manager" + "https://github.com/AIGODLIKE/ComfyUI-Studio" ], "install_type": "git-clone", "description": "WIP" diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index d7e9871e..08397bc4 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -10,6 +10,16 @@ }, + { + "author": "dave-palt", + "title": "comfyui_DSP_imagehelpers", + "reference": "https://github.com/dave-palt/comfyui_DSP_imagehelpers", + "files": [ + "https://github.com/dave-palt/comfyui_DSP_imagehelpers" + ], + "install_type": "git-clone", + "description": "Nodes: DSP Image Concat" + }, { "author": "chaojie", "title": "ComfyUI-Moore-AnimateAnyone", @@ -683,116 +693,6 @@ ], "install_type": "git-clone", "description": "The easiest way to run & share any ComfyUI workflow [a/https://comfyrun.com](https://comfyrun.com)" - }, - { - "author": "ceruleandeep", - "title": "ComfyUI LLaVA Captioner", - "reference": "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner", - "files": [ - "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner" - ], - "install_type": "git-clone", - "description": "A ComfyUI extension for chatting with your images. Runs on your own system, no external services used, no filter. Uses the [a/LLaVA multimodal LLM](https://llava-vl.github.io/) so you can give instructions or ask questions in natural language. It's maybe as smart as GPT3.5, and it can see." - }, - { - "author": "jitcoder", - "title": "LoraInfo", - "reference": "https://github.com/jitcoder/lora-info", - "files": [ - "https://github.com/jitcoder/lora-info" - ], - "install_type": "git-clone", - "description": "Shows Lora information from CivitAI and outputs trigger words and example prompt" - }, - { - "author": "ttulttul", - "title": "ComfyUI Iterative Mixing Nodes", - "reference": "https://github.com/ttulttul/ComfyUI-Iterative-Mixer", - "files": [ - "https://github.com/ttulttul/ComfyUI-Iterative-Mixer" - ], - "install_type": "git-clone", - "description": "Nodes: Iterative Mixing KSampler, Batch Unsampler, Iterative Mixing KSampler Advanced" - }, - { - "author": "OpenArt-AI", - "title": "ComfyUI Assistant", - "reference": "https://github.com/OpenArt-AI/ComfyUI-Assistant", - "files": [ - "https://github.com/OpenArt-AI/ComfyUI-Assistant" - ], - "install_type": "git-clone", - "description": "ComfyUI Assistant is your one stop plugin for everything you need to get started with comfy-ui. Now it provides useful courses, tutorials, and basic templates." - }, - { - "author": "shockz0rz", - "title": "comfy-easy-grids", - "reference": "https://github.com/shockz0rz/comfy-easy-grids", - "files": [ - "https://github.com/shockz0rz/comfy-easy-grids" - ], - "install_type": "git-clone", - "description": "A set of custom nodes for creating image grids, sequences, and batches in ComfyUI." - }, - { - "author": "CosmicLaca", - "title": "Primere nodes for ComfyUI", - "reference": "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes", - "files": [ - "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes" - ], - "install_type": "git-clone", - "description": "This extension provides various utility nodes. Inputs(prompt, styles, dynamic, merger, ...), Outputs(style pile), Dashboard(selectors, loader, switch, ...), Networks(LORA, Embedding, Hypernetwork), Visuals(visual selectors, )" - }, - { - "author": "ZHO-ZHO-ZHO", - "title": "ComfyUI-Gemini", - "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini", - "files": [ - "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini" - ], - "install_type": "git-clone", - "description": "Using Gemini-pro & Gemini-pro-vision in ComfyUI." - }, - { - "author": "ZHO-ZHO-ZHO", - "title": "comfyui-portrait-master-zh-cn", - "reference": "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn", - "files": [ - "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn" - ], - "install_type": "git-clone", - "description": "ComfyUI Portrait Master 简体中文版." - }, - { - "author": "Continue7777", - "title": "comfyui-easyapi-nodes", - "reference": "https://github.com/Continue7777/comfyui-yoy", - "files": [ - "https://github.com/Continue7777/comfyui-yoy" - ], - "install_type": "git-clone", - "description": "This plugin gives you the ability to generate a real Product rendering, commonly referred to as the mockup.The most important is that we can provide it for you,cause we have a complete supply chain.You can buy products with your designs or sell them. We can provide you dropshipping services." - }, - { - "author": "RenderRift", - "title": "ComfyUI-RenderRiftNodes", - "reference": "https://github.com/RenderRift/ComfyUI-RenderRiftNodes", - "files": [ - "https://github.com/RenderRift/ComfyUI-RenderRiftNodes" - ], - "install_type": "git-clone", - "description": "Nodes:RR_Date_Folder_Format, RR_Image_Metadata_Overlay, RR_VideoPathMetaExtraction, RR_DisplayMetaOptions. This extension provides nodes designed to enhance the Animatediff workflow." - }, - { - "author": "Haoming02", - "title": "ComfyUI Floodgate", - "reference": "https://github.com/Haoming02/comfyui-floodgate", - "files": [ - "https://github.com/Haoming02/comfyui-floodgate" - ], - "install_type": "git-clone", - "description": "This is an Extension for ComfyUI, which allows you to control the logic flow with just one click!" } ] } diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 90c80545..032c0149 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -121,6 +121,7 @@ "FloatToInt-badger", "FloatToString-badger", "FrameToVideo-badger", + "GarbageCollect-badger", "GetDirName-badger", "GetUUID-badger", "IdentifyLinesBasedOnBorderColor-badger", @@ -1528,10 +1529,13 @@ "Cached Image Load From URL", "Crop Center wigh SEGS", "Crop Center with SEGS", + "Dilate Mask for Each Face", "GW Number Formatting", "Image Crop Fit", "Image Resize Fit", "OFF SEGS to Image", + "Query Gender and Age", + "Safe Mask to Image", "VAE Encode For Inpaint V2", "Watermarking" ], @@ -3988,6 +3992,14 @@ "title_aux": "ComfyUI-Llama" } ], + "https://github.com/dave-palt/comfyui_DSP_imagehelpers": [ + [ + "dsp-imagehelpers-concat" + ], + { + "title_aux": "comfyui_DSP_imagehelpers" + } + ], "https://github.com/dawangraoming/ComfyUI_ksampler_gpu/raw/main/ksampler_gpu.py": [ [ "KSamplerAdvancedGPU", @@ -5042,8 +5054,9 @@ "Base64ToMask", "ImageToBase64", "ImageToBase64Advanced", - "LoadImageFromUrl", + "LoadImageFromURL", "LoadImageToBase64", + "LoadMaskFromURL", "MaskImageToBase64", "MaskToBase64", "MaskToBase64Image", @@ -6009,6 +6022,7 @@ "ImageColorTransfer", "ImageCropByAlpha", "IntNumber", + "JoinWithDelimiter", "LaMaInpainting", "LimitNumber", "LoadImagesFromPath", From bfa7497443dfb52e3616a293fded1698a14e33c4 Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Thu, 18 Jan 2024 17:27:10 +0900 Subject: [PATCH 57/67] update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5fcfa2d0..6e439dc2 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ This repository provides Colab notebooks that allow you to install and use Comfy * Support for automatically installing dependencies of custom nodes upon restarting Colab notebooks. ## Changes +* **2.2.3** Support Components System * **0.29** Add `Update all` feature * **0.25** support db channel * You can directly modify the db channel settings in the `config.ini` file. From 5771bb25b5a541da576bae6bf478a30c33a686e0 Mon Sep 17 00:00:00 2001 From: chaojie Date: Thu, 18 Jan 2024 22:00:02 +0800 Subject: [PATCH 58/67] ComfyUI-I2VGEN-XL --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index de533fa3..f84d555c 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4084,6 +4084,16 @@ "install_type": "git-clone", "description": "Nodes: Run python tools/download_weights.py first to download weights automatically" }, + { + "author": "chaojie", + "title": "ComfyUI-I2VGEN-XL", + "reference": "https://github.com/chaojie/ComfyUI-I2VGEN-XL", + "files": [ + "https://github.com/chaojie/ComfyUI-I2VGEN-XL" + ], + "install_type": "git-clone", + "description": "Nodes: Please read the github Readme for instructions." + }, { "author": "alexopus", "title": "ComfyUI Image Saver", From de5c7ee33fc943de6170dfd0297280228d65a89f Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Fri, 19 Jan 2024 09:55:38 +0900 Subject: [PATCH 59/67] update DB --- custom-node-list.json | 32 ++++++++++- extension-node-map.json | 57 +++++++++++++++++--- node_db/dev/custom-node-list.json | 11 +++- node_db/new/custom-node-list.json | 82 ++++++++++++++--------------- node_db/new/extension-node-map.json | 57 +++++++++++++++++--- 5 files changed, 182 insertions(+), 57 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index f84d555c..59259edb 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4092,7 +4092,7 @@ "https://github.com/chaojie/ComfyUI-I2VGEN-XL" ], "install_type": "git-clone", - "description": "Nodes: Please read the github Readme for instructions." + "description": "This is an implementation of [a/i2vgen-xl](https://github.com/ali-vilab/i2vgen-xl)" }, { "author": "alexopus", @@ -4124,6 +4124,16 @@ "install_type": "git-clone", "description": "An extensive node suite that enables ComfyUI to process 3D inputs (Mesh & UV Texture, etc) using cutting edge algorithms (3DGS, NeRF, etc.)" }, + { + "author": "MrForExample", + "title": "ComfyUI-AnimateAnyone-Evolved", + "reference": "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved", + "files": [ + "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" + ], + "install_type": "git-clone", + "description": "Improved [a/AnimateAnyone](https://github.com/HumanAIGC/AnimateAnyone) implementation that allows you to use the opse image sequence and reference image to generate stylized video." + }, { "author": "Hangover3832", "title": "ComfyUI-Hangover-Nodes", @@ -4254,6 +4264,16 @@ "install_type": "git-clone", "description": "Instead of LoraLoader or HypernetworkLoader, it receives a prompt and loads and applies LoRA or HN based on the specifications within the prompt. The main purpose of this custom node is to allow changes without reconnecting the LoraLoader node when the prompt is randomly altered, etc." }, + { + "author": "Taremin", + "title": "ComfyUI String Tools", + "reference": "https://github.com/Taremin/comfyui-string-tools", + "files": [ + "https://github.com/Taremin/comfyui-string-tools" + ], + "install_type": "git-clone", + "description": " This extension provides the StringToolsConcat node, which concatenates multiple texts, and the StringToolsRandomChoice node, which selects one randomly from multiple texts." + }, { "author": "foxtrot-roger", "title": "RF Nodes", @@ -4353,6 +4373,16 @@ ], "install_type": "git-clone", "description": "Nodes: DSP Image Concat" + }, + { + "author": "Inzaniak", + "title": "Ranbooru for ComfyUI", + "reference": "https://github.com/Inzaniak/comfyui-ranbooru", + "files": [ + "https://github.com/Inzaniak/comfyui-ranbooru" + ], + "install_type": "git-clone", + "description": "Ranbooru is an extension for the comfyUI. The purpose of this extension is to add a node that gets a random set of tags from boorus pictures. This is mostly being used to help me test my checkpoints on a large variety of" }, diff --git a/extension-node-map.json b/extension-node-map.json index 032c0149..1786df5e 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -122,9 +122,11 @@ "FloatToString-badger", "FrameToVideo-badger", "GarbageCollect-badger", + "GetColorFromBorder-badger", "GetDirName-badger", "GetUUID-badger", - "IdentifyLinesBasedOnBorderColor-badger", + "IdentifyBorderColorToMask-badger", + "IdentifyColorToMask-badger", "ImageNormalization-badger", "ImageOverlap-badger", "ImageScaleToSide-badger", @@ -915,6 +917,15 @@ "title_aux": "IG Interpolation Nodes" } ], + "https://github.com/Inzaniak/comfyui-ranbooru": [ + [ + "Ranbooru", + "RandomPicturePath" + ], + { + "title_aux": "Ranbooru for ComfyUI" + } + ], "https://github.com/JPS-GER/ComfyUI_JPS-Nodes": [ [ "Conditioning Switch (JPS)", @@ -1964,7 +1975,6 @@ "CR Load Scheduled LoRAs", "CR Load Scheduled Models", "CR Load Text List", - "CR Loop List", "CR Mask Text", "CR Math Operation", "CR Model Input Switch", @@ -2011,6 +2021,7 @@ "CR Seed", "CR Seed to Int", "CR Select Font", + "CR Select ISO Size", "CR Select Model", "CR Select Resize Method", "CR Set Switch From String", @@ -2067,11 +2078,12 @@ "CR XY List", "CR XY Product", "CR XY Save Grid Image", - "CR XYZ Index" + "CR XYZ Index", + "CR_Aspect Ratio For Print" ], { "author": "Suzie1", - "description": "170 custom nodes for artists, designers and animators.", + "description": "175 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2185,6 +2197,15 @@ "title_aux": "ComfyUI Prompt ExtraNetworks" } ], + "https://github.com/Taremin/comfyui-string-tools": [ + [ + "StringToolsConcat", + "StringToolsRandomChoice" + ], + { + "title_aux": "ComfyUI String Tools" + } + ], "https://github.com/TeaCrab/ComfyUI-TeaNodes": [ [ "TC_ColorFill", @@ -2842,7 +2863,8 @@ "Gaussian Blur_Ally", "Image Flip_ally", "Placeholder Tuple", - "aegisflow Multi_Pass" + "aegisflow Multi_Pass", + "aegisflow Multi_Pass XL" ], { "title_aux": "AegisFlow Utility Nodes" @@ -3491,6 +3513,15 @@ "title_aux": "ComfyUI-DragNUWA" } ], + "https://github.com/chaojie/ComfyUI-I2VGEN-XL": [ + [ + "I2VGEN-XL Simple", + "Modelscope Pipeline Loader" + ], + { + "title_aux": "ComfyUI-I2VGEN-XL" + } + ], "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": [ [ "Moore-AnimateAnyone Denoising Unet", @@ -3531,7 +3562,10 @@ ], "https://github.com/chflame163/ComfyUI_LayerStyle": [ [ - "LayerStyle_DropShadow" + "LayerStyle_DropShadow", + "LayerStyle_ImageBlend", + "LayerStyle_ImageOpacity", + "LayerStyle_OuterGlow" ], { "title_aux": "ComfyUI Layer Style" @@ -4971,9 +5005,13 @@ ], "https://github.com/komojini/komojini-comfyui-nodes": [ [ + "FlowBuilder", + "Getter", + "ImageGetter", "ImageMerger", "KSamplerAdvancedCacheable", "KSamplerCacheable", + "Setter", "UltimateVideoLoader", "UltimateVideoLoader (simple)", "YouTubeVideoLoader" @@ -5580,6 +5618,7 @@ [ "NegiTools_CompositeImages", "NegiTools_DepthEstimationByMarigold", + "NegiTools_DetectFaceRotationForInpainting", "NegiTools_ImageProperties", "NegiTools_LatentProperties", "NegiTools_NoiseImageGenerator", @@ -6941,6 +6980,8 @@ "easy XYInputs: ControlNet", "easy XYInputs: Denoise", "easy XYInputs: ModelMergeBlocks", + "easy XYInputs: NegativeCond", + "easy XYInputs: PositiveCond", "easy XYInputs: PromptSR", "easy XYInputs: Sampler/Scheduler", "easy XYInputs: Seeds++ Batch", @@ -6962,13 +7003,14 @@ "easy imageSize", "easy imageSizeByLongerSide", "easy imageSizeBySide", + "easy imageToMask", "easy kSampler", "easy kSamplerDownscaleUnet", "easy kSamplerInpainting", "easy kSamplerSDTurbo", "easy kSamplerTiled", "easy latentCompositeMaskedWithCond", - "easy latentMultiplyBySigma", + "easy latentNoisy", "easy loraStack", "easy negative", "easy pipeIn", @@ -6985,6 +7027,7 @@ "easy samLoaderPipe", "easy seed", "easy showSpentTime", + "easy stylesSelector", "easy svdLoader", "easy ultralyticsDetectorPipe", "easy unSampler", diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index 5a6578cf..da538638 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -9,7 +9,16 @@ "description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel." }, - + { + "author": "DimaChaichan", + "title": "LAizypainter-Exporter-ComfyUI [WIP]", + "reference": "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI", + "files": [ + "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI" + ], + "install_type": "git-clone", + "description": "WIP" + }, { "author": "ZHO-ZHO-ZHO", "title": "ComfyUI PhotoMaker (WIP)", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 08397bc4..ae44049a 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -9,7 +9,48 @@ "description": "If you see this message, your ComfyUI-Manager is outdated.\nRecent channel provides only the list of the latest nodes. If you want to find the complete node list, please go to the Default channel.\nMaking LoRA has never been easier!" }, + + { + "author": "MrForExample", + "title": "ComfyUI-AnimateAnyone-Evolved", + "reference": "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved", + "files": [ + "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" + ], + "install_type": "git-clone", + "description": "Improved [a/AnimateAnyone](https://github.com/HumanAIGC/AnimateAnyone) implementation that allows you to use the opse image sequence and reference image to generate stylized video." + }, + { + "author": "chaojie", + "title": "ComfyUI-I2VGEN-XL", + "reference": "https://github.com/chaojie/ComfyUI-I2VGEN-XL", + "files": [ + "https://github.com/chaojie/ComfyUI-I2VGEN-XL" + ], + "install_type": "git-clone", + "description": "This is an implementation of [a/i2vgen-xl](https://github.com/ali-vilab/i2vgen-xl)" + }, + { + "author": "Inzaniak", + "title": "Ranbooru for ComfyUI", + "reference": "https://github.com/Inzaniak/comfyui-ranbooru", + "files": [ + "https://github.com/Inzaniak/comfyui-ranbooru" + ], + "install_type": "git-clone", + "description": "Ranbooru is an extension for the comfyUI. The purpose of this extension is to add a node that gets a random set of tags from boorus pictures. This is mostly being used to help me test my checkpoints on a large variety of" + }, + { + "author": "Taremin", + "title": "ComfyUI String Tools", + "reference": "https://github.com/Taremin/comfyui-string-tools", + "files": [ + "https://github.com/Taremin/comfyui-string-tools" + ], + "install_type": "git-clone", + "description": " This extension provides the StringToolsConcat node, which concatenates multiple texts, and the StringToolsRandomChoice node, which selects one randomly from multiple texts." + }, { "author": "dave-palt", "title": "comfyui_DSP_imagehelpers", @@ -652,47 +693,6 @@ ], "install_type": "git-clone", "description": "Nodes: Center Calculation. Improved Numerical Calculation for ComfyUI" - }, - { - "author": "Comfyui_GPT_Story", - "title": "junglehu", - "reference": "https://github.com/junglehu/Comfyui_Story_LLmA", - "files": [ - "https://github.com/junglehu/Comfyui_Story_LLmA" - ], - "install_type": "git-clone", - "description": "GPT+Comfyui Generate coherent pictures" - }, - { - "author": "HarroweD and quadmoon", - "title": "Harronode", - "reference": "https://github.com/NotHarroweD/Harronode", - "nodename_pattern": "Harronode", - "files": [ - "https://github.com/NotHarroweD/Harronode.git" - ], - "install_type": "git-clone", - "description": "Harronode is a custom node designed to build prompts easily for use with the Harrlogos SDXL LoRA. This Node simplifies the process of crafting prompts and makes all built in activation terms available at your fingertips." - }, - { - "author": "styler00dollar", - "title": "ComfyUI-sudo-latent-upscale", - "reference": "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale", - "files": [ - "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale" - ], - "install_type": "git-clone", - "description": "Directly upscaling inside the latent space. Model was trained for SD1.5 and drawn content. Might add new architectures or update models at some point. This took heavy inspriration from [city96/SD-Latent-Upscaler](https://github.com/city96/SD-Latent-Upscaler) and [Ttl/ComfyUi_NNLatentUpscale](https://github.com/Ttl/ComfyUi_NNLatentUpscale). " - }, - { - "author": "thecooltechguy", - "title": "ComfyUI-ComfyRun", - "reference": "https://github.com/thecooltechguy/ComfyUI-ComfyRun", - "files": [ - "https://github.com/thecooltechguy/ComfyUI-ComfyRun" - ], - "install_type": "git-clone", - "description": "The easiest way to run & share any ComfyUI workflow [a/https://comfyrun.com](https://comfyrun.com)" } ] } diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 032c0149..1786df5e 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -122,9 +122,11 @@ "FloatToString-badger", "FrameToVideo-badger", "GarbageCollect-badger", + "GetColorFromBorder-badger", "GetDirName-badger", "GetUUID-badger", - "IdentifyLinesBasedOnBorderColor-badger", + "IdentifyBorderColorToMask-badger", + "IdentifyColorToMask-badger", "ImageNormalization-badger", "ImageOverlap-badger", "ImageScaleToSide-badger", @@ -915,6 +917,15 @@ "title_aux": "IG Interpolation Nodes" } ], + "https://github.com/Inzaniak/comfyui-ranbooru": [ + [ + "Ranbooru", + "RandomPicturePath" + ], + { + "title_aux": "Ranbooru for ComfyUI" + } + ], "https://github.com/JPS-GER/ComfyUI_JPS-Nodes": [ [ "Conditioning Switch (JPS)", @@ -1964,7 +1975,6 @@ "CR Load Scheduled LoRAs", "CR Load Scheduled Models", "CR Load Text List", - "CR Loop List", "CR Mask Text", "CR Math Operation", "CR Model Input Switch", @@ -2011,6 +2021,7 @@ "CR Seed", "CR Seed to Int", "CR Select Font", + "CR Select ISO Size", "CR Select Model", "CR Select Resize Method", "CR Set Switch From String", @@ -2067,11 +2078,12 @@ "CR XY List", "CR XY Product", "CR XY Save Grid Image", - "CR XYZ Index" + "CR XYZ Index", + "CR_Aspect Ratio For Print" ], { "author": "Suzie1", - "description": "170 custom nodes for artists, designers and animators.", + "description": "175 custom nodes for artists, designers and animators.", "nickname": "Comfyroll Studio", "title": "Comfyroll Studio", "title_aux": "ComfyUI_Comfyroll_CustomNodes" @@ -2185,6 +2197,15 @@ "title_aux": "ComfyUI Prompt ExtraNetworks" } ], + "https://github.com/Taremin/comfyui-string-tools": [ + [ + "StringToolsConcat", + "StringToolsRandomChoice" + ], + { + "title_aux": "ComfyUI String Tools" + } + ], "https://github.com/TeaCrab/ComfyUI-TeaNodes": [ [ "TC_ColorFill", @@ -2842,7 +2863,8 @@ "Gaussian Blur_Ally", "Image Flip_ally", "Placeholder Tuple", - "aegisflow Multi_Pass" + "aegisflow Multi_Pass", + "aegisflow Multi_Pass XL" ], { "title_aux": "AegisFlow Utility Nodes" @@ -3491,6 +3513,15 @@ "title_aux": "ComfyUI-DragNUWA" } ], + "https://github.com/chaojie/ComfyUI-I2VGEN-XL": [ + [ + "I2VGEN-XL Simple", + "Modelscope Pipeline Loader" + ], + { + "title_aux": "ComfyUI-I2VGEN-XL" + } + ], "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": [ [ "Moore-AnimateAnyone Denoising Unet", @@ -3531,7 +3562,10 @@ ], "https://github.com/chflame163/ComfyUI_LayerStyle": [ [ - "LayerStyle_DropShadow" + "LayerStyle_DropShadow", + "LayerStyle_ImageBlend", + "LayerStyle_ImageOpacity", + "LayerStyle_OuterGlow" ], { "title_aux": "ComfyUI Layer Style" @@ -4971,9 +5005,13 @@ ], "https://github.com/komojini/komojini-comfyui-nodes": [ [ + "FlowBuilder", + "Getter", + "ImageGetter", "ImageMerger", "KSamplerAdvancedCacheable", "KSamplerCacheable", + "Setter", "UltimateVideoLoader", "UltimateVideoLoader (simple)", "YouTubeVideoLoader" @@ -5580,6 +5618,7 @@ [ "NegiTools_CompositeImages", "NegiTools_DepthEstimationByMarigold", + "NegiTools_DetectFaceRotationForInpainting", "NegiTools_ImageProperties", "NegiTools_LatentProperties", "NegiTools_NoiseImageGenerator", @@ -6941,6 +6980,8 @@ "easy XYInputs: ControlNet", "easy XYInputs: Denoise", "easy XYInputs: ModelMergeBlocks", + "easy XYInputs: NegativeCond", + "easy XYInputs: PositiveCond", "easy XYInputs: PromptSR", "easy XYInputs: Sampler/Scheduler", "easy XYInputs: Seeds++ Batch", @@ -6962,13 +7003,14 @@ "easy imageSize", "easy imageSizeByLongerSide", "easy imageSizeBySide", + "easy imageToMask", "easy kSampler", "easy kSamplerDownscaleUnet", "easy kSamplerInpainting", "easy kSamplerSDTurbo", "easy kSamplerTiled", "easy latentCompositeMaskedWithCond", - "easy latentMultiplyBySigma", + "easy latentNoisy", "easy loraStack", "easy negative", "easy pipeIn", @@ -6985,6 +7027,7 @@ "easy samLoaderPipe", "easy seed", "easy showSpentTime", + "easy stylesSelector", "easy svdLoader", "easy ultralyticsDetectorPipe", "easy unSampler", From d44b0a1ef2f06b0f80a6630c968fe423f4cd6bcb Mon Sep 17 00:00:00 2001 From: "dr.lt.data" Date: Fri, 19 Jan 2024 15:03:08 +0900 Subject: [PATCH 60/67] update DB --- custom-node-list.json | 2 +- extension-node-map.json | 2 -- node_db/dev/custom-node-list.json | 11 +++++++++++ node_db/new/extension-node-map.json | 2 -- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index 59259edb..c0ed1b77 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4373,7 +4373,7 @@ ], "install_type": "git-clone", "description": "Nodes: DSP Image Concat" - }, + }, { "author": "Inzaniak", "title": "Ranbooru for ComfyUI", diff --git a/extension-node-map.json b/extension-node-map.json index 1786df5e..ce6eb616 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -2320,8 +2320,6 @@ "0246.ScriptNode", "0246.ScriptPile", "0246.ScriptRule", - "0246.StrAdd", - "0246.StrAddBatch", "0246.Stringify" ], { diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index da538638..d8b7d6af 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -9,6 +9,17 @@ "description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel." }, + + { + "author": "chaojie", + "title": "LightGlue ⚡️ [WIP]", + "reference": "https://github.com/chaojie/ComfyUI-LightGlue", + "files": [ + "https://github.com/chaojie/ComfyUI-LightGlue" + ], + "install_type": "git-clone", + "description": "This extension provides custom nodes for inference of LightGlue, a lightweight feature matcher with high accuracy and blazing fast inference. It takes as input a set of keypoints and descriptors for each image and returns the indices of corresponding points. The architecture is based on adaptive pruning techniques, in both network width and depth - [a/check out the paper for more details](https://arxiv.org/pdf/2306.13643.pdf)." + }, { "author": "DimaChaichan", "title": "LAizypainter-Exporter-ComfyUI [WIP]", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 1786df5e..ce6eb616 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -2320,8 +2320,6 @@ "0246.ScriptNode", "0246.ScriptPile", "0246.ScriptRule", - "0246.StrAdd", - "0246.StrAddBatch", "0246.Stringify" ], { From c8c661bedda00976d6c11bf188f6c1fd7335efd5 Mon Sep 17 00:00:00 2001 From: chaojie Date: Fri, 19 Jan 2024 16:37:47 +0800 Subject: [PATCH 61/67] LightGlue --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index c0ed1b77..297e2d5d 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4094,6 +4094,16 @@ "install_type": "git-clone", "description": "This is an implementation of [a/i2vgen-xl](https://github.com/ali-vilab/i2vgen-xl)" }, + { + "author": "chaojie", + "title": "ComfyUI-LightGlue", + "reference": "https://github.com/chaojie/ComfyUI-LightGlue", + "files": [ + "https://github.com/chaojie/ComfyUI-LightGlue" + ], + "install_type": "git-clone", + "description": "This is an ComfyUI implementation of LightGlue to generate motion brush" + }, { "author": "alexopus", "title": "ComfyUI Image Saver", From 44e966a19e8f4717d95d7cbd8570be0574aaae37 Mon Sep 17 00:00:00 2001 From: MrForExample <62230687+MrForExample@users.noreply.github.com> Date: Fri, 19 Jan 2024 10:38:21 +0100 Subject: [PATCH 62/67] Add ComfyUI-AnimateAnyone-Evolved to ComfyUI Manager --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index 27d5ea14..e7767046 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -1237,6 +1237,16 @@ "install_type": "git-clone", "description": "A forked repository that actively maintains [a/AnimateDiff](https://github.com/ArtVentureX/comfyui-animatediff), created by ArtVentureX.\n\nImproved AnimateDiff integration for ComfyUI, adapts from sd-webui-animatediff.\n[w/Download one or more motion models from [a/Original Models](https://huggingface.co/guoyww/animatediff/tree/main) | [a/Finetuned Models](https://huggingface.co/manshoety/AD_Stabilized_Motion/tree/main). See README for additional model links and usage. Put the model weights under %%ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models%%. You are free to rename the models, but keeping original names will ease use when sharing your workflow.]" }, + { + "author": "Mr.ForExample", + "title": "ComfyUI-AnimateAnyone-Evolved", + "reference": "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved", + "files": [ + "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" + ], + "install_type": "git-clone", + "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀" + }, { "author": "Kosinkadink", "title": "ComfyUI-VideoHelperSuite", From f315888990ef2edf21a911db4f02eb84a5619c64 Mon Sep 17 00:00:00 2001 From: chaojie Date: Sat, 20 Jan 2024 04:54:33 +0800 Subject: [PATCH 63/67] Update custom-node-list.json --- custom-node-list.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/custom-node-list.json b/custom-node-list.json index c0ed1b77..789213e1 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4054,6 +4054,16 @@ "install_type": "git-clone", "description": "Nodes: Download the weights of MotionCtrl [a/motionctrl.pth](https://huggingface.co/TencentARC/MotionCtrl/blob/main/motionctrl.pth) and put it to ComfyUI/models/checkpoints" }, + { + "author": "chaojie", + "title": "ComfyUI-Motion-Vector-Extractor", + "reference": "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor", + "files": [ + "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor" + ], + "install_type": "git-clone", + "description": "Nodes: that we currently provide the package only for x86-64 linux, such as Ubuntu or Debian, and Python 3.8, 3.9, and 3.10." + }, { "author": "chaojie", "title": "ComfyUI-MotionCtrl-SVD", From 0c1fc28cf261a00f9d5a3712d4514e12a0b7ee24 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Sat, 20 Jan 2024 08:38:47 +0900 Subject: [PATCH 64/67] update db --- custom-node-list.json | 16 +++--------- extension-node-map.json | 39 ++++++++++++++++++++++++++--- node_db/dev/custom-node-list.json | 10 -------- node_db/new/custom-node-list.json | 16 +++++++++--- node_db/new/extension-node-map.json | 39 ++++++++++++++++++++++++++--- 5 files changed, 86 insertions(+), 34 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index f16b05ca..468e964a 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -1237,16 +1237,6 @@ "install_type": "git-clone", "description": "A forked repository that actively maintains [a/AnimateDiff](https://github.com/ArtVentureX/comfyui-animatediff), created by ArtVentureX.\n\nImproved AnimateDiff integration for ComfyUI, adapts from sd-webui-animatediff.\n[w/Download one or more motion models from [a/Original Models](https://huggingface.co/guoyww/animatediff/tree/main) | [a/Finetuned Models](https://huggingface.co/manshoety/AD_Stabilized_Motion/tree/main). See README for additional model links and usage. Put the model weights under %%ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models%%. You are free to rename the models, but keeping original names will ease use when sharing your workflow.]" }, - { - "author": "Mr.ForExample", - "title": "ComfyUI-AnimateAnyone-Evolved", - "reference": "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved", - "files": [ - "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" - ], - "install_type": "git-clone", - "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀" - }, { "author": "Kosinkadink", "title": "ComfyUI-VideoHelperSuite", @@ -4092,7 +4082,7 @@ "https://github.com/chaojie/ComfyUI-DragNUWA" ], "install_type": "git-clone", - "description": "Nodes: Download the weights of DragNUWA [a/drag_nuwa_svd.pth](https://drive.google.com/file/d/1Z4JOley0SJCb35kFF4PCc6N6P1ftfX4i/view) and put it to ComfyUI/models/checkpoints/drag_nuwa_svd.pth" + "description": "Nodes: Download the weights of DragNUWA [a/drag_nuwa_svd.pth](https://drive.google.com/file/d/1Z4JOley0SJCb35kFF4PCc6N6P1ftfX4i/view) and put it to ComfyUI/models/checkpoints/drag_nuwa_svd.pth\n[w/Due to changes in the torch package and versions of many other packages, it may disrupt your installation environment.]" }, { "author": "chaojie", @@ -4155,14 +4145,14 @@ "description": "An extensive node suite that enables ComfyUI to process 3D inputs (Mesh & UV Texture, etc) using cutting edge algorithms (3DGS, NeRF, etc.)" }, { - "author": "MrForExample", + "author": "Mr.ForExample", "title": "ComfyUI-AnimateAnyone-Evolved", "reference": "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved", "files": [ "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" ], "install_type": "git-clone", - "description": "Improved [a/AnimateAnyone](https://github.com/HumanAIGC/AnimateAnyone) implementation that allows you to use the opse image sequence and reference image to generate stylized video." + "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀" }, { "author": "Hangover3832", diff --git a/extension-node-map.json b/extension-node-map.json index ce6eb616..ab97d40a 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -1171,7 +1171,9 @@ ], "https://github.com/LarryJane491/Lora-Training-in-Comfy": [ [ - "Lora Training in ComfyUI" + "Lora Training in Comfy (Advanced)", + "Lora Training in ComfyUI", + "Tensorboard Access" ], { "title_aux": "Lora-Training-in-Comfy" @@ -2320,7 +2322,8 @@ "0246.ScriptNode", "0246.ScriptPile", "0246.ScriptRule", - "0246.Stringify" + "0246.Stringify", + "0246.Switch" ], { "author": "Trung0246", @@ -2825,8 +2828,10 @@ "abyz22_ToBasicPipe", "abyz22_blend_onecolor", "abyz22_blendimages", + "abyz22_bypass", "abyz22_drawmask", - "abyz22_setimageinfo" + "abyz22_setimageinfo", + "abyz22_smallhead" ], { "title_aux": "image_control" @@ -3329,6 +3334,7 @@ "RGB to HSV", "Rect Grab Cut", "Remap", + "RemapFromInsideParabolas", "RemapFromQuadrilateral (homography)", "RemapInsideParabolas", "RemapInsideParabolasAdvanced", @@ -3520,6 +3526,16 @@ "title_aux": "ComfyUI-I2VGEN-XL" } ], + "https://github.com/chaojie/ComfyUI-LightGlue": [ + [ + "LightGlue Loader", + "LightGlue Simple", + "LightGlue Simple Multi" + ], + { + "title_aux": "ComfyUI-LightGlue" + } + ], "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": [ [ "Moore-AnimateAnyone Denoising Unet", @@ -3534,6 +3550,15 @@ "title_aux": "ComfyUI-Moore-AnimateAnyone" } ], + "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor": [ + [ + "Motion Vector Extractor", + "VideoCombineThenPath" + ], + { + "title_aux": "ComfyUI-Motion-Vector-Extractor" + } + ], "https://github.com/chaojie/ComfyUI-MotionCtrl": [ [ "Load Motion Camera Preset", @@ -3560,10 +3585,15 @@ ], "https://github.com/chflame163/ComfyUI_LayerStyle": [ [ + "LayerStyle_ColorPicker", "LayerStyle_DropShadow", + "LayerStyle_Illumine", "LayerStyle_ImageBlend", "LayerStyle_ImageOpacity", - "LayerStyle_OuterGlow" + "LayerStyle_MaskInvert", + "LayerStyle_MaskPreview", + "LayerStyle_OuterGlow", + "LayerStyle_Stroke" ], { "title_aux": "ComfyUI Layer Style" @@ -4378,6 +4408,7 @@ [ "fcFloat", "fcFloatMatic", + "fcHex", "fcInteger" ], { diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index d8b7d6af..0e2a5120 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -10,16 +10,6 @@ }, - { - "author": "chaojie", - "title": "LightGlue ⚡️ [WIP]", - "reference": "https://github.com/chaojie/ComfyUI-LightGlue", - "files": [ - "https://github.com/chaojie/ComfyUI-LightGlue" - ], - "install_type": "git-clone", - "description": "This extension provides custom nodes for inference of LightGlue, a lightweight feature matcher with high accuracy and blazing fast inference. It takes as input a set of keypoints and descriptors for each image and returns the indices of corresponding points. The architecture is based on adaptive pruning techniques, in both network width and depth - [a/check out the paper for more details](https://arxiv.org/pdf/2306.13643.pdf)." - }, { "author": "DimaChaichan", "title": "LAizypainter-Exporter-ComfyUI [WIP]", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index ae44049a..846f0399 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -12,14 +12,24 @@ { - "author": "MrForExample", + "author": "chaojie", + "title": "ComfyUI-LightGlue", + "reference": "https://github.com/chaojie/ComfyUI-LightGlue", + "files": [ + "https://github.com/chaojie/ComfyUI-LightGlue" + ], + "install_type": "git-clone", + "description": "This is an ComfyUI implementation of LightGlue to generate motion brush" + }, + { + "author": "Mr.ForExample", "title": "ComfyUI-AnimateAnyone-Evolved", "reference": "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved", "files": [ "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" ], "install_type": "git-clone", - "description": "Improved [a/AnimateAnyone](https://github.com/HumanAIGC/AnimateAnyone) implementation that allows you to use the opse image sequence and reference image to generate stylized video." + "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀" }, { "author": "chaojie", @@ -239,7 +249,7 @@ "https://github.com/chaojie/ComfyUI-DragNUWA" ], "install_type": "git-clone", - "description": "Nodes: Download the weights of DragNUWA [a/drag_nuwa_svd.pth](https://drive.google.com/file/d/1Z4JOley0SJCb35kFF4PCc6N6P1ftfX4i/view) and put it to ComfyUI/models/checkpoints/drag_nuwa_svd.pth" + "description": "Nodes: Download the weights of DragNUWA [a/drag_nuwa_svd.pth](https://drive.google.com/file/d/1Z4JOley0SJCb35kFF4PCc6N6P1ftfX4i/view) and put it to ComfyUI/models/checkpoints/drag_nuwa_svd.pth\n[w/Due to changes in the torch package and versions of many other packages, it may disrupt your installation environment.]" }, { "author": "chflame163", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index ce6eb616..ab97d40a 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -1171,7 +1171,9 @@ ], "https://github.com/LarryJane491/Lora-Training-in-Comfy": [ [ - "Lora Training in ComfyUI" + "Lora Training in Comfy (Advanced)", + "Lora Training in ComfyUI", + "Tensorboard Access" ], { "title_aux": "Lora-Training-in-Comfy" @@ -2320,7 +2322,8 @@ "0246.ScriptNode", "0246.ScriptPile", "0246.ScriptRule", - "0246.Stringify" + "0246.Stringify", + "0246.Switch" ], { "author": "Trung0246", @@ -2825,8 +2828,10 @@ "abyz22_ToBasicPipe", "abyz22_blend_onecolor", "abyz22_blendimages", + "abyz22_bypass", "abyz22_drawmask", - "abyz22_setimageinfo" + "abyz22_setimageinfo", + "abyz22_smallhead" ], { "title_aux": "image_control" @@ -3329,6 +3334,7 @@ "RGB to HSV", "Rect Grab Cut", "Remap", + "RemapFromInsideParabolas", "RemapFromQuadrilateral (homography)", "RemapInsideParabolas", "RemapInsideParabolasAdvanced", @@ -3520,6 +3526,16 @@ "title_aux": "ComfyUI-I2VGEN-XL" } ], + "https://github.com/chaojie/ComfyUI-LightGlue": [ + [ + "LightGlue Loader", + "LightGlue Simple", + "LightGlue Simple Multi" + ], + { + "title_aux": "ComfyUI-LightGlue" + } + ], "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": [ [ "Moore-AnimateAnyone Denoising Unet", @@ -3534,6 +3550,15 @@ "title_aux": "ComfyUI-Moore-AnimateAnyone" } ], + "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor": [ + [ + "Motion Vector Extractor", + "VideoCombineThenPath" + ], + { + "title_aux": "ComfyUI-Motion-Vector-Extractor" + } + ], "https://github.com/chaojie/ComfyUI-MotionCtrl": [ [ "Load Motion Camera Preset", @@ -3560,10 +3585,15 @@ ], "https://github.com/chflame163/ComfyUI_LayerStyle": [ [ + "LayerStyle_ColorPicker", "LayerStyle_DropShadow", + "LayerStyle_Illumine", "LayerStyle_ImageBlend", "LayerStyle_ImageOpacity", - "LayerStyle_OuterGlow" + "LayerStyle_MaskInvert", + "LayerStyle_MaskPreview", + "LayerStyle_OuterGlow", + "LayerStyle_Stroke" ], { "title_aux": "ComfyUI Layer Style" @@ -4378,6 +4408,7 @@ [ "fcFloat", "fcFloatMatic", + "fcHex", "fcInteger" ], { From 5ab1fbd9afd1dba79e926679818a77c2e7f96932 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Sat, 20 Jan 2024 10:24:03 +0900 Subject: [PATCH 65/67] update DB --- custom-node-list.json | 20 ++++++++++++++++++++ extension-node-map.json | 8 ++++++++ node_db/dev/custom-node-list.json | 11 ++++++++++- node_db/new/custom-node-list.json | 20 ++++++++++++++++++++ node_db/new/extension-node-map.json | 8 ++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/custom-node-list.json b/custom-node-list.json index 468e964a..0c696a11 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4404,6 +4404,26 @@ "install_type": "git-clone", "description": "Ranbooru is an extension for the comfyUI. The purpose of this extension is to add a node that gets a random set of tags from boorus pictures. This is mostly being used to help me test my checkpoints on a large variety of" }, + { + "author": "Miosp", + "title": "ComfyUI-FBCNN", + "reference": "https://github.com/Miosp/ComfyUI-FBCNN", + "files": [ + "https://github.com/Miosp/ComfyUI-FBCNN" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/FBCNN](https://github.com/jiaxi-jiang/FBCNN). This is a JPEG artifact/compression removal tool, which can work automatically or with the help of a user." + }, + { + "author": "JcandZero", + "title": "ComfyUI_GLM4Node", + "reference": "https://github.com/JcandZero/ComfyUI_GLM4Node", + "files": [ + "https://github.com/JcandZero/ComfyUI_GLM4Node" + ], + "install_type": "git-clone", + "description": "GLM4 Vision Integration" + }, diff --git a/extension-node-map.json b/extension-node-map.json index ab97d40a..3d862c1c 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -1358,6 +1358,14 @@ "title_aux": "ComfyI2I" } ], + "https://github.com/Miosp/ComfyUI-FBCNN": [ + [ + "JPEG artifacts removal FBCNN" + ], + { + "title_aux": "ComfyUI-FBCNN" + } + ], "https://github.com/MitoshiroPJ/comfyui_slothful_attention": [ [ "NearSightedAttention", diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index 0e2a5120..c330379d 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -9,7 +9,16 @@ "description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel." }, - + { + "author": "prismwastaken", + "title": "prism-tools", + "reference": "https://github.com/prismwastaken/comfyui-tools", + "files": [ + "https://github.com/prismwastaken/comfyui-tools" + ], + "install_type": "git-clone", + "description": "prism-tools" + }, { "author": "DimaChaichan", "title": "LAizypainter-Exporter-ComfyUI [WIP]", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 846f0399..58fe3d58 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -11,6 +11,26 @@ + { + "author": "JcandZero", + "title": "ComfyUI_GLM4Node", + "reference": "https://github.com/JcandZero/ComfyUI_GLM4Node", + "files": [ + "https://github.com/JcandZero/ComfyUI_GLM4Node" + ], + "install_type": "git-clone", + "description": "GLM4 Vision Integration" + }, + { + "author": "Miosp", + "title": "ComfyUI-FBCNN", + "reference": "https://github.com/Miosp/ComfyUI-FBCNN", + "files": [ + "https://github.com/Miosp/ComfyUI-FBCNN" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/FBCNN](https://github.com/jiaxi-jiang/FBCNN). This is a JPEG artifact/compression removal tool, which can work automatically or with the help of a user." + }, { "author": "chaojie", "title": "ComfyUI-LightGlue", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index ab97d40a..3d862c1c 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -1358,6 +1358,14 @@ "title_aux": "ComfyI2I" } ], + "https://github.com/Miosp/ComfyUI-FBCNN": [ + [ + "JPEG artifacts removal FBCNN" + ], + { + "title_aux": "ComfyUI-FBCNN" + } + ], "https://github.com/MitoshiroPJ/comfyui_slothful_attention": [ [ "NearSightedAttention", From 98eb58c9ebeb49bbbc70063f228f6e8776bc8845 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Sat, 20 Jan 2024 10:29:49 +0900 Subject: [PATCH 66/67] update DB --- custom-node-list.json | 2 +- node_db/new/custom-node-list.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index 0c696a11..f4457d46 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4152,7 +4152,7 @@ "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" ], "install_type": "git-clone", - "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀" + "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀\n[w/The torch environment may be compromised due to version issues as some torch-related packages are being reinstalled.]" }, { "author": "Hangover3832", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 58fe3d58..72665dcf 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -49,7 +49,7 @@ "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" ], "install_type": "git-clone", - "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀" + "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀\n[w/The torch environment may be compromised due to version issues as some torch-related packages are being reinstalled.]" }, { "author": "chaojie", From 06c2a99f6da9ea2b8d0998a09cb4958668462cdd Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Sat, 20 Jan 2024 11:58:38 +0900 Subject: [PATCH 67/67] update DB --- custom-node-list.json | 11 +++++++++ node_db/new/custom-node-list.json | 40 ++++++++----------------------- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/custom-node-list.json b/custom-node-list.json index f4457d46..39e6c169 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4294,6 +4294,16 @@ "install_type": "git-clone", "description": " This extension provides the StringToolsConcat node, which concatenates multiple texts, and the StringToolsRandomChoice node, which selects one randomly from multiple texts." }, + { + "author": "Taremin", + "title": "WebUI Monaco Prompt", + "reference": "https://github.com/Taremin/webui-monaco-prompt", + "files": [ + "https://github.com/Taremin/webui-monaco-prompt" + ], + "install_type": "git-clone", + "description": "Make it possible to edit the prompt using the Monaco Editor, an editor implementation used in VSCode.\nNOTE: This extension supports both ComfyUI and A1111 simultaneously." + }, { "author": "foxtrot-roger", "title": "RF Nodes", @@ -4428,6 +4438,7 @@ + { "author": "Ser-Hilary", "title": "SDXL_sizing", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 72665dcf..5ce711f4 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -11,6 +11,16 @@ + { + "author": "Taremin", + "title": "WebUI Monaco Prompt", + "reference": "https://github.com/Taremin/webui-monaco-prompt", + "files": [ + "https://github.com/Taremin/webui-monaco-prompt" + ], + "install_type": "git-clone", + "description": "Make it possible to edit the prompt using the Monaco Editor, an editor implementation used in VSCode.\nNOTE: This extension supports both ComfyUI and A1111 simultaneously." + }, { "author": "JcandZero", "title": "ComfyUI_GLM4Node", @@ -693,36 +703,6 @@ ], "install_type": "git-clone", "description": "This extension provides nodes for [a/DeepCache: Accelerating Diffusion Models for Free](https://arxiv.org/abs/2312.00858)\nNOTE:Original code can be found [a/here](https://gist.github.com/laksjdjf/435c512bc19636e9c9af4ee7bea9eb86). Full credit to laksjdjf for sharing the code. " - }, - { - "author": "edenartlab", - "title": "eden_comfy_pipelines", - "reference": "https://github.com/edenartlab/eden_comfy_pipelines", - "files": [ - "https://github.com/edenartlab/eden_comfy_pipelines" - ], - "install_type": "git-clone", - "description": "Nodes:CLIP Interrogator." - }, - { - "author": "Limitex", - "title": "ComfyUI-Diffusers", - "reference": "https://github.com/Limitex/ComfyUI-Diffusers", - "files": [ - "https://github.com/Limitex/ComfyUI-Diffusers" - ], - "install_type": "git-clone", - "description": "This extension enables the use of the diffuser pipeline in ComfyUI." - }, - { - "author": "Limitex", - "title": "ComfyUI-Calculation", - "reference": "https://github.com/Limitex/ComfyUI-Calculation", - "files": [ - "https://github.com/Limitex/ComfyUI-Calculation" - ], - "install_type": "git-clone", - "description": "Nodes: Center Calculation. Improved Numerical Calculation for ComfyUI" } ] }