Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
faf1209eba | ||
|
|
4dee009d51 | ||
|
|
9ad54bb86c | ||
|
|
2710d72e07 | ||
|
|
c3a1401960 | ||
|
|
585cc0d991 |
14
cm-cli.py
14
cm-cli.py
@@ -12,6 +12,7 @@ from rich import print
|
|||||||
from typing_extensions import List, Annotated
|
from typing_extensions import List, Annotated
|
||||||
import re
|
import re
|
||||||
import git
|
import git
|
||||||
|
import importlib
|
||||||
|
|
||||||
|
|
||||||
sys.path.append(os.path.dirname(__file__))
|
sys.path.append(os.path.dirname(__file__))
|
||||||
@@ -88,12 +89,20 @@ read_downgrade_blacklist() # This is a preparation step for manager_core
|
|||||||
|
|
||||||
|
|
||||||
class Ctx:
|
class Ctx:
|
||||||
|
folder_paths = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.channel = 'default'
|
self.channel = 'default'
|
||||||
self.no_deps = False
|
self.no_deps = False
|
||||||
self.mode = 'cache'
|
self.mode = 'cache'
|
||||||
self.user_directory = None
|
self.user_directory = None
|
||||||
self.custom_nodes_paths = [os.path.join(core.comfy_path, 'custom_nodes')]
|
self.custom_nodes_paths = [os.path.join(core.comfy_path, 'custom_nodes')]
|
||||||
|
|
||||||
|
if Ctx.folder_paths is None:
|
||||||
|
try:
|
||||||
|
Ctx.folder_paths = importlib.import_module('folder_paths')
|
||||||
|
except ImportError:
|
||||||
|
print("Warning: Unable to import folder_paths module")
|
||||||
|
|
||||||
def set_channel_mode(self, channel, mode):
|
def set_channel_mode(self, channel, mode):
|
||||||
if mode is not None:
|
if mode is not None:
|
||||||
@@ -145,7 +154,10 @@ class Ctx:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_custom_nodes_paths():
|
def get_custom_nodes_paths():
|
||||||
return folder_paths.get_folder_paths('custom_nodes')
|
if Ctx.folder_paths is None:
|
||||||
|
print("Error: folder_paths module is not available")
|
||||||
|
return []
|
||||||
|
return Ctx.folder_paths.get_folder_paths('custom_nodes')
|
||||||
|
|
||||||
|
|
||||||
cmd_ctx = Ctx()
|
cmd_ctx = Ctx()
|
||||||
|
|||||||
@@ -4004,6 +4004,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Integrates GLSL shader support."
|
"description": "Integrates GLSL shader support."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "amorano",
|
||||||
|
"title": "Jovi_Spout",
|
||||||
|
"id": "jovi_spout",
|
||||||
|
"reference": "https://github.com/Amorano/Jovi_Spout",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Amorano/Jovi_Spout"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI Nodes for using Spout streams."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "Umikaze-job",
|
"author": "Umikaze-job",
|
||||||
"title": "select_folder_path_easy",
|
"title": "select_folder_path_easy",
|
||||||
@@ -18797,6 +18808,27 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Run DDUF in ComfyUI - powered by Diffusers."
|
"description": "Run DDUF in ComfyUI - powered by Diffusers."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "AconexOfficial",
|
||||||
|
"title": "ComfyUI GOAT Nodes",
|
||||||
|
"reference": "https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes to level up your workflows performance and streamline specific functions."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Jaminanim",
|
||||||
|
"title": "ComfyUI-Random-Int-Divisor-Node",
|
||||||
|
"reference": "https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A set of custom ComfyUI nodes for generating random integers within a range, adjusted to the nearest multiple of a user-defined divisor. Needlessly includes both an efficient and simple list implementation. Updates with each generation."
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1226,6 +1226,27 @@
|
|||||||
"title_aux": "ComfyUI Nodes for External Tooling"
|
"title_aux": "ComfyUI Nodes for External Tooling"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes": [
|
||||||
|
[
|
||||||
|
"Advanced_Upscale_Image_Using_Model",
|
||||||
|
"Capped_Float_Positive",
|
||||||
|
"Capped_Int_Positive",
|
||||||
|
"Embedding_Selector",
|
||||||
|
"Fast_Color_Match",
|
||||||
|
"Fast_Film_Grain",
|
||||||
|
"Get_Side_Length_Of_Image",
|
||||||
|
"Image_Dimensions",
|
||||||
|
"Image_Tiler",
|
||||||
|
"Image_Untiler",
|
||||||
|
"Int_Divide_Rounded",
|
||||||
|
"Sampler_Settings",
|
||||||
|
"Smart_Seed",
|
||||||
|
"Triple_Prompt"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI GOAT Nodes"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Aerse/ComfyUI-Seed-Nodes": [
|
"https://github.com/Aerse/ComfyUI-Seed-Nodes": [
|
||||||
[
|
[
|
||||||
"Seed-Nodes: ImagePixelator",
|
"Seed-Nodes: ImagePixelator",
|
||||||
@@ -1349,6 +1370,15 @@
|
|||||||
"title_aux": "Jovi_GLSL"
|
"title_aux": "Jovi_GLSL"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Amorano/Jovi_Spout": [
|
||||||
|
[
|
||||||
|
"SPOUT READER (JOV_SP) \ud83d\udcfa",
|
||||||
|
"SPOUT WRITER (JOV_SP) \ud83c\udfa5"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "Jovi_Spout"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Amorano/Jovimetrix": [
|
"https://github.com/Amorano/Jovimetrix": [
|
||||||
[
|
[
|
||||||
"ADJUST (JOV) \ud83d\udd78\ufe0f",
|
"ADJUST (JOV) \ud83d\udd78\ufe0f",
|
||||||
@@ -4337,6 +4367,15 @@
|
|||||||
"title_aux": "ComfyUI-AI-Assistant"
|
"title_aux": "ComfyUI-AI-Assistant"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node": [
|
||||||
|
[
|
||||||
|
"RandomIntegerNodeEfficient",
|
||||||
|
"RandomIntegerNodeList"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-Random-Int-Divisor-Node"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Jannchie/ComfyUI-J": [
|
"https://github.com/Jannchie/ComfyUI-J": [
|
||||||
[
|
[
|
||||||
"DiffusersCompelPromptEmbedding",
|
"DiffusersCompelPromptEmbedding",
|
||||||
@@ -9160,7 +9199,9 @@
|
|||||||
"InstaCText",
|
"InstaCText",
|
||||||
"InstaCTextML",
|
"InstaCTextML",
|
||||||
"InstaPromptMultipleStyleSelector",
|
"InstaPromptMultipleStyleSelector",
|
||||||
"InstaPromptStyleSelector"
|
"InstaPromptStyleSelector",
|
||||||
|
"LoadVideo",
|
||||||
|
"PreViewVideo"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "InstaSD nodes for ComfyUI"
|
"title_aux": "InstaSD nodes for ComfyUI"
|
||||||
@@ -15407,6 +15448,7 @@
|
|||||||
"Griptape Util: Create Agent Modelfile",
|
"Griptape Util: Create Agent Modelfile",
|
||||||
"Griptape Util: Create Model from Modelfile",
|
"Griptape Util: Create Model from Modelfile",
|
||||||
"Griptape Util: Remove Ollama Model",
|
"Griptape Util: Remove Ollama Model",
|
||||||
|
"Griptape Util: Switch Node",
|
||||||
"Griptape Vector Store Driver: Amazon OpenSearch",
|
"Griptape Vector Store Driver: Amazon OpenSearch",
|
||||||
"Griptape Vector Store Driver: Azure MongoDB",
|
"Griptape Vector Store Driver: Azure MongoDB",
|
||||||
"Griptape Vector Store Driver: Griptape Cloud",
|
"Griptape Vector Store Driver: Griptape Cloud",
|
||||||
|
|||||||
@@ -127,8 +127,17 @@ def gitcheck(path, do_fetch=False):
|
|||||||
|
|
||||||
|
|
||||||
def switch_to_default_branch(repo):
|
def switch_to_default_branch(repo):
|
||||||
default_branch = repo.git.symbolic_ref('refs/remotes/origin/HEAD').replace('refs/remotes/origin/', '')
|
try:
|
||||||
repo.git.checkout(default_branch)
|
default_branch = repo.git.symbolic_ref('refs/remotes/origin/HEAD').replace('refs/remotes/origin/', '')
|
||||||
|
repo.git.checkout(default_branch)
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
repo.git.checkout(repo.heads.master)
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
repo.git.checkout(repo.heads.main)
|
||||||
|
except:
|
||||||
|
print("[ComfyUI Manager] Failed to switch to the default branch (master or main)")
|
||||||
|
|
||||||
|
|
||||||
def gitpull(path):
|
def gitpull(path):
|
||||||
|
|||||||
@@ -484,6 +484,11 @@
|
|||||||
"last_update": "2024-12-09 18:53:55",
|
"last_update": "2024-12-09 18:53:55",
|
||||||
"author_account_age_days": 3997
|
"author_account_age_days": 3997
|
||||||
},
|
},
|
||||||
|
"https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes": {
|
||||||
|
"stars": 3,
|
||||||
|
"last_update": "2025-01-03 17:02:12",
|
||||||
|
"author_account_age_days": 1674
|
||||||
|
},
|
||||||
"https://github.com/Aerse/ComfyUI-Seed-Nodes": {
|
"https://github.com/Aerse/ComfyUI-Seed-Nodes": {
|
||||||
"stars": 3,
|
"stars": 3,
|
||||||
"last_update": "2024-12-17 05:40:40",
|
"last_update": "2024-12-17 05:40:40",
|
||||||
@@ -524,6 +529,11 @@
|
|||||||
"last_update": "2024-12-28 08:52:32",
|
"last_update": "2024-12-28 08:52:32",
|
||||||
"author_account_age_days": 5405
|
"author_account_age_days": 5405
|
||||||
},
|
},
|
||||||
|
"https://github.com/Amorano/Jovi_Spout": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2025-01-03 22:41:31",
|
||||||
|
"author_account_age_days": 5405
|
||||||
|
},
|
||||||
"https://github.com/Amorano/Jovimetrix": {
|
"https://github.com/Amorano/Jovimetrix": {
|
||||||
"stars": 289,
|
"stars": 289,
|
||||||
"last_update": "2024-12-30 06:20:41",
|
"last_update": "2024-12-30 06:20:41",
|
||||||
@@ -1549,6 +1559,11 @@
|
|||||||
"last_update": "2024-09-05 03:42:14",
|
"last_update": "2024-09-05 03:42:14",
|
||||||
"author_account_age_days": 764
|
"author_account_age_days": 764
|
||||||
},
|
},
|
||||||
|
"https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2025-01-03 20:59:40",
|
||||||
|
"author_account_age_days": 1755
|
||||||
|
},
|
||||||
"https://github.com/Jannchie/ComfyUI-J": {
|
"https://github.com/Jannchie/ComfyUI-J": {
|
||||||
"stars": 84,
|
"stars": 84,
|
||||||
"last_update": "2024-09-14 15:22:29",
|
"last_update": "2024-09-14 15:22:29",
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ def install_node(node_id, version=None):
|
|||||||
|
|
||||||
|
|
||||||
def all_versions_of_node(node_id):
|
def all_versions_of_node(node_id):
|
||||||
url = f"https://api.comfy.org/nodes/{node_id}/versions"
|
url = f"https://api.comfy.org/nodes/{node_id}/versions?statuses=NodeVersionStatusActive&statuses=NodeVersionStatusPending"
|
||||||
|
|
||||||
response = requests.get(url)
|
response = requests.get(url)
|
||||||
if response.status_code == 200:
|
if response.status_code == 200:
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ import manager_downloader
|
|||||||
from node_package import InstalledNodePackage
|
from node_package import InstalledNodePackage
|
||||||
|
|
||||||
|
|
||||||
version_code = [3, 3, 6]
|
version_code = [3, 3, 9]
|
||||||
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
||||||
|
|
||||||
|
|
||||||
@@ -263,6 +263,27 @@ def is_installed(name):
|
|||||||
print(f"[ComfyUI-Manager] skip black listed pip installation: '{name}'")
|
print(f"[ComfyUI-Manager] skip black listed pip installation: '{name}'")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
pkg = manager_util.get_installed_packages().get(name.lower())
|
||||||
|
if pkg is None:
|
||||||
|
return False # update if not installed
|
||||||
|
|
||||||
|
if match is None:
|
||||||
|
return True # don't update if version is not specified
|
||||||
|
|
||||||
|
if match.group(2) in ['>', '>=']:
|
||||||
|
if manager_util.StrictVersion(pkg) < manager_util.StrictVersion(match.group(3)):
|
||||||
|
return False
|
||||||
|
elif manager_util.StrictVersion(pkg) > manager_util.StrictVersion(match.group(3)):
|
||||||
|
print(f"[SKIP] Downgrading pip package isn't allowed: {name.lower()} (cur={pkg})")
|
||||||
|
|
||||||
|
if match.group(2) == '==':
|
||||||
|
if manager_util.StrictVersion(pkg) < manager_util.StrictVersion(match.group(3)):
|
||||||
|
return False
|
||||||
|
|
||||||
|
if match.group(2) == '~=':
|
||||||
|
if manager_util.StrictVersion(pkg) == manager_util.StrictVersion(match.group(3)):
|
||||||
|
return False
|
||||||
|
|
||||||
return name.lower() in manager_util.get_installed_packages()
|
return name.lower() in manager_util.get_installed_packages()
|
||||||
|
|
||||||
|
|
||||||
@@ -1489,8 +1510,17 @@ def get_config():
|
|||||||
|
|
||||||
|
|
||||||
def switch_to_default_branch(repo):
|
def switch_to_default_branch(repo):
|
||||||
default_branch = repo.git.symbolic_ref('refs/remotes/origin/HEAD').replace('refs/remotes/origin/', '')
|
try:
|
||||||
repo.git.checkout(default_branch)
|
default_branch = repo.git.symbolic_ref('refs/remotes/origin/HEAD').replace('refs/remotes/origin/', '')
|
||||||
|
repo.git.checkout(default_branch)
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
repo.git.checkout(repo.heads.master)
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
repo.git.checkout(repo.heads.main)
|
||||||
|
except:
|
||||||
|
print("[ComfyUI Manager] Failed to switch to the default branch (master or main)")
|
||||||
|
|
||||||
|
|
||||||
def try_install_script(url, repo_path, install_cmd, instant_execution=False):
|
def try_install_script(url, repo_path, install_cmd, instant_execution=False):
|
||||||
|
|||||||
@@ -153,10 +153,6 @@ def set_preview_method(method):
|
|||||||
set_preview_method(core.get_config()['preview_method'])
|
set_preview_method(core.get_config()['preview_method'])
|
||||||
|
|
||||||
|
|
||||||
def set_badge_mode(mode):
|
|
||||||
core.get_config()['badge_mode'] = mode
|
|
||||||
|
|
||||||
|
|
||||||
def set_default_ui_mode(mode):
|
def set_default_ui_mode(mode):
|
||||||
core.get_config()['default_ui'] = mode
|
core.get_config()['default_ui'] = mode
|
||||||
|
|
||||||
@@ -1153,17 +1149,6 @@ async def preview_method(request):
|
|||||||
return web.Response(status=200)
|
return web.Response(status=200)
|
||||||
|
|
||||||
|
|
||||||
@routes.get("/manager/badge_mode")
|
|
||||||
async def badge_mode(request):
|
|
||||||
if "value" in request.rel_url.query:
|
|
||||||
set_badge_mode(request.rel_url.query['value'])
|
|
||||||
core.write_config()
|
|
||||||
else:
|
|
||||||
return web.Response(text=core.get_config()['badge_mode'], status=200)
|
|
||||||
|
|
||||||
return web.Response(status=200)
|
|
||||||
|
|
||||||
|
|
||||||
@routes.get("/manager/default_ui")
|
@routes.get("/manager/default_ui")
|
||||||
async def default_ui_mode(request):
|
async def default_ui_mode(request):
|
||||||
if "value" in request.rel_url.query:
|
if "value" in request.rel_url.query:
|
||||||
|
|||||||
@@ -103,24 +103,6 @@ docStyle.innerHTML = `
|
|||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
#cm-channel-badge {
|
|
||||||
color: white;
|
|
||||||
background-color: #AA0000;
|
|
||||||
width: 220px;
|
|
||||||
height: 23px;
|
|
||||||
font-size: 13px;
|
|
||||||
border-radius: 5px;
|
|
||||||
left: 5px;
|
|
||||||
top: 5px;
|
|
||||||
align-content: center;
|
|
||||||
justify-content: center;
|
|
||||||
text-align: center;
|
|
||||||
font-weight: bold;
|
|
||||||
float: left;
|
|
||||||
vertical-align: middle;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-nodes-grid a {
|
#custom-nodes-grid a {
|
||||||
color: #5555FF;
|
color: #5555FF;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -244,7 +226,6 @@ var update_comfyui_button = null;
|
|||||||
var switch_comfyui_button = null;
|
var switch_comfyui_button = null;
|
||||||
var fetch_updates_button = null;
|
var fetch_updates_button = null;
|
||||||
var update_all_button = null;
|
var update_all_button = null;
|
||||||
var badge_mode = "none";
|
|
||||||
let share_option = 'all';
|
let share_option = 'all';
|
||||||
|
|
||||||
// copied style from https://github.com/pythongosssss/ComfyUI-Custom-Scripts
|
// copied style from https://github.com/pythongosssss/ComfyUI-Custom-Scripts
|
||||||
@@ -426,14 +407,6 @@ const style = `
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async function init_badge_mode() {
|
|
||||||
api.fetchApi('/manager/badge_mode')
|
|
||||||
.then(response => response.text())
|
|
||||||
.then(data => { badge_mode = data; })
|
|
||||||
}
|
|
||||||
|
|
||||||
async function init_share_option() {
|
async function init_share_option() {
|
||||||
api.fetchApi('/manager/share_option')
|
api.fetchApi('/manager/share_option')
|
||||||
.then(response => response.text())
|
.then(response => response.text())
|
||||||
@@ -450,7 +423,6 @@ async function init_notice(notice) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
await init_badge_mode();
|
|
||||||
await init_share_option();
|
await init_share_option();
|
||||||
|
|
||||||
async function fetchNicknames() {
|
async function fetchNicknames() {
|
||||||
@@ -517,65 +489,6 @@ function getNickname(node, nodename) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawBadge(node, orig, restArgs) {
|
|
||||||
let ctx = restArgs[0];
|
|
||||||
const r = orig?.apply?.(node, restArgs);
|
|
||||||
|
|
||||||
if (!node.flags.collapsed && badge_mode != 'none' && node.constructor.title_mode != LiteGraph.NO_TITLE) {
|
|
||||||
let text = "";
|
|
||||||
if (badge_mode.startsWith('id_nick'))
|
|
||||||
text = `#${node.id} `;
|
|
||||||
|
|
||||||
let nick = node.getNickname();
|
|
||||||
if (nick) {
|
|
||||||
if (nick == 'ComfyUI') {
|
|
||||||
if(badge_mode.endsWith('hide')) {
|
|
||||||
nick = "";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nick = "🦊"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nick.length > 25) {
|
|
||||||
text += nick.substring(0, 23) + "..";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
text += nick;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (text != "") {
|
|
||||||
let fgColor = "white";
|
|
||||||
let bgColor = "#0F1F0F";
|
|
||||||
let visible = true;
|
|
||||||
|
|
||||||
ctx.save();
|
|
||||||
ctx.font = "12px sans-serif";
|
|
||||||
const sz = ctx.measureText(text);
|
|
||||||
ctx.fillStyle = bgColor;
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.roundRect(node.size[0] - sz.width - 12, -LiteGraph.NODE_TITLE_HEIGHT - 20, sz.width + 12, 20, 5);
|
|
||||||
ctx.fill();
|
|
||||||
|
|
||||||
ctx.fillStyle = fgColor;
|
|
||||||
ctx.fillText(text, node.size[0] - sz.width - 6, -LiteGraph.NODE_TITLE_HEIGHT - 6);
|
|
||||||
ctx.restore();
|
|
||||||
|
|
||||||
if (node.has_errors) {
|
|
||||||
ctx.save();
|
|
||||||
ctx.font = "bold 14px sans-serif";
|
|
||||||
const sz2 = ctx.measureText(node.type);
|
|
||||||
ctx.fillStyle = 'white';
|
|
||||||
ctx.fillText(node.type, node.size[0] / 2 - sz2.width / 2, node.size[1] / 2);
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async function updateComfyUI() {
|
async function updateComfyUI() {
|
||||||
let prev_text = update_comfyui_button.innerText;
|
let prev_text = update_comfyui_button.innerText;
|
||||||
update_comfyui_button.innerText = "Updating ComfyUI...";
|
update_comfyui_button.innerText = "Updating ComfyUI...";
|
||||||
@@ -1069,32 +982,9 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
api.fetchApi(`/manager/preview_method?value=${event.target.value}`);
|
api.fetchApi(`/manager/preview_method?value=${event.target.value}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
// nickname
|
|
||||||
let badge_combo = "";
|
|
||||||
if(is_legacy_front()) {
|
|
||||||
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' }, []));
|
|
||||||
badge_combo.appendChild($el('option', { value: 'nick_hide', text: 'Badge: Nickname (hide built-in)' }, []));
|
|
||||||
badge_combo.appendChild($el('option', { value: 'id_nick', text: 'Badge: #ID Nickname' }, []));
|
|
||||||
badge_combo.appendChild($el('option', { value: 'id_nick_hide', text: 'Badge: #ID Nickname (hide built-in)' }, []));
|
|
||||||
|
|
||||||
api.fetchApi('/manager/badge_mode')
|
|
||||||
.then(response => response.text())
|
|
||||||
.then(data => { badge_combo.value = data; badge_mode = data; });
|
|
||||||
|
|
||||||
badge_combo.addEventListener('change', function (event) {
|
|
||||||
api.fetchApi(`/manager/badge_mode?value=${event.target.value}`);
|
|
||||||
badge_mode = event.target.value;
|
|
||||||
app.graph.setDirtyCanvas(true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// channel
|
// channel
|
||||||
let channel_combo = document.createElement("select");
|
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.setAttribute("title", "Configure the channel for retrieving data from the Custom Node list (including missing nodes) or the Model list.");
|
||||||
channel_combo.className = "cm-menu-combo";
|
channel_combo.className = "cm-menu-combo";
|
||||||
api.fetchApi('/manager/channel_url_list')
|
api.fetchApi('/manager/channel_url_list')
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
@@ -1218,7 +1108,6 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
this.datasrc_combo,
|
this.datasrc_combo,
|
||||||
channel_combo,
|
channel_combo,
|
||||||
preview_combo,
|
preview_combo,
|
||||||
badge_combo,
|
|
||||||
default_ui_combo,
|
default_ui_combo,
|
||||||
share_combo,
|
share_combo,
|
||||||
component_policy_combo,
|
component_policy_combo,
|
||||||
@@ -1663,32 +1552,6 @@ app.registerExtension({
|
|||||||
this._addExtraNodeContextMenu(nodeType, app);
|
this._addExtraNodeContextMenu(nodeType, app);
|
||||||
},
|
},
|
||||||
|
|
||||||
async nodeCreated(node, app) {
|
|
||||||
if(is_legacy_front()) {
|
|
||||||
if(!node.badge_enabled) {
|
|
||||||
node.getNickname = function () { return getNickname(node, node.comfyClass.trim()) };
|
|
||||||
let orig = node.onDrawForeground;
|
|
||||||
if(!orig)
|
|
||||||
orig = node.__proto__.onDrawForeground;
|
|
||||||
|
|
||||||
node.onDrawForeground = function (ctx) {
|
|
||||||
drawBadge(node, orig, arguments)
|
|
||||||
};
|
|
||||||
node.badge_enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
async loadedGraphNode(node, app) {
|
|
||||||
if(is_legacy_front()) {
|
|
||||||
if(!node.badge_enabled) {
|
|
||||||
const orig = node.onDrawForeground;
|
|
||||||
node.getNickname = function () { return getNickname(node, node.type.trim()) };
|
|
||||||
node.onDrawForeground = function (ctx) { drawBadge(node, orig, arguments) };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_addExtraNodeContextMenu(node, app) {
|
_addExtraNodeContextMenu(node, app) {
|
||||||
const origGetExtraMenuOptions = node.prototype.getExtraMenuOptions;
|
const origGetExtraMenuOptions = node.prototype.getExtraMenuOptions;
|
||||||
node.prototype.cm_menu_added = true;
|
node.prototype.cm_menu_added = true;
|
||||||
|
|||||||
@@ -563,8 +563,10 @@
|
|||||||
"DevToolsNodeWithOnlyOptionalInput",
|
"DevToolsNodeWithOnlyOptionalInput",
|
||||||
"DevToolsNodeWithOptionalInput",
|
"DevToolsNodeWithOptionalInput",
|
||||||
"DevToolsNodeWithOutputList",
|
"DevToolsNodeWithOutputList",
|
||||||
|
"DevToolsNodeWithSeedInput",
|
||||||
"DevToolsNodeWithStringInput",
|
"DevToolsNodeWithStringInput",
|
||||||
"DevToolsNodeWithUnionInput",
|
"DevToolsNodeWithUnionInput",
|
||||||
|
"DevToolsObjectPatchNode",
|
||||||
"DevToolsSimpleSlider"
|
"DevToolsSimpleSlider"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,6 +9,37 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
"author": "amorano",
|
||||||
|
"title": "Jovi_Spout",
|
||||||
|
"id": "jovi_spout",
|
||||||
|
"reference": "https://github.com/Amorano/Jovi_Spout",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Amorano/Jovi_Spout"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI Nodes for using Spout streams."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "AconexOfficial",
|
||||||
|
"title": "ComfyUI GOAT Nodes",
|
||||||
|
"reference": "https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes to level up your workflows performance and streamline specific functions."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Jaminanim",
|
||||||
|
"title": "ComfyUI-Random-Int-Divisor-Node",
|
||||||
|
"reference": "https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A set of custom ComfyUI nodes for generating random integers within a range, adjusted to the nearest multiple of a user-defined divisor. Needlessly includes both an efficient and simple list implementation. Updates with each generation."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "LucipherDev",
|
"author": "LucipherDev",
|
||||||
"title": "ComfyUI-AniDoc",
|
"title": "ComfyUI-AniDoc",
|
||||||
@@ -664,37 +695,6 @@
|
|||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A collection of specialized image processing nodes for ComfyUI, focused on dataset preparation and pixel art manipulation."
|
"description": "A collection of specialized image processing nodes for ComfyUI, focused on dataset preparation and pixel art manipulation."
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "BIMer-99",
|
|
||||||
"title": "ComfyUI_FishSpeech_EX",
|
|
||||||
"reference": "https://github.com/BIMer-99/ComfyUI_FishSpeech_EX",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/BIMer-99/ComfyUI_FishSpeech_EX"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This plugin is optimized for Fish-Speech-1.5 version and is only applicable to version 1.5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "CyanAutumn",
|
|
||||||
"title": "ComfyUi Random Manage Cyan",
|
|
||||||
"id": "CyanAutumn",
|
|
||||||
"reference": "https://github.com/CyanAutumn/ComfyUi_Random_Manage_Cyan",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/CyanAutumn/ComfyUi_Random_Manage_Cyan"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A random prompt node"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "kazeyori",
|
|
||||||
"title": "Quick Image Sequence Process",
|
|
||||||
"reference": "https://github.com/kazeyori/ComfyUI-QuickImageSequenceProcess",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/kazeyori/ComfyUI-QuickImageSequenceProcess"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A ComfyUI plugin for quick image sequence processing. This plugin allows users to manipulate frame sequences with various operations including frame insertion, deletion, and duplication."
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1226,6 +1226,27 @@
|
|||||||
"title_aux": "ComfyUI Nodes for External Tooling"
|
"title_aux": "ComfyUI Nodes for External Tooling"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes": [
|
||||||
|
[
|
||||||
|
"Advanced_Upscale_Image_Using_Model",
|
||||||
|
"Capped_Float_Positive",
|
||||||
|
"Capped_Int_Positive",
|
||||||
|
"Embedding_Selector",
|
||||||
|
"Fast_Color_Match",
|
||||||
|
"Fast_Film_Grain",
|
||||||
|
"Get_Side_Length_Of_Image",
|
||||||
|
"Image_Dimensions",
|
||||||
|
"Image_Tiler",
|
||||||
|
"Image_Untiler",
|
||||||
|
"Int_Divide_Rounded",
|
||||||
|
"Sampler_Settings",
|
||||||
|
"Smart_Seed",
|
||||||
|
"Triple_Prompt"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI GOAT Nodes"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Aerse/ComfyUI-Seed-Nodes": [
|
"https://github.com/Aerse/ComfyUI-Seed-Nodes": [
|
||||||
[
|
[
|
||||||
"Seed-Nodes: ImagePixelator",
|
"Seed-Nodes: ImagePixelator",
|
||||||
@@ -1349,6 +1370,15 @@
|
|||||||
"title_aux": "Jovi_GLSL"
|
"title_aux": "Jovi_GLSL"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Amorano/Jovi_Spout": [
|
||||||
|
[
|
||||||
|
"SPOUT READER (JOV_SP) \ud83d\udcfa",
|
||||||
|
"SPOUT WRITER (JOV_SP) \ud83c\udfa5"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "Jovi_Spout"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Amorano/Jovimetrix": [
|
"https://github.com/Amorano/Jovimetrix": [
|
||||||
[
|
[
|
||||||
"ADJUST (JOV) \ud83d\udd78\ufe0f",
|
"ADJUST (JOV) \ud83d\udd78\ufe0f",
|
||||||
@@ -4337,6 +4367,15 @@
|
|||||||
"title_aux": "ComfyUI-AI-Assistant"
|
"title_aux": "ComfyUI-AI-Assistant"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node": [
|
||||||
|
[
|
||||||
|
"RandomIntegerNodeEfficient",
|
||||||
|
"RandomIntegerNodeList"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-Random-Int-Divisor-Node"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Jannchie/ComfyUI-J": [
|
"https://github.com/Jannchie/ComfyUI-J": [
|
||||||
[
|
[
|
||||||
"DiffusersCompelPromptEmbedding",
|
"DiffusersCompelPromptEmbedding",
|
||||||
@@ -9160,7 +9199,9 @@
|
|||||||
"InstaCText",
|
"InstaCText",
|
||||||
"InstaCTextML",
|
"InstaCTextML",
|
||||||
"InstaPromptMultipleStyleSelector",
|
"InstaPromptMultipleStyleSelector",
|
||||||
"InstaPromptStyleSelector"
|
"InstaPromptStyleSelector",
|
||||||
|
"LoadVideo",
|
||||||
|
"PreViewVideo"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "InstaSD nodes for ComfyUI"
|
"title_aux": "InstaSD nodes for ComfyUI"
|
||||||
@@ -15407,6 +15448,7 @@
|
|||||||
"Griptape Util: Create Agent Modelfile",
|
"Griptape Util: Create Agent Modelfile",
|
||||||
"Griptape Util: Create Model from Modelfile",
|
"Griptape Util: Create Model from Modelfile",
|
||||||
"Griptape Util: Remove Ollama Model",
|
"Griptape Util: Remove Ollama Model",
|
||||||
|
"Griptape Util: Switch Node",
|
||||||
"Griptape Vector Store Driver: Amazon OpenSearch",
|
"Griptape Vector Store Driver: Amazon OpenSearch",
|
||||||
"Griptape Vector Store Driver: Azure MongoDB",
|
"Griptape Vector Store Driver: Azure MongoDB",
|
||||||
"Griptape Vector Store Driver: Griptape Cloud",
|
"Griptape Vector Store Driver: Griptape Cloud",
|
||||||
|
|||||||
@@ -437,6 +437,14 @@ def is_installed(name):
|
|||||||
elif manager_util.StrictVersion(pkg) > manager_util.StrictVersion(match.group(3)):
|
elif manager_util.StrictVersion(pkg) > manager_util.StrictVersion(match.group(3)):
|
||||||
print(f"[SKIP] Downgrading pip package isn't allowed: {name.lower()} (cur={pkg})")
|
print(f"[SKIP] Downgrading pip package isn't allowed: {name.lower()} (cur={pkg})")
|
||||||
|
|
||||||
|
if match.group(2) == '==':
|
||||||
|
if manager_util.StrictVersion(pkg) < manager_util.StrictVersion(match.group(3)):
|
||||||
|
return False
|
||||||
|
|
||||||
|
if match.group(2) == '~=':
|
||||||
|
if manager_util.StrictVersion(pkg) == manager_util.StrictVersion(match.group(3)):
|
||||||
|
return False
|
||||||
|
|
||||||
return True # prevent downgrade
|
return True # prevent downgrade
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "comfyui-manager"
|
name = "comfyui-manager"
|
||||||
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
||||||
version = "3.3.6"
|
version = "3.3.9"
|
||||||
license = { file = "LICENSE.txt" }
|
license = { file = "LICENSE.txt" }
|
||||||
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]
|
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user