Browse Source

improve: badge

update scanner
pull/224/head
Dr.Lt.Data 12 months ago committed by dr.lt.data
parent
commit
61514612f8
  1. 18
      __init__.py
  2. 2
      custom-node-list.json
  3. 111
      extension-node-map.json
  4. 11
      js/comfyui-manager.js
  5. 20
      node_db/dev/custom-node-list.json
  6. 111
      node_db/new/extension-node-map.json
  7. 40
      scanner.py

18
__init__.py

@ -16,8 +16,9 @@ from urllib.parse import urlparse
import http.client
import re
import signal
import nodes
version = "V1.8.3"
version = "V1.9"
print(f"### Loading: ComfyUI-Manager ({version})")
required_comfyui_revision = 1793
@ -617,6 +618,21 @@ async def fetch_customnode_mappings(request):
json_obj = await get_data(uri)
all_nodes = set()
patterns = []
for k, x in json_obj.items():
all_nodes.update(set(x[0]))
if 'nodename_pattern' in x[1]:
patterns.append((x[1]['nodename_pattern'], x[0]))
missing_nodes = set(nodes.NODE_CLASS_MAPPINGS.keys()) - all_nodes
for x in missing_nodes:
for pat, item in patterns:
if re.match(pat, x):
item.append(x)
return web.json_response(json_obj, content_type='application/json')

2
custom-node-list.json

@ -2113,7 +2113,7 @@
"https://github.com/chrisgoringe/cg-use-everywhere"
],
"install_type": "git-clone",
"nodename_pattern": "^(UE\\? |UE )",
"nodename_pattern": "(^(Prompts|Anything) Everywhere|Simple String)",
"description": "A set of nodes that allow data to be 'broadcast' to some or all unconnected inputs. Greatly reduces link spaghetti."
},
{

111
extension-node-map.json

@ -94,6 +94,16 @@
"title_aux": "ComfyUI Nodes for External Tooling"
}
],
"https://github.com/Amorano/Jovimetrix": [
[],
{
"author": "amorano",
"description": "Procedural & Compositing. Includes a Webcam node.",
"nodename_pattern": " \\(jov\\)$",
"title": "Jovimetrix Composition Pack",
"title_aux": "Jovimetrix Composition Nodes"
}
],
"https://github.com/ArtBot2023/CharacterFaceSwap": [
[
"Color Blend",
@ -130,7 +140,8 @@
[
"LogSigmas",
"SpliceDenoised",
"SpliceLatents"
"SpliceLatents",
"TemporalSplice"
],
{
"title_aux": "SpliceTools"
@ -546,6 +557,13 @@
"title_aux": "ComfyUI's ControlNet Auxiliary Preprocessors"
}
],
"https://github.com/Feidorian/feidorian-ComfyNodes": [
[],
{
"nodename_pattern": "^Feidorian_",
"title_aux": "feidorian-ComfyNodes"
}
],
"https://github.com/Fictiverse/ComfyUI_Fictiverse": [
[
"Add Noise to Image with Mask",
@ -652,11 +670,12 @@
],
"https://github.com/Haoming02/comfyui-diffusion-cg": [
[
"Center Sampler",
"Center Sampler XL",
"Hook Recenter",
"Hook Recenter XL",
"Normalization",
"NormalizationXL",
"Tensor Debug"
"Tensor Debug",
"Unhook Recenter"
],
{
"title_aux": "ComfyUI Diffusion Color Grading"
@ -1104,7 +1123,9 @@
],
"https://github.com/Off-Live/ComfyUI-off-suite": [
[
"Cached Image Load From URL",
"Crop Center wigh SEGS",
"Crop Center with SEGS",
"GW Number Formatting",
"Image Crop Fit",
"Image Resize Fit",
@ -1704,6 +1725,7 @@
"author": "tinyterra",
"description": "This extension offers various pipe nodes, fullscreen image viewer based on node history, dynamic widgets, interface customization, and more.",
"nickname": "ttNodes",
"nodename_pattern": "^ttN ",
"title": "tinyterraNodes",
"title_aux": "tinyterraNodes"
}
@ -2707,7 +2729,8 @@
],
"https://github.com/chflame163/ComfyUI_MSSpeech_TTS": [
[
"MicorsoftSpeech_TTS"
"MicorsoftSpeech_TTS",
"Play Sound"
],
{
"title_aux": "ComfyUI_MSSpeech_TTS"
@ -2766,6 +2789,7 @@
"Seed Everywhere"
],
{
"nodename_pattern": "(^(Prompts|Anything) Everywhere|Simple String)",
"title_aux": "Use Everywhere (UE Nodes)"
}
],
@ -3089,12 +3113,12 @@
"title_aux": "KSampler GPU"
}
],
"https://github.com/daxthin/facedetailer": [
"https://github.com/daxthin/DZ-FaceDetailer": [
[
"DZ_Face_Detailer"
],
{
"title_aux": "facedetailer"
"title_aux": "DZ-FaceDetailer"
}
],
"https://github.com/dimtoneff/ComfyUI-PixelArt-Detector": [
@ -3246,6 +3270,14 @@
"title_aux": "Pixelization"
}
],
"https://github.com/filliptm/ComfyUI_Fill-Nodes": [
[
"FL_ImageRandomizer"
],
{
"title_aux": "ComfyUI_Fill-Nodes"
}
],
"https://github.com/fitCorder/fcSuite/raw/main/fcSuite.py": [
[
"fcFloat",
@ -3534,6 +3566,13 @@
"title_aux": "Efficiency Nodes for ComfyUI Version 2.0+"
}
],
"https://github.com/jamesWalker55/comfyui-various": [
[],
{
"nodename_pattern": "^JW",
"title_aux": "Various ComfyUI Nodes by Type"
}
],
"https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes": [
[
"JjkConcat",
@ -3555,6 +3594,22 @@
"title_aux": "ComfyUI-sampler-lcm-alternative"
}
],
"https://github.com/jtrue/ComfyUI-JaRue": [
[
"ConcatStringWithDelimiter_jru",
"ConcatString_jru",
"Float2Int_jru",
"Float2String_jru",
"ImageSizer_jru",
"Int2FloatMultiply_jru",
"Int2String_jru",
"String2Int_jru",
"YouTube2Prompt_jru"
],
{
"title_aux": "ComfyUI-JaRue"
}
],
"https://github.com/ka-puna/comfyui-yanc": [
[
"YANC.ConcatStrings",
@ -3677,7 +3732,9 @@
],
"https://github.com/knuknX/ComfyUI-Image-Tools": [
[
"BatchImageResizeProcessor",
"ImageBatchSqueezeProcessor",
"ImageBgRemoveProcessor",
"ImageStandardResizeProcessor",
"SingleImagePathLoader",
"SingleImageUrlLoader"
],
@ -4022,6 +4079,7 @@
"author": "Dr.Lt.Data",
"description": "This extension provides various nodes to support Lora Block Weight and the Impact Pack.",
"nickname": "Inspire Pack",
"nodename_pattern": "Inspire$",
"title": "Inspire Pack",
"title_aux": "ComfyUI Inspire Pack"
}
@ -4174,6 +4232,7 @@
"Vae Decode (mtb)"
],
{
"nodename_pattern": "\\(mtb\\)$",
"title_aux": "MTB Nodes"
}
],
@ -4363,6 +4422,7 @@
"Text Box - Ostris"
],
{
"nodename_pattern": "- Ostris$",
"title_aux": "Ostris Nodes ComfyUI"
}
],
@ -4415,23 +4475,7 @@
],
"https://github.com/peteromallet/ComfyUI-Creative-Interpolation": [
[
"ACN_AdvancedControlNetApplyImport",
"BatchCreativeInterpolation",
"ControlNetLoaderAdvancedImport",
"CustomControlNetWeights",
"CustomT2IAdapterWeights",
"DiffControlNetLoaderAdvancedImport",
"FILMVFIImport",
"LatentKeyframeBatchedGroupImport",
"LatentKeyframeGroupImport",
"LatentKeyframeImport",
"LatentKeyframeTiming",
"LoadImagesFromDirectory",
"MaskGenerator",
"ScaledSoftControlNetWeightsImport",
"SoftControlNetWeights",
"SoftT2IAdapterWeights",
"TimestepKeyframe"
"BatchCreativeInterpolation"
],
{
"title_aux": "ComfyUI-Creative-Interpolation [Beta]"
@ -4506,6 +4550,17 @@
"title_aux": "comfyui-prompt-reader-node"
}
],
"https://github.com/rgthree/rgthree-comfy": [
[],
{
"author": "rgthree",
"description": "A bunch of nodes I created that I also find useful.",
"nickname": "rgthree",
"nodename_pattern": " \\(rgthree\\)$",
"title": "Comfy Nodes",
"title_aux": "rgthree's ComfyUi Nodes"
}
],
"https://github.com/richinsley/Comfy-LFO": [
[
"LFO_Pulse",
@ -4583,6 +4638,7 @@
"ChatGPTOpenAI",
"CombineMasks_",
"CombineSegMasks",
"EditLayer",
"EmptyLayer",
"EnhanceImage",
"FaceToMask",
@ -4597,6 +4653,8 @@
"ShowTextForGPT",
"SmoothMask",
"SplitLongMask",
"SvgImage",
"TextImage",
"TransparentImage",
"VAEDecodeConsistencyDecoder",
"VAELoaderConsistencyDecoder"
@ -4906,6 +4964,7 @@
"ImageShuffle",
"LCMGenerate",
"LCMGenerate_ReferenceOnly",
"LCMGenerate_SDTurbo",
"LCMGenerate_img2img",
"LCMGenerate_img2img_IPAdapter",
"LCMGenerate_img2img_controlnet",
@ -4914,6 +4973,7 @@
"LCMLoader",
"LCMLoader_RefInpaint",
"LCMLoader_ReferenceOnly",
"LCMLoader_SDTurbo",
"LCMLoader_controlnet",
"LCMLoader_controlnet_inpaint",
"LCMLoader_img2img",
@ -5017,6 +5077,7 @@
"Random Line 4"
],
{
"nodename_pattern": "\\(mtb\\)$",
"title_aux": "Hakkun-ComfyUI-nodes"
}
],

11
js/comfyui-manager.js vendored

@ -230,6 +230,7 @@ async function fetchNicknames() {
const mappings = await response1.json();
let result = {};
let nickname_patterns = [];
for (let i in mappings) {
let item = mappings[i];
@ -244,12 +245,16 @@ async function fetchNicknames() {
for (let j in item[0]) {
result[item[0][j]] = nickname;
}
if(item[1].nodename_pattern) {
nickname_patterns.push([item[1].nodename_pattern, nickname]);
}
}
return result;
return [result, nickname_patterns];
}
let nicknames = await fetchNicknames();
const [nicknames, nickname_patterns] = await fetchNicknames();
async function updateComfyUI() {
@ -917,7 +922,9 @@ app.registerExtension({
this._addExtraNodeContextMenu(nodeType, app);
},
async nodeCreated(node, app) {
},
async loadedGraphNode(node, app) {
if (node.has_errors) {
const onDrawForeground = node.onDrawForeground;

20
node_db/dev/custom-node-list.json

@ -1,5 +1,25 @@
{
"custom_nodes": [
{
"author": "talesofai",
"title": "comfyui-supersave [WIP]",
"reference": "https://github.com/talesofai/comfyui-supersave",
"files": [
"https://github.com/talesofai/comfyui-supersave"
],
"install_type": "git-clone",
"description": "WIP"
},
{
"author": "Sai-ComfyUI",
"title": "ComfyUI-MS-Nodes [WIP]",
"reference": "https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes",
"files": [
"https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes"
],
"install_type": "git-clone",
"description": "WIP"
},
{
"author": "eigenpunk",
"title": "ComfyUI-audio",

111
node_db/new/extension-node-map.json

@ -94,6 +94,16 @@
"title_aux": "ComfyUI Nodes for External Tooling"
}
],
"https://github.com/Amorano/Jovimetrix": [
[],
{
"author": "amorano",
"description": "Procedural & Compositing. Includes a Webcam node.",
"nodename_pattern": " \\(jov\\)$",
"title": "Jovimetrix Composition Pack",
"title_aux": "Jovimetrix Composition Nodes"
}
],
"https://github.com/ArtBot2023/CharacterFaceSwap": [
[
"Color Blend",
@ -130,7 +140,8 @@
[
"LogSigmas",
"SpliceDenoised",
"SpliceLatents"
"SpliceLatents",
"TemporalSplice"
],
{
"title_aux": "SpliceTools"
@ -546,6 +557,13 @@
"title_aux": "ComfyUI's ControlNet Auxiliary Preprocessors"
}
],
"https://github.com/Feidorian/feidorian-ComfyNodes": [
[],
{
"nodename_pattern": "^Feidorian_",
"title_aux": "feidorian-ComfyNodes"
}
],
"https://github.com/Fictiverse/ComfyUI_Fictiverse": [
[
"Add Noise to Image with Mask",
@ -652,11 +670,12 @@
],
"https://github.com/Haoming02/comfyui-diffusion-cg": [
[
"Center Sampler",
"Center Sampler XL",
"Hook Recenter",
"Hook Recenter XL",
"Normalization",
"NormalizationXL",
"Tensor Debug"
"Tensor Debug",
"Unhook Recenter"
],
{
"title_aux": "ComfyUI Diffusion Color Grading"
@ -1104,7 +1123,9 @@
],
"https://github.com/Off-Live/ComfyUI-off-suite": [
[
"Cached Image Load From URL",
"Crop Center wigh SEGS",
"Crop Center with SEGS",
"GW Number Formatting",
"Image Crop Fit",
"Image Resize Fit",
@ -1704,6 +1725,7 @@
"author": "tinyterra",
"description": "This extension offers various pipe nodes, fullscreen image viewer based on node history, dynamic widgets, interface customization, and more.",
"nickname": "ttNodes",
"nodename_pattern": "^ttN ",
"title": "tinyterraNodes",
"title_aux": "tinyterraNodes"
}
@ -2707,7 +2729,8 @@
],
"https://github.com/chflame163/ComfyUI_MSSpeech_TTS": [
[
"MicorsoftSpeech_TTS"
"MicorsoftSpeech_TTS",
"Play Sound"
],
{
"title_aux": "ComfyUI_MSSpeech_TTS"
@ -2766,6 +2789,7 @@
"Seed Everywhere"
],
{
"nodename_pattern": "(^(Prompts|Anything) Everywhere|Simple String)",
"title_aux": "Use Everywhere (UE Nodes)"
}
],
@ -3089,12 +3113,12 @@
"title_aux": "KSampler GPU"
}
],
"https://github.com/daxthin/facedetailer": [
"https://github.com/daxthin/DZ-FaceDetailer": [
[
"DZ_Face_Detailer"
],
{
"title_aux": "facedetailer"
"title_aux": "DZ-FaceDetailer"
}
],
"https://github.com/dimtoneff/ComfyUI-PixelArt-Detector": [
@ -3246,6 +3270,14 @@
"title_aux": "Pixelization"
}
],
"https://github.com/filliptm/ComfyUI_Fill-Nodes": [
[
"FL_ImageRandomizer"
],
{
"title_aux": "ComfyUI_Fill-Nodes"
}
],
"https://github.com/fitCorder/fcSuite/raw/main/fcSuite.py": [
[
"fcFloat",
@ -3534,6 +3566,13 @@
"title_aux": "Efficiency Nodes for ComfyUI Version 2.0+"
}
],
"https://github.com/jamesWalker55/comfyui-various": [
[],
{
"nodename_pattern": "^JW",
"title_aux": "Various ComfyUI Nodes by Type"
}
],
"https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes": [
[
"JjkConcat",
@ -3555,6 +3594,22 @@
"title_aux": "ComfyUI-sampler-lcm-alternative"
}
],
"https://github.com/jtrue/ComfyUI-JaRue": [
[
"ConcatStringWithDelimiter_jru",
"ConcatString_jru",
"Float2Int_jru",
"Float2String_jru",
"ImageSizer_jru",
"Int2FloatMultiply_jru",
"Int2String_jru",
"String2Int_jru",
"YouTube2Prompt_jru"
],
{
"title_aux": "ComfyUI-JaRue"
}
],
"https://github.com/ka-puna/comfyui-yanc": [
[
"YANC.ConcatStrings",
@ -3677,7 +3732,9 @@
],
"https://github.com/knuknX/ComfyUI-Image-Tools": [
[
"BatchImageResizeProcessor",
"ImageBatchSqueezeProcessor",
"ImageBgRemoveProcessor",
"ImageStandardResizeProcessor",
"SingleImagePathLoader",
"SingleImageUrlLoader"
],
@ -4022,6 +4079,7 @@
"author": "Dr.Lt.Data",
"description": "This extension provides various nodes to support Lora Block Weight and the Impact Pack.",
"nickname": "Inspire Pack",
"nodename_pattern": "Inspire$",
"title": "Inspire Pack",
"title_aux": "ComfyUI Inspire Pack"
}
@ -4174,6 +4232,7 @@
"Vae Decode (mtb)"
],
{
"nodename_pattern": "\\(mtb\\)$",
"title_aux": "MTB Nodes"
}
],
@ -4363,6 +4422,7 @@
"Text Box - Ostris"
],
{
"nodename_pattern": "- Ostris$",
"title_aux": "Ostris Nodes ComfyUI"
}
],
@ -4415,23 +4475,7 @@
],
"https://github.com/peteromallet/ComfyUI-Creative-Interpolation": [
[
"ACN_AdvancedControlNetApplyImport",
"BatchCreativeInterpolation",
"ControlNetLoaderAdvancedImport",
"CustomControlNetWeights",
"CustomT2IAdapterWeights",
"DiffControlNetLoaderAdvancedImport",
"FILMVFIImport",
"LatentKeyframeBatchedGroupImport",
"LatentKeyframeGroupImport",
"LatentKeyframeImport",
"LatentKeyframeTiming",
"LoadImagesFromDirectory",
"MaskGenerator",
"ScaledSoftControlNetWeightsImport",
"SoftControlNetWeights",
"SoftT2IAdapterWeights",
"TimestepKeyframe"
"BatchCreativeInterpolation"
],
{
"title_aux": "ComfyUI-Creative-Interpolation [Beta]"
@ -4506,6 +4550,17 @@
"title_aux": "comfyui-prompt-reader-node"
}
],
"https://github.com/rgthree/rgthree-comfy": [
[],
{
"author": "rgthree",
"description": "A bunch of nodes I created that I also find useful.",
"nickname": "rgthree",
"nodename_pattern": " \\(rgthree\\)$",
"title": "Comfy Nodes",
"title_aux": "rgthree's ComfyUi Nodes"
}
],
"https://github.com/richinsley/Comfy-LFO": [
[
"LFO_Pulse",
@ -4583,6 +4638,7 @@
"ChatGPTOpenAI",
"CombineMasks_",
"CombineSegMasks",
"EditLayer",
"EmptyLayer",
"EnhanceImage",
"FaceToMask",
@ -4597,6 +4653,8 @@
"ShowTextForGPT",
"SmoothMask",
"SplitLongMask",
"SvgImage",
"TextImage",
"TransparentImage",
"VAEDecodeConsistencyDecoder",
"VAELoaderConsistencyDecoder"
@ -4906,6 +4964,7 @@
"ImageShuffle",
"LCMGenerate",
"LCMGenerate_ReferenceOnly",
"LCMGenerate_SDTurbo",
"LCMGenerate_img2img",
"LCMGenerate_img2img_IPAdapter",
"LCMGenerate_img2img_controlnet",
@ -4914,6 +4973,7 @@
"LCMLoader",
"LCMLoader_RefInpaint",
"LCMLoader_ReferenceOnly",
"LCMLoader_SDTurbo",
"LCMLoader_controlnet",
"LCMLoader_controlnet_inpaint",
"LCMLoader_img2img",
@ -5017,6 +5077,7 @@
"Random Line 4"
],
{
"nodename_pattern": "\\(mtb\\)$",
"title_aux": "Hakkun-ComfyUI-nodes"
}
],

40
scanner.py

@ -119,9 +119,9 @@ def get_git_urls_from_json(json_file):
if node.get('install_type') == 'git-clone':
files = node.get('files', [])
if files:
git_clone_files.append((files[0], node.get('title')))
git_clone_files.append((files[0], node.get('title'), node.get('nodename_pattern')))
git_clone_files.append(("https://github.com/comfyanonymous/ComfyUI", "ComfyUI"))
git_clone_files.append(("https://github.com/comfyanonymous/ComfyUI", "ComfyUI", None))
return git_clone_files
@ -136,7 +136,7 @@ def get_py_urls_from_json(json_file):
if node.get('install_type') == 'copy':
files = node.get('files', [])
if files:
py_files.append((files[0],node.get('title')))
py_files.append((files[0], node.get('title'), node.get('nodename_pattern')))
return py_files
@ -171,25 +171,25 @@ def update_custom_nodes():
git_url_titles = get_git_urls_from_json('custom-node-list.json')
def process_git_url_title(url, title):
def process_git_url_title(url, title, node_pattern):
name = os.path.basename(url)
if name.endswith(".git"):
name = name[:-4]
node_info[name] = (url, title)
node_info[name] = (url, title, node_pattern)
clone_or_pull_git_repository(url)
with concurrent.futures.ThreadPoolExecutor(10) as executor:
for url, title in git_url_titles:
executor.submit(process_git_url_title, url, title)
for url, title, node_pattern in git_url_titles:
executor.submit(process_git_url_title, url, title, node_pattern)
py_url_titles = get_py_urls_from_json('custom-node-list.json')
py_url_titles_and_pattern = get_py_urls_from_json('custom-node-list.json')
def download_and_store_info(url_title):
url, title = url_title
def download_and_store_info(url_title_and_pattern):
url, title, node_pattern = url_title_and_pattern
name = os.path.basename(url)
if name.endswith(".py"):
node_info[name] = (url, title)
node_info[name] = (url, title, node_pattern)
try:
download_url(url, ".tmp")
@ -197,7 +197,7 @@ def update_custom_nodes():
print(f"[ERROR] Cannot download '{url}'")
with concurrent.futures.ThreadPoolExecutor(10) as executor:
executor.map(download_and_store_info, py_url_titles)
executor.map(download_and_store_info, py_url_titles_and_pattern)
return node_info
@ -223,13 +223,15 @@ def gen_json(node_info):
dirname = os.path.basename(dirname)
if len(nodes) > 0:
if len(nodes) > 0 or (dirname in node_info and node_info[dirname][2] is not None):
nodes = list(nodes)
nodes.sort()
if dirname in node_info:
git_url, title = node_info[dirname]
git_url, title, node_pattern = node_info[dirname]
metadata['title_aux'] = title
if node_pattern is not None:
metadata['nodename_pattern'] = node_pattern
data[git_url] = (nodes, metadata)
else:
print(f"WARN: {dirname} is removed from custom-node-list.json")
@ -237,15 +239,17 @@ def gen_json(node_info):
for file in node_files:
nodes, metadata = scan_in_file(file)
if len(nodes) > 0:
if len(nodes) > 0 or (dirname in node_info and node_info[dirname][2] is not None):
nodes = list(nodes)
nodes.sort()
file = os.path.basename(file)
if file in node_info:
url, title = node_info[file]
url, title, node_pattern = node_info[file]
metadata['title_aux'] = title
if node_pattern is not None:
metadata['nodename_pattern'] = node_pattern
data[url] = (nodes, metadata)
else:
print(f"Missing info: {url}")
@ -256,7 +260,7 @@ def gen_json(node_info):
for extension in extensions:
node_list_json_path = os.path.join('.tmp', extension, 'node_list.json')
if os.path.exists(node_list_json_path):
git_url, title = node_info[extension]
git_url, title, node_pattern = node_info[extension]
with open(node_list_json_path, 'r', encoding='utf-8') as f:
node_list_json = json.load(f)
@ -272,6 +276,8 @@ def gen_json(node_info):
nodes.add(x.strip())
metadata_in_url['title_aux'] = title
if node_pattern is not None:
metadata['nodename_pattern'] = node_pattern
nodes = list(nodes)
nodes.sort()
data[git_url] = (nodes, metadata_in_url)

Loading…
Cancel
Save