diff --git a/README.md b/README.md index 313a5199..306339da 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ ![menu](misc/menu.jpg) ## NOTICE +* V2.37 Show a ✅ mark to accounts that have been active on GitHub for more than six months. * V2.33 Security policy is applied. * V2.21 [cm-cli](docs/en/cm-cli.md) tool is added. * V2.18 to V2.18.3 is not functioning due to a severe bug. Users on these versions are advised to promptly update to V2.18.4. Please navigate to the `ComfyUI/custom_nodes/ComfyUI-Manager` directory and execute `git pull` to update. @@ -85,6 +86,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.38** `Install Custom Nodes` menu is changed to `Custom Nodes Manager`. * **2.21** [cm-cli](docs/en/cm-cli.md) tool is added. * **2.4** Copy the connections of the nearest node by double-clicking. * **2.2.3** Support Components System @@ -277,11 +279,11 @@ NODE_CLASS_MAPPINGS.update({ ## Support of missing nodes installation -![missing-menu](misc/missing-menu.png) +![missing-menu](misc/missing-menu.jpg) * When you click on the ```Install Missing Custom Nodes``` button in the menu, it displays a list of extension nodes that contain nodes not currently present in the workflow. -![missing-list](misc/missing-list.png) +![missing-list](misc/missing-list.jpg) ## Additional Feature diff --git a/alter-list.json b/alter-list.json index c60b2b8f..a41e7f2b 100644 --- a/alter-list.json +++ b/alter-list.json @@ -126,7 +126,7 @@ "description": "This is a ported version of ComfyUI for the sd-webui-roop-nsfw extension." }, { - "id":"https://github.com/laksjdjf/attention-couple-ComfyUI", + "id":"https://github.com/laksjdjf/cgem156-ComfyUI", "tags":"regional prompt, latent couple, prompt", "description": "This custom nodes provide a functionality similar to regional prompts, offering couple features at the attention level." }, @@ -214,6 +214,11 @@ "id":"https://github.com/portu-sim/comfyui-bmab", "tags":"bmab", "description": "a comfyui custom node for [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab)" + }, + { + "id":"https://github.com/ThereforeGames/ComfyUI-Unprompted", + "tags":"unprompted", + "description": "This extension is a port of [a/unprompted](https://github.com/ThereforeGames/unprompted)" } ] } \ No newline at end of file diff --git a/check.sh b/check.sh index c57178bc..6fa408c7 100755 --- a/check.sh +++ b/check.sh @@ -1,5 +1,8 @@ #!/bin/bash +echo +echo CHECK1 + files=( "custom-node-list.json" "model-list.json" @@ -26,3 +29,14 @@ files=( for file in "${files[@]}"; do python json-checker.py "$file" done + +echo +echo CHECK2 +find ~/.tmp/default -name "*.py" -print0 | xargs -0 grep "crypto" + +echo +echo CHECK3 +find ~/.tmp/default -name "requirements.txt" | xargs grep "^\s*https\\?:" +find ~/.tmp/default -name "requirements.txt" | xargs grep "\.whl" + +echo diff --git a/custom-node-list.json b/custom-node-list.json index f6aba985..e2d28f21 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -46,6 +46,17 @@ "install_type": "git-clone", "description": "Nodes: ModelSamplerTonemapNoiseTest, TonemapNoiseWithRescaleCFG, ReferenceOnlySimple, RescaleClassifierFreeGuidanceTest, ModelMergeBlockNumber, ModelMergeSDXL, ModelMergeSDXLTransformers, ModelMergeSDXLDetailedTransformers." }, + { + "author": "comfyanonymous", + "title": "TensorRT Node for ComfyUI", + "id": "tensorrt", + "reference": "https://github.com/comfyanonymous/ComfyUI_TensorRT", + "files": [ + "https://github.com/comfyanonymous/ComfyUI_TensorRT" + ], + "install_type": "git-clone", + "description": "This node enables the best performance on NVIDIA RTX™ Graphics Cards (GPUs) for Stable Diffusion by leveraging NVIDIA TensorRT." + }, { "author": "Stability-AI", "title": "Stability API nodes for ComfyUI", @@ -2010,14 +2021,14 @@ }, { "author": "laksjdjf", - "title": "attention-couple-ComfyUI", - "id": "attention-couple", - "reference": "https://github.com/laksjdjf/attention-couple-ComfyUI", + "title": "cgem156-ComfyUI🍌", + "id": "cgem156", + "reference": "https://github.com/laksjdjf/cgem156-ComfyUI", "files": [ - "https://github.com/laksjdjf/attention-couple-ComfyUI" + "https://github.com/laksjdjf/cgem156-ComfyUI" ], "install_type": "git-clone", - "description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet." + "description": "The custom nodes of laksjdjf have been integrated into the node pack of cgem156🍌.\nNOTE:This includes the attention couple feature." }, { "author": "laksjdjf", @@ -2063,17 +2074,6 @@ "install_type": "git-clone", "description": "Nodes:CLIP Text Encode (Batch), String Input, Batch String" }, - { - "author": "laksjdjf", - "title": "cgem156-ComfyUI🍌", - "id": "cgem156", - "reference": "https://github.com/laksjdjf/cgem156-ComfyUI", - "files": [ - "https://github.com/laksjdjf/cgem156-ComfyUI" - ], - "install_type": "git-clone", - "description": "The custom nodes of laksjdjf have been integrated into the node pack of cgem156🍌." - }, { "author": "alsritter", "title": "asymmetric-tiling-comfyui", @@ -3210,6 +3210,17 @@ "install_type": "git-clone", "description": "[a/ImageReward](https://github.com/THUDM/ImageReward): Human preference learning in text-to-image generation. This is a [a/paper](https://arxiv.org/abs/2304.05977) from NeurIPS 2023" }, + { + "author": "shadowcz007", + "title": "comfyui-sound-lab", + "id": "soundlab", + "reference": "https://github.com/shadowcz007/comfyui-sound-lab", + "files": [ + "https://github.com/shadowcz007/comfyui-sound-lab" + ], + "install_type": "git-clone", + "description": "Nodes:Music Gen, Audio Play, Stable Audio" + }, { "author": "ostris", "title": "Ostris Nodes ComfyUI", @@ -4003,6 +4014,17 @@ "install_type": "git-clone", "description": "Animated optical illusions in ComfyUI" }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Qwen-2", + "id": "qwen-2", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2" + ], + "install_type": "git-clone", + "description": "Using Qwen-2 in ComfyUI" + }, { "author": "kenjiqq", "title": "qq-nodes-comfyui", @@ -6357,7 +6379,7 @@ "description": "ComfyS3 seamlessly integrates with [a/Amazon S3](https://aws.amazon.com/en/s3/) in ComfyUI. This open-source project provides custom nodes for effortless loading and saving of images, videos, and checkpoint models directly from S3 buckets within the ComfyUI graph interface." }, { - "author": "davask", + "author": "MaraScott", "title": "🐰 MaraScott Nodes", "id": "marascott-nodes", "reference": "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes", @@ -6365,7 +6387,7 @@ "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes" ], "install_type": "git-clone", - "description": "A set of nodes including a universal bus, an Inpainting By Mask and a large Upscaler/Refiner\n[w/ComfyUI-MarasIT-Nodes has been changed to ComfyUI_MaraScott_Nodes. If you have previously installed ComfyUI-MarasIT-Nodes, Please uninstall the previous one and reinstall this.,\n!!! Deprecated Node will be removed sometime in June 2024. Please update your workflows !!!]" + "description": "A set of nodes including a universal bus, an Inpainting By Mask and a large Upscaler/Refiner\n[AnyBus,McInpainty,McBoaty]" }, { "author": "yffyhk", @@ -6390,6 +6412,7 @@ { "author": "dfl", "title": "ComfyUI-TCD-scheduler", + "id": "dfl-tcd", "reference": "https://github.com/dfl/comfyui-tcd-scheduler", "files": [ "https://github.com/dfl/comfyui-tcd-scheduler" @@ -6952,6 +6975,28 @@ "install_type": "git-clone", "description": "ComfyUI native implementation of [a/IC-Light](https://github.com/lllyasviel/IC-Light)." }, + { + "author": "huchenlei", + "title": "ComfyUI DenseDiffusion", + "id": "densediffusion", + "reference": "https://github.com/huchenlei/ComfyUI_densediffusion", + "files": [ + "https://github.com/huchenlei/ComfyUI_densediffusion" + ], + "install_type": "git-clone", + "description": "[a/DenseDiffusion](https://github.com/naver-ai/DenseDiffusion) custom node for ComfyUI." + }, + { + "author": "huchenlei", + "title": "ComfyUI_omost", + "id": "omost", + "reference": "https://github.com/huchenlei/ComfyUI_omost", + "files": [ + "https://github.com/huchenlei/ComfyUI_omost" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/Omost](https://github.com/lllyasviel/Omost), and everything about regional prompt.\nNOTE: You need to install ComfyUI_densediffusion to use this node." + }, { "author": "nathannlu", "title": "ComfyUI Pets", @@ -6977,7 +7022,7 @@ { "author": "11dogzi", "title": "Comfyui-ergouzi-Nodes", - "id": "ergouzi", + "id": "ergouzi-nodes", "reference": "https://github.com/11dogzi/Comfyui-ergouzi-Nodes", "files": [ "https://github.com/11dogzi/Comfyui-ergouzi-Nodes" @@ -6985,6 +7030,17 @@ "install_type": "git-clone", "description": "This is a node group kit that covers multiple nodes such as local refinement, tag management, random prompt words, text processing, image processing, mask processing, etc" }, + { + "author": "11dogzi", + "title": "Comfyui-ergouzi-samplers", + "id": "ergouzi-samplers", + "reference": "https://github.com/11dogzi/Comfyui-ergouzi-samplers", + "files": [ + "https://github.com/11dogzi/Comfyui-ergouzi-samplers" + ], + "install_type": "git-clone", + "description": "Partial redraw sampler and variant seed sampler" + }, { "author": "BXYMartin", "title": "ComfyUI-InstantIDUtils", @@ -7116,14 +7172,14 @@ }, { "author": "ljleb", - "title": "comfy-mecha", + "title": "Mecha Merge Node Pack", "id": "mecha", "reference": "https://github.com/ljleb/comfy-mecha", "files": [ "https://github.com/ljleb/comfy-mecha" ], "install_type": "git-clone", - "description": "Nodes:Blocks Mecha Hyper, Mecha Merger, Model Mecha Recipe, Custom Code Mecha Recipe" + "description": "Model merging node pack with a focus on low memory footprint." }, { "author": "diSty", @@ -7245,6 +7301,17 @@ "install_type": "git-clone", "description": "This node is primarily based on Easy-OCR to implement OCR text recognition functionality." }, + { + "author": "prodogape", + "title": "ComfyUI-OmDet", + "id": "omdet", + "reference": "https://github.com/prodogape/ComfyUI-OmDet", + "files": [ + "https://github.com/prodogape/ComfyUI-OmDet" + ], + "install_type": "git-clone", + "description": "This node is mainly based on [a/OmDet](https://github.com/om-ai-lab/OmDet) for object detection, and it outputs related images, masks, and Labelme JSON information." + }, { "author": "Alysondao", "title": "Comfyui-Yolov8-JSON", @@ -7389,7 +7456,7 @@ }, { "author": "MarkoCa1", - "title": "ComfyUI_Text", + "title": "ComfyUI-Text", "reference": "https://github.com/MarkoCa1/ComfyUI-Text", "files": [ "https://github.com/MarkoCa1/ComfyUI-Text" @@ -7460,7 +7527,17 @@ "https://github.com/daxcay/ComfyUI-DRMN" ], "install_type": "git-clone", - "description": "Data Research And Manipulators Nodes for Model Trainers, Artists, Designers and Animators. Captions, Visualizer, Text Manipulator" + "description": "Data Research And Manipulators Nodes for Model Trainers, Artists, Designers and Animators. Captions, Visualizer, Text Manipulator\nNOTE: This repo is renamed to ComfyUI-DataSet." + }, + { + "author": "daxcay", + "title": "ComfyUI-NODEJS", + "reference": "https://github.com/daxcay/ComfyUI-NODEJS", + "files": [ + "https://github.com/daxcay/ComfyUI-NODEJS" + ], + "install_type": "git-clone", + "description": "This node allows the execution of Node.js application within ComfyUI by leveraging the ComfyUI-NODEJS, which starts alongside ComfyUI and facilitates the installation of Node.js. The integration enables Python subprocesses to execute Node.js scripts." }, { "author": "Seedsa", @@ -7879,16 +7956,6 @@ "install_type": "git-clone", "description": "Custom Node for comfyUI for virtual lighting based on normal map.\nYou can use normal maps to add virtual lighting effects to your images." }, - { - "author": "AppleBotzz", - "title": "ComfyUI_LLMVISION", - "reference": "https://github.com/AppleBotzz/ComfyUI_LLMVISION", - "files": [ - "https://github.com/AppleBotzz/ComfyUI_LLMVISION" - ], - "install_type": "git-clone", - "description": "This repository provides integration of GPT-4 and Claude 3 models into ComfyUI, allowing for both image and text-based interactions within the ComfyUI workflow." - }, { "author": "A4P7J1N7M05OT", "title": "ComfyUI-PixelOE", @@ -8075,7 +8142,7 @@ { "author": "AIFSH", "title": "ComfyUI-RVC", - "id": "rvc", + "id": "aifsh-rvc", "reference": "https://github.com/AIFSH/ComfyUI-RVC", "files": [ "https://github.com/AIFSH/ComfyUI-RVC" @@ -8119,7 +8186,7 @@ { "author": "AIFSH", "title": "ComfyUI_V-Express", - "id": "v-express", + "id": "v-express-aifsh", "reference": "https://github.com/AIFSH/ComfyUI_V-Express", "files": [ "https://github.com/AIFSH/ComfyUI_V-Express" @@ -8160,6 +8227,17 @@ "install_type": "git-clone", "description": "You can call Chatglm's API in comfyUI to translate and describe pictures, and the API similar to OpenAI." }, + { + "author": "smthemex", + "title": "ComfyUI_StableAudio_Open", + "id": "stable-audio-open-1.0", + "reference": "https://github.com/smthemex/ComfyUI_StableAudio_Open", + "files": [ + "https://github.com/smthemex/ComfyUI_StableAudio_Open" + ], + "install_type": "git-clone", + "description": "You can use stable-audio-open-1.0 in comfyUI" + }, { "author": "smthemex", "title": "ComfyUI_HiDiffusion_Pro", @@ -8248,6 +8326,17 @@ "install_type": "git-clone", "description": "This node allows you to use customnet." }, + { + "author": "smthemex", + "title": "ComfyUI_Pops", + "id": "pops", + "reference": "https://github.com/smthemex/ComfyUI_Pops", + "files": [ + "https://github.com/smthemex/ComfyUI_Pops" + ], + "install_type": "git-clone", + "description": "You can use [a/Popspaper](https://popspaper.github.io/pOps/) method in comfyUI" + }, { "author": "choey", "title": "Comfy-Topaz", @@ -8542,7 +8631,7 @@ { "author": "JettHu", "title": "ComfyUI-TCD", - "id": "tcd", + "id": "jetthu-tcd", "reference": "https://github.com/JettHu/ComfyUI-TCD", "files": [ "https://github.com/JettHu/ComfyUI-TCD" @@ -8724,17 +8813,6 @@ "install_type": "git-clone", "description": "Photoshop type functions and adjustment layers: 30 blend modes, Selective Color, Blend If, Color Balance, Solid Color Images, Black and White, Hue/Saturation, Levels, and RGB Splitting and Merging." }, - { - "author": "Shinsplat", - "title": "ComfyUI-Shinsplat", - "id": "shinsplat", - "reference": "https://github.com/Shinsplat/ComfyUI-Shinsplat", - "files": [ - "https://github.com/Shinsplat/ComfyUI-Shinsplat" - ], - "install_type": "git-clone", - "description": "Nodes: Clip Text Encode (Shinsplat), Clip Text Encode SDXL (Shinsplat), Lora Loader (Shinsplat)." - }, { "author": "da2el-ai", "title": "D2 Steps", @@ -8875,6 +8953,17 @@ "install_type": "git-clone", "description": "This custom node for ComfyUI allows you to create layers of an image based on input masks and save them into a PSD file." }, + { + "author": "alessandrozonta", + "title": "OpenPose Node", + "id": "openpose-alessandrozonta", + "reference": "https://github.com/alessandrozonta/ComfyUI-OpenPose", + "files": [ + "https://github.com/alessandrozonta/ComfyUI-OpenPose" + ], + "install_type": "git-clone", + "description": "This extension contains a custom node for ComfyUI. The node, called 'Bounding Box Crop', is designed to compute the top-left coordinates of a cropped bounding box based on input coordinates and dimensions of the final cropped image. It does so computing the center of the cropping area and then computing where the top-left coordinates would be." + }, { "author": "curiousjp", "title": "ComfyUI-MaskBatchPermutations", @@ -8905,7 +8994,7 @@ "https://github.com/runtime44/comfyui_r44_nodes" ], "install_type": "git-clone", - "description": "Nodes: Runtime44Upscaler, Runtime44ColorMatch, Runtime44DynamicKSampler, Runtime44ImageOverlay, Runtime44ImageResizer, Runtime44ImageToNoise, Runtime44MaskSampler, Runtime44TiledMaskSampler, Runtime44IterativeUpscaleFactor, Runtime44ImageEnhance" + "description": "Nodes: Runtime44Upscaler, Runtime44ColorMatch, Runtime44DynamicKSampler, Runtime44ImageOverlay, Runtime44ImageResizer, Runtime44ImageToNoise, Runtime44MaskSampler, Runtime44TiledMaskSampler, Runtime44IterativeUpscaleFactor, Runtime44ImageEnhance, Runtime44FilmGrain" }, { "author": "osiworx", @@ -9387,6 +9476,17 @@ "install_type": "git-clone", "description": "ComfyUI-AutoLabel is a custom node for ComfyUI that uses BLIP (Bootstrapping Language-Image Pre-training) to generate detailed descriptions of the main object in an image. This node leverages the power of BLIP to provide accurate and context-aware captions for images." }, + { + "author": "fexploit", + "title": "ComfyUI-Classifier", + "id": "classifier", + "reference": "https://github.com/fexploit/ComfyUI-Classifier", + "files": [ + "https://github.com/fexploit/ComfyUI-Classifier" + ], + "install_type": "git-clone", + "description": "ComfyUI-Classifier is a custom node for ComfyUI that uses a zero-shot classification model to classify text inputs based on a set of candidate labels. This node leverages the power of Hugging Face Transformers to provide accurate and flexible text classification." + }, { "author": "linshier", "title": "comfyui-remote-tools", @@ -9508,10 +9608,21 @@ "install_type": "git-clone", "description": "Nodes: AnyNode. Nodes that can be anything you ask. Auto-Generate functional nodes using LLMs. Create impossible workflows. API Compatibility: (OpenAI, LocalLLMs, Gemini)." }, + { + "author": "lks-ai", + "title": "ComfyUI Stable Audio Open 1.0 Sampler", + "id": "stableaudiosampler", + "reference": "https://github.com/lks-ai/ComfyUI-StableAudioSampler", + "files": [ + "https://github.com/lks-ai/ComfyUI-StableAudioSampler" + ], + "install_type": "git-clone", + "description": "Nodes: StableAudioSampler. Wraps the new Stable Audio Open Model in the sampler that dropped Jun 5th. See Github for Features" + }, { "author": "SayanoAI", "title": "Comfy-RVC", - "id": "rvc", + "id": "sayano-rvc", "reference": "https://github.com/SayanoAI/Comfy-RVC", "files": [ "https://github.com/SayanoAI/Comfy-RVC" @@ -9792,17 +9903,315 @@ "install_type": "git-clone", "description": "A set of useful nodes for convenient use of ComfyUI, including: Seed randomization before the generation process starts, with saving of the last used values and the ability to automatically interrupt the current generation; A function to pause the generation process; Slider nodes for convenient control of input parameters; An alternative version of the standard Reroute node." }, - - - - - - - - - - - + { + "author": "humgate", + "title": "simplecomfy", + "reference": "https://github.com/humgate/simplecomfy", + "files": [ + "https://github.com/humgate/simplecomfy" + ], + "install_type": "git-clone", + "description": "Simple JS application based on ComfyUI which takes prompt and style picture from user and runs hardcoded workflow inference returning generated image to user." + }, + { + "author": "vanche1212", + "title": "ZMG PLUGIN", + "id": "zmg", + "reference": "https://github.com/vanche1212/ComfyUI-ZMG-Nodes", + "files": [ + "https://github.com/vanche1212/ComfyUI-ZMG-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:ApiRequestNode, LoadVideoNode, JsonParserNode, OllamaRequestNode, OldPhotoColorizationNode." + }, + { + "author": "hben35096", + "title": "ComfyUI-ToolBox", + "id": "hben-toolbox", + "reference": "https://github.com/hben35096/ComfyUI-ToolBox", + "files": [ + "https://github.com/hben35096/ComfyUI-ToolBox" + ], + "install_type": "git-clone", + "description": "Nodes:commonly_node." + }, + { + "author": "tiankuan93", + "title": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation", + "id": "v-express", + "reference": "https://github.com/tiankuan93/ComfyUI-V-Express", + "files": [ + "https://github.com/tiankuan93/ComfyUI-V-Express" + ], + "install_type": "git-clone", + "description": "[Original] In the field of portrait video generation, the use of single images to generate portrait videos has become increasingly prevalent. A common approach involves leveraging generative models to enhance adapters for controlled generation. However, control signals can vary in strength, including text, audio, image reference, pose, depth map, etc. Among these, weaker conditions often struggle to be effective due to interference from stronger conditions, posing a challenge in balancing these conditions. In our work on portrait video generation, we identified audio signals as particularly weak, often overshadowed by stronger signals such as pose and original image. However, direct training with weak signals often leads to difficulties in convergence. To address this, we propose V-Express, a simple method that balances different control signals through a series of progressive drop operations. Our method gradually enables effective control by weak conditions, thereby achieving generation capabilities that simultaneously take into account pose, input image, and audio.\nNOTE: You need to downdload [a/model_ckpts](https://huggingface.co/tk93/V-Express/tree/main) manually." + }, + { + "author": "CMonk", + "title": "Stable Projectorz Bridge", + "id": "projectorz", + "reference": "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge", + "files": [ + "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge" + ], + "install_type": "git-clone", + "description": "This custom nodes enables Stable Projectorz to work with ComfyUI Directly." + }, + { + "author": "Scorpinaus", + "title": "Loaders for Diffusers-format checkpoints", + "id": "diffusersloader", + "reference": "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader", + "files": [ + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader" + ], + "install_type": "git-clone", + "description": "This node pack allows loading of CLIP, MODEL, VAE aspects for both SD1.5 and SDXL checkpoints that is converted to diffusers format." + }, + { + "author": "chakib-belgaid", + "title": "ComfyUI Style Plugin", + "id": "style-plugin", + "reference": "https://github.com/chakib-belgaid/Comfyui_Prompt_styler", + "files": [ + "https://github.com/chakib-belgaid/Comfyui_Prompt_styler" + ], + "install_type": "git-clone", + "description": "This is a simple plugin for ComfyUI that allows you to import A1111 CSV styles into ComfyUI prompts." + }, + { + "author": "chakib-belgaid", + "title": "ComfyUI-autosize", + "id": "autosize", + "reference": "https://github.com/chakib-belgaid/ComfyUI-autosize", + "files": [ + "https://github.com/chakib-belgaid/ComfyUI-autosize" + ], + "install_type": "git-clone", + "description": "A ComfyUI utility plugin designed to optimize the latent space for generating high-quality results. It approximates the closest size model for better generation results." + }, + { + "author": "ThereforeGames", + "title": "ComfyUI-Unprompted", + "id": "unprompted", + "reference": "https://github.com/ThereforeGames/ComfyUI-Unprompted", + "files": [ + "https://github.com/ThereforeGames/ComfyUI-Unprompted" + ], + "install_type": "git-clone", + "description": "This is a ComfyUI node that processes your input text with the [a/Unprompted templating language](https://github.com/ThereforeGames/unprompted). Early alpha release.\n" + }, + { + "author": "Tool Of North america", + "title": "Easy automatic (square) image cropper using Yolo", + "id": "tooldigital", + "reference": "https://github.com/tooldigital/ComfyUI-Yolo-Cropper", + "files": [ + "https://github.com/tooldigital/ComfyUI-Yolo-Cropper" + ], + "install_type": "git-clone", + "description": "A very simple and easy to use node to automaticaaly create (square) image crops and masks using YoloV8. This can be very useful when using controlnet and ip adapters" + }, + { + "author": "luandev", + "title": "ComfyUI CrewAI", + "id": "crewai", + "reference": "https://github.com/luandev/ComfyUI-CrewAI", + "files": [ + "https://github.com/luandev/ComfyUI-CrewAI" + ], + "install_type": "git-clone", + "description": "ComfyUI-CrewAI aims to integrate Crew AI's multi-agent collaboration framework into the ComfyUI environment. By combining the strengths of Crew AI's role-based, collaborative AI agent system with ComfyUI's intuitive interface, we will create a robust platform for managing and executing complex AI tasks seamlessly" + }, + { + "author": "chandlergis", + "title": "ComfyUI_EmojiOverlay", + "id": "emoji-overlay", + "reference": "https://github.com/chandlergis/ComfyUI_EmojiOverlay", + "files": [ + "https://github.com/chandlergis/ComfyUI_EmojiOverlay" + ], + "install_type": "git-clone", + "description": "Nodes:Image Emoji Overlay" + }, + { + "author": "JayLyu", + "title": "ComfyUI_BaiKong_Node", + "id": "baikong", + "reference": "https://github.com/JayLyu/ComfyUI_BaiKong_Node", + "files": [ + "https://github.com/JayLyu/ComfyUI_BaiKong_Node" + ], + "install_type": "git-clone", + "description": "Nodes:BK Img To Color, BK Color Selector" + }, + { + "author": "risunobushi", + "title": "comfyUI_FrequencySeparation_RGB-HSV", + "id": "freq-sep", + "reference": "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV", + "files": [ + "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV" + ], + "install_type": "git-clone", + "description": "A collection of simple nodes for Frequency Separation / Frequency Recombine with RGB and HSV methods" + }, + { + "author": "zohac", + "title": "ComfyUI_ZC_DrawShape", + "id": "drawshape", + "reference": "https://github.com/zohac/ComfyUI_ZC_DrawShape", + "files": [ + "https://github.com/zohac/ComfyUI_ZC_DrawShape" + ], + "install_type": "git-clone", + "description": "Nodes:ZC DrawShape Node" + }, + { + "author": "DataCTE", + "title": "Prompt Injection Node for ComfyUI", + "id": "prompt-injection", + "reference": "https://github.com/DataCTE/prompt_injection", + "files": [ + "https://github.com/DataCTE/prompt_injection" + ], + "install_type": "git-clone", + "description": "This custom node for ComfyUI allows you to inject specific prompts at specific blocks of the Stable Diffusion UNet, providing fine-grained control over the generated image. It is based on the concept that the content/subject understanding of the model is primarily contained within the MID0 and MID1 blocks, as demonstrated in the B-Lora (Content Style implicit separation) paper. Features.\nInject different prompts into specific UNet blocks Three different node variations for flexible workflow integration Customize the learning rate of specific blocks to focus on content, lighting, style, or other aspects Potential for developing a 'Mix of Experts' approach by swapping blocks on-the-fly based on prompt content" + }, + { + "author": "FrankChieng", + "title": "ComfyUI_llm_easyanimiate", + "id": "llm-easyanimate", + "nodename_pattern": "^FrankChiengEasyAnimate", + "reference": "https://github.com/frankchieng/ComfyUI_llm_easyanimiate", + "files": [ + "https://github.com/frankchieng/ComfyUI_llm_easyanimiate" + ], + "install_type": "git-clone", + "description": "implementation easyanimate with llama3-8b-6bit instruction LLM generation prompt help" + }, + { + "author": "nuanarchy", + "title": "ComfyUI-NuA-FlashFace", + "id": "nua-flashface", + "reference": "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace", + "files": [ + "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/FlashFace: Human Image Personalization with High-fidelity Identity Preservation](https://github.com/ali-vilab/FlashFace)\nNOTE: You need to downalod models manually." + }, + { + "author": "denfrost", + "title": "Den_ComfyUI_Workflows", + "id": "den", + "reference": "https://github.com/denfrost/Den_ComfyUI_Workflow", + "files": [ + "https://github.com/denfrost/Den_ComfyUI_Workflow" + ], + "install_type": "git-clone", + "description": "Custom nodes make easy Advanced Workflows. Focus on Image/Video and ControlNet efficiency and performances. Manipulation of Latent Space, Automatic pipeline with a bit efforts." + }, + { + "author": "marduk191", + "title": "marduk191 workflow settings", + "id": "marnodes", + "reference": "https://github.com/marduk191/comfyui-marnodes", + "files": [ + "https://github.com/marduk191/comfyui-marnodes" + ], + "install_type": "git-clone", + "description": "A node to set workflow settings." + }, + { + "author": "haohaocreates", + "title": "ComfyUI-HH-Image-Selector", + "id": "hh-image-selector", + "reference": "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector", + "files": [ + "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector" + ], + "install_type": "git-clone", + "description": "comfuio custom node that returns an image from a batch based on selected criteria such as RGB value, brightness, etc (credits to chris goringe's custom nodes tutorial )." + }, + { + "author": "exdysa", + "title": "comfyui-selector", + "reference": "https://github.com/exdysa/comfyui-selector", + "files": [ + "https://github.com/exdysa/comfyui-selector" + ], + "install_type": "git-clone", + "description": "Nodes:Selector. Quick and dirty parameter generator node for ComfyUI." + }, + { + "author": "Jin Liu", + "title": "ComfyUI-LJNodes", + "id": "ComfyUI-LJNodes", + "reference": "https://github.com/coolzilj/ComfyUI-LJNodes", + "files": [ + "https://github.com/coolzilj/ComfyUI-LJNodes" + ], + "install_type": "git-clone", + "description": "A variety of custom nodes to enhance ComfyUI for a buttery smooth experience." + }, + { + "author": "GavChap", + "title": "ComfyUI-SD3LatentSelectRes", + "id": "sd3latent-select-res", + "reference": "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes", + "files": [ + "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes" + ], + "install_type": "git-clone", + "description": "You'll get a new node called SD3 Latent Select Resolution, you can pick the x and y sizes from a list." + }, + { + "author": "BenNarum", + "title": "SigmaWaveFormNodes", + "id": "sigmawaveform", + "reference": "https://github.com/BenNarum/SigmaWaveFormNode", + "files": [ + "https://github.com/BenNarum/SigmaWaveFormNode" + ], + "install_type": "git-clone", + "description": "A set of tools for generating and altering sigmas in ComfyUI." + }, + { + "author": "shobhitic", + "title": "PlusMinusTextClip - Single node for Positive and Negative Prompts", + "id": "plusminustextclip", + "reference": "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip", + "files": [ + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip" + ], + "install_type": "git-clone", + "description": "This adds a node that has both the positive and negative prompts as input in one node. You can just add one node and be done with both Positive and Negative prompts, in place of adding two different nodes for them." + }, + { + "author": "Late Night Labs", + "title": "LNL Frame Selector", + "id": "lnlframeselector", + "reference": "https://github.com/latenightlabs/ComfyUI-LNL", + "files": [ + "https://github.com/latenightlabs/ComfyUI-LNL" + ], + "install_type": "git-clone", + "description": "Frame Selector & Sequence Selection Node for ComfyUI." + }, + { + "author": "Michael Standen", + "title": "Ollama Prompt Encode", + "id": "ollamapromptencode", + "reference": "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode", + "files": [ + "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode" + ], + "install_type": "git-clone", + "description": "A prompt generator and CLIP encoder using AI provided by Ollama." + }, + + { @@ -10107,16 +10516,6 @@ "install_type": "copy", "description": "Extension to show random cat GIFs while queueing prompt." }, - { - "author": "archifancy", - "title": "Image-vector-for-ComfyUI", - "reference": "https://github.com/archifancy/Image-vector-for-ComfyUI", - "files": [ - "https://github.com/archifancy/Image-vector-for-ComfyUI/raw/main/AIvector.py" - ], - "install_type": "copy", - "description": "Nodes:AIvector. A wrapped comfyui node for converting pixels to vectors using Vtracer. Check it out here: [a/https://github.com/visioncortex/vtracer](https://github.com/visioncortex/vtracer)." - }, { "author": "barckley75", "title": "comfyUI_DaVinciResolve", @@ -10131,14 +10530,35 @@ "description": "Nodes:TextToSpeech, phy_3_conditioning, SaveAudioToDaVinci, SaveImageToDaVinci.\nNOTE:In order to use DaVinci node you must have DaVinci Resolve Studio connected to the API. For more information check the help seciton in DaVinci Resolve Studio HELP>DOCUMENTATION>DEVELOPER. It will open a folder, search for scripting and the for README.txt file, the API documentation." }, { - "author": "exdysa", - "title": "comfyui-selector", - "reference": "https://github.com/exdysa/comfyui-selector", + "author": "DannyStone1999", + "title": "ComfyUI-Depth2Mask", + "reference": "https://github.com/DannyStone1999/ComfyUI-Depth2Mask", "files": [ - "https://github.com/exdysa/comfyui-selector/raw/main/selector.py" + "https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py" ], "install_type": "copy", - "description": "Nodes:Selector. Quick and dirty parameter generator node for ComfyUI." + "description": "Nodes:Depth2Mask" + }, + { + "author": "Limbicnation", + "title": "ComfyUIDepthEstimation", + "reference": "https://github.com/Limbicnation/ComfyUIDepthEstimation", + "files": [ + "https://github.com/Limbicnation/ComfyUIDepthEstimation/raw/main/depth_estimation_node.py" + ], + "pip": ["transformers"], + "install_type": "copy", + "description": "A custom depth estimation node for ComfyUI using transformer models. It integrates depth estimation with automatic gamma correction, contrast adjustment, and edge detection, based on the [a/TransformDepth](https://github.com/Limbicnation/TransformDepth) repository." + }, + { + "author": "seghier", + "title": "ComfyUI_LibreTranslate", + "reference": "https://github.com/seghier/ComfyUI_LibreTranslate", + "files": [ + "https://github.com/seghier/ComfyUI_LibreTranslate/raw/main/translate_node.py" + ], + "install_type": "copy", + "description": "Use LibreTranslation in ComfyUI [a/https://github.com/LibreTranslate/LibreTranslate](https://github.com/LibreTranslate/LibreTranslate)" }, diff --git a/extension-node-map.json b/extension-node-map.json index 731fef68..be26b9fb 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -91,6 +91,16 @@ "title_aux": "Comfyui-ergouzi-Nodes" } ], + "https://github.com/11dogzi/Comfyui-ergouzi-samplers": [ + [ + "EGBYZZCYQ", + "EGCYQJB", + "EGCYQJBCJ" + ], + { + "title_aux": "Comfyui-ergouzi-samplers" + } + ], "https://github.com/1mckw/Comfyui-Gelbooru": [ [ "Gelbooru (ID)", @@ -127,9 +137,12 @@ "SAMIN String Attribute Selector", "SANMIN Adapt Coordinates", "SANMIN AdjustTransparency", + "SANMIN BlurMaskArea", "SANMIN ChineseToCharacter", "SANMIN ClothingWildcards", "SANMIN ConvertToEnglish", + "SANMIN EditWildcards", + "SANMIN Float", "SANMIN LoadPathImagesPreview", "SANMIN SCALE AND FILL BLACK", "SANMIN SanmiSaveImageToLocal", @@ -399,6 +412,7 @@ [ "> Clear Text", "> Float to Int", + "> Get Mean Color", "> Int", "> Int to Text", "> Light Source Mask", @@ -407,6 +421,8 @@ "> Mask Curves", "> NIKSampler", "> Noise From Image", + "> Normal Map Lighting", + "> RGB Color", "> Resolution by Aspect Ratio", "> Rotate Image", "> Save Image", @@ -498,10 +514,19 @@ "https://github.com/Acly/comfyui-tooling-nodes": [ [ "ETN_ApplyMaskToImage", + "ETN_AttentionMask", + "ETN_BackgroundRegion", "ETN_CropImage", + "ETN_DefineRegion", + "ETN_ExtractImageTile", + "ETN_ExtractMaskTile", + "ETN_GenerateTileMask", + "ETN_ListRegionMasks", "ETN_LoadImageBase64", "ETN_LoadMaskBase64", - "ETN_SendImageWebSocket" + "ETN_MergeImageTile", + "ETN_SendImageWebSocket", + "ETN_TileLayout" ], { "title_aux": "ComfyUI Nodes for External Tooling" @@ -576,17 +601,6 @@ "title_aux": "ComfyUI-SimpleCounter" } ], - "https://github.com/AppleBotzz/ComfyUI_LLMVISION": [ - [ - "CLAUDE_CHAT", - "CLAUDE_VISION", - "GPT4_CHAT", - "GPT4_VISION" - ], - { - "title_aux": "ComfyUI_LLMVISION" - } - ], "https://github.com/ArcherFMY/Diffusion360_ComfyUI": [ [ "Diffusion360LoaderImage2Pano", @@ -769,6 +783,19 @@ "title_aux": "bsz-cui-extras" } ], + "https://github.com/BenNarum/SigmaWaveFormNode": [ + [ + "AttenuatorNode", + "FourierFilterNode", + "PhaseLockedLoopNode", + "SigmaWaveFormNode", + "SigmaWaveFormNodeAdvanced", + "SigmaWaveFormNodeSimple" + ], + { + "title_aux": "SigmaWaveFormNodes" + } + ], "https://github.com/BennyKok/comfyui-deploy": [ [ "ComfyDeployWebscoketImageInput", @@ -1111,6 +1138,14 @@ "title_aux": "Comfy Couple" } ], + "https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py": [ + [ + "Depth2Mask" + ], + { + "title_aux": "ComfyUI-Depth2Mask" + } + ], "https://github.com/DarKDinDoN/comfyui-checkpoint-automatic-config": [ [ "CheckpointAutomaticConfig", @@ -1120,6 +1155,16 @@ "title_aux": "ComfyUI Checkpoint Automatic Config" } ], + "https://github.com/DataCTE/prompt_injection": [ + [ + "AdvancedPromptInjection", + "PromptInjection", + "SimplePromptInjection" + ], + { + "title_aux": "Prompt Injection Node for ComfyUI" + } + ], "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes": [ [], { @@ -1253,12 +1298,7 @@ "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings": [ [ "CLIP Temperature", - "Dynamic scale as float", - "Unet Temperature SD1", - "Unet Temperature SD1 per layer", - "Unet Temperature SDXL", - "Unet Temperature SDXL per layer", - "Unet Temperature any model" + "Unet Temperature" ], { "title_aux": "Stable-Diffusion-temperature-settings" @@ -1287,6 +1327,7 @@ "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler": [ [ "Aligned Scheduler", + "Gaussian Tail Scheduler", "Get sigmas as float", "Graph sigmas", "Manual scheduler", @@ -1753,6 +1794,14 @@ "title_aux": "ComfyUI-GTSuya-Nodes" } ], + "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes": [ + [ + "SD3LatentSelectRes" + ], + { + "title_aux": "ComfyUI-SD3LatentSelectRes" + } + ], "https://github.com/GentlemanHu/ComfyUI-SunoAI": [ [ "GentlemanHu_SunoAI", @@ -1790,6 +1839,8 @@ ], "https://github.com/GraftingRayman/ComfyUI_GraftingRayman": [ [ + "GR Flip Tile Random Inverted", + "GR Flip Tile Random Red Ring", "GR Image Details Displayer", "GR Image Details Saver", "GR Image Resize", @@ -1919,13 +1970,16 @@ "IG Cross Fade Images", "IG Explorer", "IG Float", + "IG Float List", "IG Folder", "IG Int", + "IG Interpolate", "IG Load Image", "IG Load Images", "IG Multiply", "IG Path Join", "IG String", + "IG String List", "IG ZFill" ], { @@ -2108,6 +2162,7 @@ "JNodes_BooleanSelectorWithString", "JNodes_BreakMediaInfo", "JNodes_CheckpointSelectorWithString", + "JNodes_CreateStereoscopicImageFromDepth", "JNodes_GetOutputDirectory", "JNodes_GetParameterFromList", "JNodes_GetParameterGlobal", @@ -2149,6 +2204,15 @@ "title_aux": "ComfyUI-JNodes" } ], + "https://github.com/JayLyu/ComfyUI_BaiKong_Node": [ + [ + "BK_ColorSelector", + "BK_Img2Color" + ], + { + "title_aux": "ComfyUI_BaiKong_Node" + } + ], "https://github.com/JcandZero/ComfyUI_GLM4Node": [ [ "GLM3_turbo_CHAT", @@ -2692,6 +2756,7 @@ "MaraScottPasteInpaintingByMask_v1", "MaraScottSetInpaintingByMask_v1", "MaraScottUpscalerRefinerNode_v2", + "MaraScottUpscalerRefinerNode_v3", "MaraScott_Kijai_TokenCounter_v1" ], { @@ -2729,7 +2794,7 @@ "ShowText" ], { - "title_aux": "ComfyUI_Text" + "title_aux": "ComfyUI-Text" } ], "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": [ @@ -2793,6 +2858,7 @@ "HueShift", "ImageDimensions", "ImageResizeLong", + "ImageZigzag", "IndoorBackgrounds", "IndoorDir", "IntEvaluate", @@ -2822,6 +2888,7 @@ "SearchReplace", "SimplePrompts", "SpecificStylesDir", + "SplitImages", "StringJoin", "TimeStamp", "TricolorComposition", @@ -3349,6 +3416,7 @@ [ "AudioBatchValueNode", "AudioTranscriptionNode", + "DownloadAudio", "ImageRepeatInterleavedNode", "LatentRepeatInterleavedNode", "LoadAudio", @@ -3377,6 +3445,37 @@ "title_aux": "SComfyUI-Keyframe" } ], + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": [ + [ + "CombinedDiffusersLoader", + "CombinedDiffusersSD15Loader", + "CombinedDiffusersSDXLLoader", + "DiffusersClipLoader", + "DiffusersUNETLoader", + "DiffusersVAELoader", + "SD15CLIPLoader", + "SD15UNETLoader", + "SD15VAELoader", + "SDXLCLIPLoader", + "SDXLUNETLoader", + "SDXLVAELoader" + ], + { + "title_aux": "Loaders for Diffusers-format checkpoints" + } + ], + "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode": [ + [ + "OllamaCLIPTextEncode" + ], + { + "author": "Michael Standen", + "description": "Use AI to generate prompts and perform CLIP text encoding", + "nickname": "Ollama Prompt Encode", + "title": "Ollama Prompt Encode", + "title_aux": "Ollama Prompt Encode" + } + ], "https://github.com/SeaArtLab/ComfyUI-Long-CLIP": [ [ "SeaArtLongClip", @@ -3659,17 +3758,6 @@ "title_aux": "Eagleshadow Custom Nodes" } ], - "https://github.com/Shinsplat/ComfyUI-Shinsplat": [ - [ - "Clip Text Encode (Shinsplat)", - "Clip Text Encode SDXL (Shinsplat)", - "Lora Loader (Shinsplat)", - "Sum Wrap (Shinsplat)" - ], - { - "title_aux": "ComfyUI-Shinsplat" - } - ], "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": [ [ "SVDRsizer" @@ -3794,6 +3882,7 @@ "Stability Creative Upscale", "Stability Erase", "Stability Image Core", + "Stability Image Ultra", "Stability Inpainting", "Stability Outpainting", "Stability Remove Background", @@ -4193,11 +4282,13 @@ "tri3d-adjust-neck", "tri3d-atr-parse", "tri3d-atr-parse-batch", + "tri3d-clear-memory", "tri3d-clipdrop-bgremove-api", "tri3d-clipdrop-bgreplace-api", "tri3d-composite-image-splitter", "tri3d-dwpose", "tri3d-extract-hand", + "tri3d-extract-masks-batch", "tri3d-extract-parts-batch", "tri3d-extract-parts-batch2", "tri3d-extract-parts-mask-batch", @@ -4380,6 +4471,14 @@ "title_aux": "Anyline" } ], + "https://github.com/ThereforeGames/ComfyUI-Unprompted": [ + [ + "Unprompted" + ], + { + "title_aux": "ComfyUI-Unprompted" + } + ], "https://github.com/TinyTerra/ComfyUI_tinyterraNodes": [ [ "ttN KSampler_v2", @@ -5075,6 +5174,16 @@ "title_aux": "ComfyUI-Q-Align" } ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2": [ + [ + "Qwen2_Chat_Zho", + "Qwen2_ModelLoader_Zho", + "Qwen2_Zho" + ], + { + "title_aux": "ComfyUI-Qwen-2" + } + ], "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": [ [ "QWenVL_API_S_Multi_Zho", @@ -5307,13 +5416,17 @@ ], "https://github.com/ai-liam/comfyui-liam": [ [ + "AiStoreAzureGPTLiam", "GetBetterDepthImage", "LiamLibFillImage", "LiamLibImageToGray", "LiamLibLoadImage", "LiamLibSaveImg", "LiamLibSaveText", - "PreviewReliefImage" + "OllamaApiTNodeLiam", + "PreviewReliefImage", + "SpeechRecognitionLiam", + "SpeechSynthesisLiam" ], { "title_aux": "LiamUtil" @@ -5359,6 +5472,15 @@ "title_aux": "Save Layers Node for ComfyUI" } ], + "https://github.com/alessandrozonta/ComfyUI-OpenPose": [ + [ + "OpenPose - Get poses" + ], + { + "author": "joe", + "title_aux": "OpenPose Node" + } + ], "https://github.com/alexopus/ComfyUI-Image-Saver": [ [ "Cfg Literal (Image Saver)", @@ -5617,7 +5739,7 @@ ], "https://github.com/audioscavenger/ComfyUI-Thumbnails": [ [ - "ComfyUIThumbnails" + "LoadImageThumbnails" ], { "author": "AudioscavengeR", @@ -5667,7 +5789,10 @@ "Bedrock - Claude", "Bedrock - Claude Multimodal", "Bedrock - SDXL", - "Bedrock - Titan Image", + "Bedrock - Titan Inpainting", + "Bedrock - Titan Outpainting", + "Bedrock - Titan Text to Image", + "Bedrock - Titan Variation", "Image From S3", "Image From URL", "Image To S3", @@ -5761,6 +5886,8 @@ "Mikey Sampler Base Only Advanced", "Mikey Sampler Tiled", "Mikey Sampler Tiled Base Only", + "MikeyLatentTileSampler", + "MikeyLatentTileSamplerCustom", "MikeySamplerTiledAdvanced", "MikeySamplerTiledAdvancedBaseOnly", "MosaicExpandImage", @@ -5790,6 +5917,7 @@ "TextCombinations", "TextCombinations3", "TextConcat", + "TextPadderMikey", "TextPreserve", "Upscale Tile Calculator", "Wildcard Processor", @@ -6083,6 +6211,7 @@ ], "https://github.com/bobmagicii/comfykit-custom-nodes": [ [ + "LoraThree", "LoraWithMeta", "TypecasterImage", "TypecasterLatent" @@ -6269,6 +6398,23 @@ "title_aux": "ComfyUI LLaVA Captioner" } ], + "https://github.com/chakib-belgaid/ComfyUI-autosize": [ + [ + "CustomAutoSize", + "SDXLAutoSize" + ], + { + "title_aux": "ComfyUI-autosize" + } + ], + "https://github.com/chakib-belgaid/Comfyui_Prompt_styler": [ + [ + "Prompt_Styler" + ], + { + "title_aux": "ComfyUI Style Plugin" + } + ], "https://github.com/chandlergis/ComfyUI-IMG_Query": [ [ "ImageRequestNode" @@ -6277,6 +6423,14 @@ "title_aux": "ComfyUI-IMG_Query" } ], + "https://github.com/chandlergis/ComfyUI_EmojiOverlay": [ + [ + "Image Emoji Overlay" + ], + { + "title_aux": "ComfyUI_EmojiOverlay" + } + ], "https://github.com/chaojie/ComfyUI-AniPortrait": [ [ "AniPortraitLoader", @@ -6750,9 +6904,11 @@ "LayerColor: Levels", "LayerColor: RGB", "LayerColor: YUV", + "LayerFilter: AddGrain", "LayerFilter: ChannelShake", "LayerFilter: ColorMap", "LayerFilter: Film", + "LayerFilter: FilmV2", "LayerFilter: GaussianBlur", "LayerFilter: HDREffects", "LayerFilter: LightLeak", @@ -6764,6 +6920,7 @@ "LayerMask: BiRefNetUltra", "LayerMask: BlendIf Mask", "LayerMask: CreateGradientMask", + "LayerMask: ImageToMask", "LayerMask: MaskBoxDetect", "LayerMask: MaskByColor", "LayerMask: MaskByDifferent", @@ -6771,11 +6928,13 @@ "LayerMask: MaskEdgeUltraDetail", "LayerMask: MaskEdgeUltraDetail V2", "LayerMask: MaskGradient", + "LayerMask: MaskGrain", "LayerMask: MaskGrow", "LayerMask: MaskInvert", "LayerMask: MaskMotionBlur", "LayerMask: MaskPreview", "LayerMask: MaskStroke", + "LayerMask: MediapipeFacialSegment", "LayerMask: PersonMaskUltra", "LayerMask: PersonMaskUltra V2", "LayerMask: PixelSpread", @@ -6801,6 +6960,7 @@ "LayerStyle: Stroke", "LayerStyle: Stroke V2", "LayerUtility: AddBlindWaterMark", + "LayerUtility: BatchSelector", "LayerUtility: Boolean", "LayerUtility: BooleanOperator", "LayerUtility: ColorImage", @@ -6819,6 +6979,7 @@ "LayerUtility: GetImageSize", "LayerUtility: GradientImage", "LayerUtility: GradientImage V2", + "LayerUtility: HLFrequencyDetailRestore", "LayerUtility: ImageAutoCrop", "LayerUtility: ImageAutoCrop V2", "LayerUtility: ImageBlend", @@ -6851,6 +7012,7 @@ "LayerUtility: QWenImage2Prompt", "LayerUtility: RGB Value", "LayerUtility: RestoreCropBox", + "LayerUtility: SD3NegativeConditioning", "LayerUtility: SaveImagePlus", "LayerUtility: Seed", "LayerUtility: ShowBlindWaterMark", @@ -7149,6 +7311,7 @@ "CLIPSetLastLayer", "CLIPTextEncode", "CLIPTextEncodeControlnet", + "CLIPTextEncodeSD3", "CLIPTextEncodeSDXL", "CLIPTextEncodeSDXLRefiner", "CLIPVisionEncode", @@ -7178,6 +7341,7 @@ "DualCLIPLoader", "EmptyImage", "EmptyLatentImage", + "EmptySD3LatentImage", "ExponentialScheduler", "FeatherMask", "FlipSigmas", @@ -7245,6 +7409,7 @@ "ModelMergeSubtract", "ModelSamplingContinuousEDM", "ModelSamplingDiscrete", + "ModelSamplingSD3", "ModelSamplingStableCascade", "Morphology", "PatchModelAddDownscale", @@ -7296,6 +7461,7 @@ "StyleModelLoader", "ThresholdMask", "TomePatchModel", + "TripleCLIPLoader", "UNETLoader", "UNetCrossAttentionMultiply", "UNetSelfAttentionMultiply", @@ -7319,6 +7485,16 @@ "title_aux": "ComfyUI" } ], + "https://github.com/comfyanonymous/ComfyUI_TensorRT": [ + [ + "DYNAMIC_TRT_MODEL_CONVERSION", + "STATIC_TRT_MODEL_CONVERSION", + "TensorRTLoader" + ], + { + "title_aux": "TensorRT Node for ComfyUI" + } + ], "https://github.com/comfyanonymous/ComfyUI_experiments": [ [ "ModelMergeBlockNumber", @@ -7437,6 +7613,7 @@ "IPAdapterCombineParams", "IPAdapterCombineWeights", "IPAdapterEmbeds", + "IPAdapterEmbedsBatch", "IPAdapterEncoder", "IPAdapterFaceID", "IPAdapterFromParams", @@ -7500,6 +7677,7 @@ "ImageApplyLUT+", "ImageBatchMultiple+", "ImageCASharpening+", + "ImageColorMatch+", "ImageCompositeFromMaskBatch+", "ImageCrop+", "ImageDesaturate+", @@ -7507,6 +7685,7 @@ "ImageExpandBatch+", "ImageFlip+", "ImageFromBatch+", + "ImageHistogramMatch+", "ImageListToBatch+", "ImagePosterize+", "ImageRandomTransform+", @@ -7613,8 +7792,6 @@ ], "https://github.com/dagthomas/comfyui_dagthomas": [ [ - "CSL", - "CSVPromptGenerator", "PromptGenerator" ], { @@ -7723,14 +7900,18 @@ "JDCN_BatchLatentLoadFromDir", "JDCN_BatchLatentLoadFromList", "JDCN_BatchSaveLatent", + "JDCN_BoolInt", + "JDCN_EnableDisable", "JDCN_FileMover", "JDCN_ImageSaver", "JDCN_ListToString", "JDCN_ReBatch", "JDCN_SeamlessExperience", + "JDCN_ShowAny", "JDCN_SplitString", "JDCN_StringManipulator", "JDCN_StringToList", + "JDCN_SwapInputs", "JDCN_TXTFileSaver", "JDCN_VHSFileMover" ], @@ -7765,6 +7946,40 @@ "title_aux": "comfyui_facetools" } ], + "https://github.com/denfrost/Den_ComfyUI_Workflow": [ + [ + "Den_BatchIndex_AS", + "Den_CropImage_AS", + "Den_Eval_AS", + "Den_FaceRestoreCFWithModel", + "Den_GPTLoaderSimple_llama", + "Den_GPTSampler_llama", + "Den_ImageMixMasked_As", + "Den_ImageToLatentSpace", + "Den_ImageToMask_AS", + "Den_Int2Any_AS", + "Den_LatentAdd_AS", + "Den_LatentMixMasked_As", + "Den_LatentMix_AS", + "Den_LatentToImages_AS", + "Den_LoadLatent_AS", + "Den_MapRange_AS", + "Den_MaskToImage_AS", + "Den_Math_AS", + "Den_NoiseImage_AS", + "Den_Number2Float_AS", + "Den_Number2Int_AS", + "Den_Number_AS", + "Den_SVD_img2vid", + "Den_SaveLatent_AS", + "Den_TextToImage_AS", + "Den_TextWildcardList_AS", + "Increment_AS" + ], + { + "title_aux": "Den_ComfyUI_Workflows" + } + ], "https://github.com/deroberon/StableZero123-comfyui": [ [ "SDZero ImageSplit", @@ -8056,20 +8271,23 @@ "Eden_String", "FolderScanner", "GetRandomFile", + "Get_Prefixed_Imgs", "HistogramMatching", "IMG_blender", "IMG_padder", "IMG_resolution_multiple_of", "IMG_scaler", "IMG_unpadder", - "IPAdapterRandomRotateEmbeds", "If ANY execute A else B", "ImageDescriptionNode", "LatentTypeConversion", + "Linear_Combine_IP_Embeds", + "LoadImagesByFilename", "LoadRandomImage", + "Load_Embeddings_From_Folder", "MaskFromRGB", "MaskFromRGB_KMeans", - "SaveExplorationState", + "Random_Style_Mixture", "SaveImageAdvanced", "SavePosEmbeds", "VAEDecode_to_folder", @@ -8137,15 +8355,16 @@ "title_aux": "ComfyMath" } ], - "https://github.com/exdysa/comfyui-selector/raw/main/selector.py": [ + "https://github.com/exdysa/comfyui-selector": [ [ + "Recourse", "Selector" ], { - "author": "\u02f6\ud835\udfa2\u292c\u2ad2\u2d56s\u143c\u02f6", - "description": "Preset aspect ratios and inference parameters.", - "nickname": "Selector", - "title": "Selector", + "author": "\"\u02f6\ud835\udfa2\u292c\u2ad2\u2d56s\u143c\u02f6\"", + "description": "\"Selector and Recourse for exdysa workflow. Preset aspect ratios, general settings, fallback switches.\"", + "nickname": "\"Selector\"", + "title": "\"Selector\"", "title_aux": "comfyui-selector" } ], @@ -8212,6 +8431,14 @@ "title_aux": "ComfyUI-AutoTrimBG" } ], + "https://github.com/fexploit/ComfyUI-Classifier": [ + [ + "ClassifierNode" + ], + { + "title_aux": "ComfyUI-Classifier" + } + ], "https://github.com/filipemeneses/comfy_pixelization": [ [ "Pixelization" @@ -8232,8 +8459,10 @@ "FL_HalftonePattern", "FL_HexagonalPattern", "FL_ImageCaptionSaver", + "FL_ImageCollage", "FL_ImageDimensionDisplay", "FL_ImageDurationSync", + "FL_ImageNotes", "FL_ImagePixelator", "FL_ImageRandomizer", "FL_InfiniteZoom", @@ -8376,6 +8605,7 @@ "https://github.com/fmatray/ComfyUI_BattlemapGrid": [ [ "Battlemap Grid", + "Compass", "Map Generator", "Map Generator(Outdoors)" ], @@ -8459,6 +8689,13 @@ "title_aux": "ComfyUI_MagicClothing" } ], + "https://github.com/frankchieng/ComfyUI_llm_easyanimiate": [ + [], + { + "nodename_pattern": "^FrankChiengEasyAnimate", + "title_aux": "ComfyUI_llm_easyanimiate" + } + ], "https://github.com/fsdymy1024/ComfyUI_fsdymy": [ [ "Preview Image Without Metadata", @@ -8897,17 +9134,24 @@ "Image20SwitcherNode", "Image3SwitcherNode", "Image5SwitcherNode", + "MonoClip_node", + "PixelArt_node", + "VAEDecodePreview_node", + "image2contrastMask_node", + "image2imbgg_node", "image_halftone", "image_histograms_node", "image_histograms_node_compact", "images_side_by_side", - "smart_checkpoint_loader" + "imgbbLoader_node", + "smart_checkpoint_loader", + "storeURL_node" ], { "author": "YFG", - "description": "This extension calculates the histogram of an image and outputs the results as graph images for individual channels as well as RGB and Luminosity.", - "nickname": "\ud83d\udc2f YFG Histograms", - "title": "YFG Histograms", + "description": "This extension loads a model checkpoint file and extracts the model state dictionary or the entire model, treating all checkpoints as if they are in the root directory.", + "nickname": "\ud83e\udde0 YFG Smart Checkpoint Loader", + "title": "YFG Smart Checkpoint Loader", "title_aux": "\ud83d\ude38 YFG Comical Nodes" } ], @@ -8984,6 +9228,14 @@ "title_aux": "ComfyUI-Image-Matting" } ], + "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector": [ + [ + "Image Selector" + ], + { + "title_aux": "ComfyUI-HH-Image-Selector" + } + ], "https://github.com/hay86/ComfyUI_AceNodes": [ [ "ACE_AnyInputSwitchBool", @@ -9001,6 +9253,7 @@ "ACE_ImageRemoveBackground", "ACE_ImageSaveToCloud", "ACE_Integer", + "ACE_MaskBlur", "ACE_Seed", "ACE_Text", "ACE_TextConcatenate", @@ -9052,10 +9305,22 @@ "title_aux": "ComfyUI OpenVoice" } ], + "https://github.com/hben35096/ComfyUI-ToolBox": [ + [ + "AutoDLDownload", + "FolderDeleter", + "FolderViewe" + ], + { + "title_aux": "ComfyUI-ToolBox" + } + ], "https://github.com/heshengtao/comfyui_LLM_party": [ [ "About_us", "CLIPTextEncode_party", + "Dingding", + "Dingding_tool", "KSampler_party", "LLM", "LLM_api_loader", @@ -9066,6 +9331,7 @@ "accuweather_tool", "api_tool", "arxiv_tool", + "bing_tool", "check_web_tool", "classify_function", "classify_function_plus", @@ -9075,8 +9341,11 @@ "ebd_tool", "end_dialog", "end_workflow", + "feishu", + "feishu_tool", "file_combine", "file_combine_plus", + "github_tool", "google_tool", "interpreter_tool", "load_embeddings", @@ -9087,15 +9356,20 @@ "load_url", "load_wikipedia", "new_interpreter_tool", + "openai_tts", + "play_audio", "show_text_party", "start_dialog", "start_workflow", "string_logic", + "substring", "time_tool", "tool_combine", "tool_combine_plus", "weather_tool", "wikipedia_tool", + "work_wechat", + "work_wechat_tool", "workflow_tool", "workflow_transfer" ], @@ -9209,6 +9483,31 @@ "title_aux": "ComfyUI_DanTagGen" } ], + "https://github.com/huchenlei/ComfyUI_densediffusion": [ + [ + "DenseDiffusionAddCondNode", + "DenseDiffusionApplyNode" + ], + { + "title_aux": "ComfyUI DenseDiffusion" + } + ], + "https://github.com/huchenlei/ComfyUI_omost": [ + [ + "OmostDenseDiffusionLayoutNode", + "OmostGreedyBagsTextEmbeddingNode", + "OmostLLMChatNode", + "OmostLLMHTTPServerNode", + "OmostLLMLoaderNode", + "OmostLayoutCondNode", + "OmostLoadCanvasConditioningNode", + "OmostLoadCanvasPythonCodeNode", + "OmostRenderCanvasConditioningNode" + ], + { + "title_aux": "ComfyUI_omost" + } + ], "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor": [ [ "Openpose Keypoint Extractor" @@ -10352,14 +10651,6 @@ "title_aux": "LoRTnoC-ComfyUI" } ], - "https://github.com/laksjdjf/attention-couple-ComfyUI": [ - [ - "Attention couple" - ], - { - "title_aux": "attention-couple-ComfyUI" - } - ], "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": [ [ "CDTuner", @@ -10407,6 +10698,15 @@ "title_aux": "LoRA Power-Merger ComfyUI" } ], + "https://github.com/latenightlabs/ComfyUI-LNL": [ + [ + "LNL_FrameSelector", + "LNL_FrameSelectorV2" + ], + { + "title_aux": "LNL Frame Selector" + } + ], "https://github.com/leoleelxh/ComfyUI-LLMs": [ [ "\ud83d\uddbc\ufe0f LLMs_Vison_Ali", @@ -10458,18 +10758,37 @@ "https://github.com/ljleb/comfy-mecha": [ [ "Blocks Mecha Hyper", - "Custom Code Mecha Recipe", + "Float Mecha Hyper", + "Lora Mecha Recipe", + "Mecha Custom Code Recipe", "Mecha Merger", + "Mecha Recipe List", "Model Mecha Recipe" ], { - "title_aux": "comfy-mecha" + "title_aux": "Mecha Merge Node Pack" + } + ], + "https://github.com/lks-ai/ComfyUI-StableAudioSampler": [ + [ + "StableAudioConditioning", + "StableAudioLoadModel", + "StableAudioPrompt", + "StableAudioSampler" + ], + { + "author": "lks-ai", + "description": "A Simple integration of Stable Audio Diffusion with knobs and stuff!", + "nickname": "stableaudio", + "title": "StableAudioSampler", + "title_aux": "ComfyUI Stable Audio Open 1.0 Sampler" } ], "https://github.com/lks-ai/anynode": [ [ "AnyNode", "AnyNodeCodeViewer", + "AnyNodeExport", "AnyNodeGemini", "AnyNodeLocal" ], @@ -10592,10 +10911,15 @@ "https://github.com/longgui0318/comfyui-magic-clothing": [ [ "Add Magic Clothing Attention", + "Change Pipeline Dtype And Device", "Change Pixel Value Normalization", - "LOAD OMS", + "Diffusers Model Makeup &MC", + "Diffusers Scheduler Loader &MC", + "Load Magic Clothing Adapter", "Load Magic Clothing Model", - "RUN OMS" + "Load Magic Clothing Pipeline", + "Load Magic Clothing Pipeline With Path", + "RUN Magic Clothing Diffusers Model" ], { "title_aux": "comfyui-magic-clothing" @@ -10605,11 +10929,15 @@ [ "Image Adaptive Crop M&R", "Image Adaptive Crop With Mask", + "Image Change DType", "Image Change Device", "Image Resolution Adaptive With X", "Image Resolution Limit With 8K", + "Load Image With Name", + "Mask Change DType", "Mask Change Device", "Mask Selection Of Masks", + "Output Image To Input", "Split Masks" ], { @@ -10619,10 +10947,15 @@ "https://github.com/longgui0318/comfyui-oms-diffusion": [ [ "Add Magic Clothing Attention", + "Change Pipeline Dtype And Device", "Change Pixel Value Normalization", - "LOAD OMS", + "Diffusers Model Makeup &MC", + "Diffusers Scheduler Loader &MC", + "Load Magic Clothing Adapter", "Load Magic Clothing Model", - "RUN OMS" + "Load Magic Clothing Pipeline", + "Load Magic Clothing Pipeline With Path", + "RUN Magic Clothing Diffusers Model" ], { "title_aux": "comfyui-oms-diffusion" @@ -10639,6 +10972,8 @@ "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch": [ [ "InpaintCrop", + "InpaintExtendOutpaint", + "InpaintResize", "InpaintStitch" ], { @@ -10714,6 +11049,7 @@ "ImpactControlNetApplySEGS", "ImpactControlNetClearSEGS", "ImpactConvertDataType", + "ImpactCount_Elts_in_SEGS", "ImpactDecomposeSEGS", "ImpactDilateMask", "ImpactDilateMaskInSEGS", @@ -10875,6 +11211,7 @@ "ChangeLatentBatchSize //Inspire", "CheckpointLoaderSimpleShared //Inspire", "ColorMapToMasks //Inspire", + "ColorMaskToDepthMask //Inspire", "Color_Preprocessor_Provider_for_SEGS //Inspire", "ConcatConditioningsWithMultiplier //Inspire", "ConditioningStretch //Inspire", @@ -10919,6 +11256,7 @@ "PromptExtractor //Inspire", "RandomGeneratorForList //Inspire", "RandomNoise //Inspire", + "RegionalCFG //Inspire", "RegionalConditioningColorMask //Inspire", "RegionalConditioningSimple //Inspire", "RegionalIPAdapterColorMask //Inspire", @@ -10956,6 +11294,21 @@ "title_aux": "ComfyUI Inspire Pack" } ], + "https://github.com/luandev/ComfyUI-CrewAI": [ + [ + "\ud83d\udcceCrewAI Agent", + "\ud83d\udcceCrewAI Agent List", + "\ud83d\udcceCrewAI Crew", + "\ud83d\udcceCrewAI LLM Chat GPT", + "\ud83d\udcceCrewAI LLM Hugging Face", + "\ud83d\udcceCrewAI LLM OpenAI", + "\ud83d\udcceCrewAI Task", + "\ud83d\udcceCrewAI Task List" + ], + { + "title_aux": "ComfyUI CrewAI" + } + ], "https://github.com/m-sokes/ComfyUI-Sokes-Nodes": [ [ "Custom Date Format | sokes \ud83e\uddac", @@ -10996,6 +11349,20 @@ "title_aux": "ComfyUI-SubjectStyle-CSV" } ], + "https://github.com/marduk191/comfyui-marnodes": [ + [ + "marduk191_5_text_string", + "marduk191_5way_text_switch", + "marduk191_workflow_settings" + ], + { + "author": "\u02f6marduk191", + "description": "A node to set workflow settings.", + "nickname": "marduk191 workflow settings", + "title": "marduk191 workflow settings", + "title_aux": "marduk191 workflow settings" + } + ], "https://github.com/marhensa/sdxl-recommended-res-calc": [ [ "RecommendedResCalc" @@ -11550,6 +11917,15 @@ "title_aux": "ntdviet/comfyui-ext" } ], + "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace": [ + [ + "FlashFace_Loader_NuA", + "FlashFace_Sampler_NuA" + ], + { + "title_aux": "ComfyUI-NuA-FlashFace" + } + ], "https://github.com/nullquant/ComfyUI-BrushNet": [ [ "BlendInpaint", @@ -11816,6 +12192,7 @@ "BMAB Prompt", "BMAB Remove Background", "BMAB Resize By Person", + "BMAB Resize By Ratio", "BMAB Resize and Fill", "BMAB SD-WebUI API BMAB Extension", "BMAB SD-WebUI API ControlNet", @@ -11855,6 +12232,14 @@ "title_aux": "Comfyui-Minio" } ], + "https://github.com/prodogape/ComfyUI-OmDet": [ + [ + "Apply OmDet" + ], + { + "title_aux": "ComfyUI-OmDet" + } + ], "https://github.com/pythongosssss/ComfyUI-Custom-Scripts": [ [ "CheckpointLoader|pysssss", @@ -11952,6 +12337,7 @@ ], "https://github.com/receyuki/comfyui-prompt-reader-node": [ [ + "SDAnyConverter", "SDBatchLoader", "SDLoraLoader", "SDLoraSelector", @@ -12042,6 +12428,17 @@ "title_aux": "comfyui-ricklove" } ], + "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": [ + [ + "FrequencyCombination", + "FrequencyCombinationHSV", + "FrequencySeparation", + "FrequencySeparationHSV" + ], + { + "title_aux": "comfyUI_FrequencySeparation_RGB-HSV" + } + ], "https://github.com/rklaffehn/rk-comfy-nodes": [ [ "RK_CivitAIAddHashes", @@ -12145,6 +12542,7 @@ [ "Runtime44ColorMatch", "Runtime44DynamicKSampler", + "Runtime44FilmGrain", "Runtime44ImageEnhance", "Runtime44ImageOverlay", "Runtime44ImageResizer", @@ -12206,6 +12604,14 @@ "title_aux": "SRL's nodes" } ], + "https://github.com/seghier/ComfyUI_LibreTranslate/raw/main/translate_node.py": [ + [ + "LibreTranslate" + ], + { + "title_aux": "ComfyUI_LibreTranslate" + } + ], "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": [ [ "AdjustAndRoundDimensions", @@ -12247,6 +12653,7 @@ "ChatGPTOpenAI", "CkptNames_", "Color", + "CombineAudioVideo", "ComparingTwoFrames_", "CompositeImages_", "DynamicDelayProcessor", @@ -12259,6 +12666,7 @@ "Font", "GLIGENTextBoxApply_Advanced", "GamePal", + "GenerateFramesByCount", "GetImageSize_", "GradientImage", "GridDisplayAndSave", @@ -12267,12 +12675,14 @@ "ImageColorTransfer", "ImageCropByAlpha", "ImageListReplace_", + "ImageListToBatch_", "ImagesPrompt_", "IncrementingListNode_", "IntNumber", "JoinWithDelimiter", "LimitNumber", "ListSplit_", + "LoadAndCombinedAudio_", "LoadImagesFromPath", "LoadImagesFromURL", "LoadImagesToBatch", @@ -12298,6 +12708,7 @@ "SaveImageAndMetadata_", "SaveImageToLocal", "SaveTripoSRMesh", + "ScenesNode_", "ScreenShare", "Seed_", "ShowLayer", @@ -12329,6 +12740,16 @@ "title_aux": "comfyui-mixlab-nodes" } ], + "https://github.com/shadowcz007/comfyui-sound-lab": [ + [ + "AudioPlay", + "Musicgen_", + "StableAudio_" + ], + { + "title_aux": "comfyui-sound-lab" + } + ], "https://github.com/shadowcz007/comfyui-ultralytics-yolo": [ [ "DetectByLabel" @@ -12397,6 +12818,14 @@ "title_aux": "ComfyUI-send-Eagle(slim)" } ], + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": [ + [ + "PlusMinusTextClip" + ], + { + "title_aux": "PlusMinusTextClip - Single node for Positive and Negative Prompts" + } + ], "https://github.com/shockz0rz/ComfyUI_InterpolateEverything": [ [ "OpenposePreprocessorInterpolate" @@ -12542,6 +12971,9 @@ ], "https://github.com/smthemex/ComfyUI_ChatGLM_API": [ [ + "Glm_4_9b_Chat", + "Glm_4v_9b", + "Glm_Lcoal_Or_Repo", "ZhipuaiApi_Character", "ZhipuaiApi_Txt", "ZhipuaiApi_img" @@ -12570,7 +13002,8 @@ ], "https://github.com/smthemex/ComfyUI_ID_Animator": [ [ - "ID_Animator" + "ID_Animator", + "ID_Repo_Choice" ], { "title_aux": "ComfyUI_ID_Animator" @@ -12611,8 +13044,34 @@ "title_aux": "ComfyUI_Pipeline_Tool" } ], + "https://github.com/smthemex/ComfyUI_Pops": [ + [ + "Imgae_To_Path", + "Pops_Controlnet_Sampler", + "Pops_Ipadapter_Sampler", + "Pops_Mean_Sampler", + "Pops_Prior_Embedding", + "Pops_Repo_Choice", + "Pops_Unet_Sampler" + ], + { + "title_aux": "ComfyUI_Pops" + } + ], + "https://github.com/smthemex/ComfyUI_StableAudio_Open": [ + [ + "StableAudio_Open", + "Use_LocalModel_Or_Repo" + ], + { + "title_aux": "ComfyUI_StableAudio_Open" + } + ], "https://github.com/smthemex/ComfyUI_StoryDiffusion": [ [ + "Character_Batch", + "Comic_Type", + "Pre_Translate_prompt", "Storydiffusion_Img2Img", "Storydiffusion_Text2Img" ], @@ -12676,6 +13135,7 @@ "BatchNormalizeImage", "BatchNormalizeLatent", "BetterFilmGrain", + "BilateralFilterImage", "BlurImageFast", "BlurMaskFast", "ClampOutliers", @@ -12685,7 +13145,10 @@ "DilateErodeMask", "EnhanceDetail", "ExposureAdjust", + "FrequencyCombine", + "FrequencySeparate", "GuidedFilterAlpha", + "GuidedFilterImage", "ImageConstant", "ImageConstantHSV", "InstructPixToPixConditioningAdvanced", @@ -12693,6 +13156,7 @@ "Keyer", "LatentNormalizeShuffle", "LatentStats", + "MedianFilterImage", "NormalMapSimple", "OffsetLatentImage", "PrintSigmas", @@ -13062,6 +13526,38 @@ "title_aux": "ComfyUI Stable Video Diffusion" } ], + "https://github.com/tiankuan93/ComfyUI-V-Express": [ + [ + "Load_Audio_Path", + "Load_Audio_Path_From_Video", + "Load_Image_Path", + "Load_Kps_Path", + "Load_Kps_Path_From_Video", + "Load_Video_Path", + "VEINTConstant", + "VEPreview_Video", + "VEStringConstant", + "V_Express_Loader", + "V_Express_Sampler" + ], + { + "title_aux": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation" + } + ], + "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge": [ + [ + "ProjectorzControlnetInput", + "ProjectorzControlnetParameter", + "ProjectorzInitInput", + "ProjectorzOutput", + "ProjectorzParameter", + "ProjectorzStringToFloat", + "ProjectorzStringToInt" + ], + { + "title_aux": "Stable Projectorz Bridge" + } + ], "https://github.com/time-river/ComfyUI-CLIPSeg/raw/main/custom_nodes/clipseg.py": [ [ "CLIPSeg", @@ -13090,6 +13586,14 @@ "title_aux": "ComfyUI-AudioReactor" } ], + "https://github.com/tooldigital/ComfyUI-Yolo-Cropper": [ + [ + "ToolYoloCropper" + ], + { + "title_aux": "Easy automatic (square) image cropper using Yolo" + } + ], "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes": [ [ "CaptureWebcam", @@ -13113,6 +13617,12 @@ "quadmoonINTConditionalOperation", "quadmoonKSampler", "quadmoonKSamplerAdvanced", + "quadmoonLoadConfigs", + "quadmoonModelLoader", + "quadmoonSaveNeg", + "quadmoonSavePrompt", + "quadmoonSmartNeg", + "quadmoonSmartPrompt", "quadmoonThebutton" ], { @@ -13196,7 +13706,7 @@ ], "https://github.com/turkyden/ComfyUI-Comic": [ [ - "Image To Comic" + "ImageToComic" ], { "title_aux": "ComfyUI-Comic" @@ -13204,7 +13714,7 @@ ], "https://github.com/turkyden/ComfyUI-Sticker": [ [ - "Image To Sticker" + "ImageToSticker" ], { "title_aux": "ComfyUI-Sticker" @@ -13299,6 +13809,22 @@ "title_aux": "unwdef-nodes" } ], + "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": [ + [ + "VC_Load_Video_Path_Unified_Output", + "VC_Load_Video_Upload_Unified_Output", + "VC_Video_Combine_Unified_Output", + "Waveform2Audio", + "\ud83d\ude0bAPI Request Node", + "\ud83d\ude0bJSON Parser Node", + "\ud83d\ude0bOld Photo Colorization Node", + "\ud83d\ude0bOllama Request Node", + "\ud83d\ude0bSave Image Unified Output" + ], + { + "title_aux": "ZMG PLUGIN" + } + ], "https://github.com/vanillacode314/SimpleWildcardsComfyUI": [ [ "SimpleConcat", @@ -13690,6 +14216,7 @@ "easy a1111Loader", "easy applyBrushNet", "easy applyFooocusInpaint", + "easy applyInpaint", "easy applyPowerPaint", "easy boolean", "easy cascadeKSampler", @@ -14080,6 +14607,18 @@ "title_aux": "EasyCaptureNode for ComfyUI" } ], + "https://github.com/zohac/ComfyUI_ZC_DrawShape": [ + [ + "ZcDrawShape" + ], + { + "author": "Zohac", + "description": "nodes for artists, designers and animators.", + "nickname": "Zc DrawShape", + "title": "Zc DrawShape", + "title_aux": "ComfyUI_ZC_DrawShape" + } + ], "https://github.com/zombieyang/sd-ppp": [ [ "Get Image From Photoshop Layer", diff --git a/github-stats.json b/github-stats.json index beaccefb..0cbc21e5 100644 --- a/github-stats.json +++ b/github-stats.json @@ -1,3618 +1,4682 @@ { "https://github.com/0xbitches/ComfyUI-LCM": { - "stars": 244, - "last_update": "2023-11-11 21:24:33" + "stars": 245, + "last_update": "2023-11-11 21:24:33", + "author_account_age_days": 520 }, "https://github.com/1038lab/ComfyUI-GPT2P": { "stars": 3, - "last_update": "2024-02-21 04:45:27" + "last_update": "2024-06-10 16:56:29", + "author_account_age_days": 440 }, "https://github.com/11cafe/comfyui-workspace-manager": { - "stars": 743, - "last_update": "2024-05-31 09:50:26" + "stars": 762, + "last_update": "2024-06-05 11:38:13", + "author_account_age_days": 193 }, "https://github.com/11dogzi/Comfyui-ergouzi-Nodes": { + "stars": 15, + "last_update": "2024-05-23 00:08:39", + "author_account_age_days": 113 + }, + "https://github.com/11dogzi/Comfyui-ergouzi-samplers": { "stars": 13, - "last_update": "2024-05-23 00:08:39" + "last_update": "2024-06-05 13:53:28", + "author_account_age_days": 113 }, "https://github.com/1mckw/Comfyui-Gelbooru": { "stars": 2, - "last_update": "2024-05-27 07:45:00" + "last_update": "2024-05-27 07:45:00", + "author_account_age_days": 678 }, "https://github.com/42lux/ComfyUI-safety-checker": { - "stars": 16, - "last_update": "2024-05-22 22:11:59" + "stars": 17, + "last_update": "2024-05-22 22:11:59", + "author_account_age_days": 3687 }, "https://github.com/438443467/ComfyUI-GPT4V-Image-Captioner": { - "stars": 16, - "last_update": "2024-05-31 12:30:22" + "stars": 17, + "last_update": "2024-06-10 16:56:40", + "author_account_age_days": 402 }, "https://github.com/54rt1n/ComfyUI-DareMerge": { - "stars": 34, - "last_update": "2024-05-22 22:20:39" + "stars": 35, + "last_update": "2024-05-22 22:20:39", + "author_account_age_days": 4039 }, "https://github.com/80sVectorz/ComfyUI-Static-Primitives": { "stars": 10, - "last_update": "2024-05-23 11:20:57" + "last_update": "2024-05-23 11:20:57", + "author_account_age_days": 1459 }, "https://github.com/A4P7J1N7M05OT/ComfyUI-AutoColorGimp": { "stars": 0, - "last_update": "2024-05-23 00:26:10" + "last_update": "2024-05-23 00:26:10", + "author_account_age_days": 461 }, "https://github.com/A4P7J1N7M05OT/ComfyUI-PixelOE": { "stars": 6, - "last_update": "2024-06-02 14:57:59" + "last_update": "2024-06-02 14:57:59", + "author_account_age_days": 461 }, "https://github.com/AARG-FAN/Image-Raster-for-ComfyUI": { - "stars": 6, - "last_update": "2024-06-02 08:31:12" + "stars": 60, + "last_update": "2024-06-02 08:31:12", + "author_account_age_days": 487 }, "https://github.com/AI2lab/comfyUI-DeepSeek-2lab": { "stars": 2, - "last_update": "2024-05-22 22:11:40" - }, - "https://github.com/AIFSH/ComfyUI-ChatTTS": { - "stars": 20, - "last_update": "2024-05-30 09:51:20" + "last_update": "2024-06-06 23:11:12", + "author_account_age_days": 180 }, "https://github.com/AIFSH/ComfyUI-FishSpeech": { "stars": 6, - "last_update": "2024-05-23 01:18:49" + "last_update": "2024-05-23 01:18:49", + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-GPT_SoVITS": { - "stars": 141, - "last_update": "2024-05-15 01:13:11" + "stars": 146, + "last_update": "2024-05-15 01:13:11", + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-IP_LAP": { "stars": 22, - "last_update": "2024-04-30 01:42:53" + "last_update": "2024-04-30 01:42:53", + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-Live2DViewer": { "stars": 2, - "last_update": "2024-05-23 11:55:50" + "last_update": "2024-05-23 11:55:50", + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-MuseTalk_FSH": { "stars": 5, - "last_update": "2024-05-22 01:13:47" + "last_update": "2024-05-22 01:13:47", + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-RVC": { - "stars": 7, - "last_update": "2024-04-30 09:22:22" + "stars": 8, + "last_update": "2024-04-30 09:22:22", + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-UVR5": { - "stars": 52, - "last_update": "2024-05-09 13:19:51" + "stars": 53, + "last_update": "2024-05-09 13:19:51", + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-WhisperX": { - "stars": 15, - "last_update": "2024-05-06 06:25:52" + "stars": 17, + "last_update": "2024-05-06 06:25:52", + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-XTTS": { - "stars": 14, - "last_update": "2024-05-11 03:30:10" + "stars": 17, + "last_update": "2024-05-11 03:30:10", + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI_V-Express": { - "stars": 54, - "last_update": "2024-06-01 02:59:44" + "stars": 73, + "last_update": "2024-06-07 07:35:21", + "author_account_age_days": 219 }, "https://github.com/AIGCTeam/ComfyUI_kkTranslator_nodes": { "stars": 5, - "last_update": "2024-05-23 00:13:50" + "last_update": "2024-05-23 00:13:50", + "author_account_age_days": 198 }, "https://github.com/AIGODLIKE/AIGODLIKE-COMFYUI-TRANSLATION": { - "stars": 807, - "last_update": "2024-06-02 02:42:37" + "stars": 825, + "last_update": "2024-06-12 06:26:04", + "author_account_age_days": 489 }, "https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Studio": { - "stars": 196, - "last_update": "2024-06-02 08:21:04" + "stars": 202, + "last_update": "2024-06-05 00:52:46", + "author_account_age_days": 489 }, "https://github.com/AIGODLIKE/ComfyUI-CUP": { - "stars": 3, - "last_update": "2024-05-19 02:31:04" + "stars": 4, + "last_update": "2024-05-19 02:31:04", + "author_account_age_days": 489 }, "https://github.com/AIGODLIKE/ComfyUI-ToonCrafter": { - "stars": 79, - "last_update": "2024-06-02 15:16:51" + "stars": 209, + "last_update": "2024-06-03 11:42:25", + "author_account_age_days": 489 }, "https://github.com/AInseven/ComfyUI-fastblend": { - "stars": 97, - "last_update": "2024-04-03 11:50:44" + "stars": 102, + "last_update": "2024-04-03 11:50:44", + "author_account_age_days": 1671 }, "https://github.com/AIrjen/OneButtonPrompt": { - "stars": 703, - "last_update": "2024-05-31 12:59:42" + "stars": 722, + "last_update": "2024-06-10 18:34:16", + "author_account_age_days": 431 }, "https://github.com/ALatentPlace/ComfyUI_yanc": { - "stars": 12, - "last_update": "2024-06-02 08:04:02" + "stars": 14, + "last_update": "2024-06-11 07:13:42", + "author_account_age_days": 1448 }, "https://github.com/AbdullahAlfaraj/Comfy-Photoshop-SD": { - "stars": 170, - "last_update": "2023-12-12 12:23:04" + "stars": 173, + "last_update": "2023-12-12 12:23:04", + "author_account_age_days": 3656 }, "https://github.com/AbyssYuan0/ComfyUI_BadgerTools": { "stars": 6, - "last_update": "2024-05-22 21:27:48" + "last_update": "2024-05-22 21:27:48", + "author_account_age_days": 477 }, "https://github.com/Acly/comfyui-inpaint-nodes": { - "stars": 371, - "last_update": "2024-05-27 20:16:47" + "stars": 402, + "last_update": "2024-06-02 19:49:56", + "author_account_age_days": 3793 }, "https://github.com/Acly/comfyui-tooling-nodes": { - "stars": 196, - "last_update": "2024-05-29 15:43:39" + "stars": 202, + "last_update": "2024-06-12 15:44:54", + "author_account_age_days": 3793 }, "https://github.com/AiMiDi/ComfyUI-Aimidi-nodes": { "stars": 0, - "last_update": "2024-05-23 00:15:03" + "last_update": "2024-05-23 00:15:03", + "author_account_age_days": 1264 }, "https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet": { - "stars": 617, - "last_update": "2024-05-29 14:11:41" + "stars": 635, + "last_update": "2024-06-12 07:56:21", + "author_account_age_days": 2688 }, "https://github.com/Alysondao/Comfyui-Yolov8-JSON": { "stars": 12, - "last_update": "2024-05-31 10:14:21" + "last_update": "2024-05-31 10:14:21", + "author_account_age_days": 1018 }, "https://github.com/Amorano/Jovimetrix": { - "stars": 157, - "last_update": "2024-05-29 19:40:23" + "stars": 159, + "last_update": "2024-06-04 15:28:54", + "author_account_age_days": 5200 }, "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner": { - "stars": 2, - "last_update": "2024-05-29 10:34:05" + "stars": 3, + "last_update": "2024-05-29 10:34:05", + "author_account_age_days": 4080 }, "https://github.com/AonekoSS/ComfyUI-SimpleCounter": { "stars": 1, - "last_update": "2024-05-23 01:11:36" - }, - "https://github.com/AppleBotzz/ComfyUI_LLMVISION": { - "stars": 43, - "last_update": "2024-05-24 02:53:57" + "last_update": "2024-05-23 01:11:36", + "author_account_age_days": 4080 }, "https://github.com/ArcherFMY/Diffusion360_ComfyUI": { - "stars": 14, - "last_update": "2024-05-28 03:14:17" + "stars": 15, + "last_update": "2024-05-28 03:14:17", + "author_account_age_days": 3377 }, "https://github.com/ArdeniusAI/CPlus_Ardenius": { "stars": 0, - "last_update": "2024-03-28 02:21:05" + "last_update": "2024-03-28 02:21:05", + "author_account_age_days": 115 }, "https://github.com/ArtBot2023/CharacterFaceSwap": { - "stars": 52, - "last_update": "2024-05-22 20:53:09" + "stars": 54, + "last_update": "2024-05-22 20:53:09", + "author_account_age_days": 281 }, "https://github.com/ArtVentureX/comfyui-animatediff": { - "stars": 620, - "last_update": "2024-05-22 18:16:43" + "stars": 627, + "last_update": "2024-05-22 18:16:43", + "author_account_age_days": 393 }, "https://github.com/AshMartian/ComfyUI-DirGir": { - "stars": 8, - "last_update": "2024-05-29 22:28:55" + "stars": 10, + "last_update": "2024-05-29 22:28:55", + "author_account_age_days": 4574 }, "https://github.com/AuroBit/ComfyUI-AnimateAnyone-reproduction": { "stars": 34, - "last_update": "2024-02-29 10:19:36" + "last_update": "2024-02-29 10:19:36", + "author_account_age_days": 378 }, "https://github.com/AuroBit/ComfyUI-OOTDiffusion": { - "stars": 321, - "last_update": "2024-03-26 02:44:57" + "stars": 327, + "last_update": "2024-06-03 06:04:30", + "author_account_age_days": 378 }, "https://github.com/AustinMroz/ComfyUI-DynamicOversampling": { "stars": 0, - "last_update": "2024-05-31 19:47:42" + "last_update": "2024-05-31 19:47:42", + "author_account_age_days": 4062 }, "https://github.com/AustinMroz/ComfyUI-SpliceTools": { "stars": 7, - "last_update": "2024-04-21 07:59:14" + "last_update": "2024-04-21 07:59:14", + "author_account_age_days": 4062 }, "https://github.com/Auttasak-L/ComfyUI-ImageCropper": { - "stars": 0, - "last_update": "2024-05-23 05:04:53" + "stars": 1, + "last_update": "2024-05-23 05:04:53", + "author_account_age_days": 2637 }, "https://github.com/BAIS1C/ComfyUI_RSS_Feed_Reader": { "stars": 2, - "last_update": "2024-05-25 07:56:01" + "last_update": "2024-05-25 07:56:01", + "author_account_age_days": 478 }, "https://github.com/BXYMartin/ComfyUI-InstantIDUtils": { "stars": 3, - "last_update": "2024-05-23 00:08:50" + "last_update": "2024-05-23 00:08:50", + "author_account_age_days": 2431 }, "https://github.com/BadCafeCode/masquerade-nodes-comfyui": { - "stars": 291, - "last_update": "2024-05-22 17:55:57" + "stars": 300, + "last_update": "2024-05-22 17:55:57", + "author_account_age_days": 418 }, "https://github.com/Beinsezii/bsz-cui-extras": { - "stars": 19, - "last_update": "2024-05-22 20:46:45" + "stars": 20, + "last_update": "2024-05-22 20:46:45", + "author_account_age_days": 2214 + }, + "https://github.com/BenNarum/SigmaWaveFormNode": { + "stars": 5, + "last_update": "2024-06-11 22:55:52", + "author_account_age_days": 3061 }, "https://github.com/BennyKok/comfyui-deploy": { - "stars": 635, - "last_update": "2024-05-29 15:59:57" + "stars": 662, + "last_update": "2024-06-12 00:43:13", + "author_account_age_days": 2984 }, "https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools": { - "stars": 15, - "last_update": "2024-04-26 07:53:44" + "stars": 16, + "last_update": "2024-04-26 07:53:44", + "author_account_age_days": 860 }, "https://github.com/Big-Idea-Technology/ComfyUI_LLM_Node": { - "stars": 48, - "last_update": "2024-04-30 12:39:17" + "stars": 49, + "last_update": "2024-04-30 12:39:17", + "author_account_age_days": 860 }, "https://github.com/Billius-AI/ComfyUI-Path-Helper": { "stars": 13, - "last_update": "2024-05-22 23:25:08" + "last_update": "2024-05-22 23:25:08", + "author_account_age_days": 123 }, "https://github.com/BlakeOne/ComfyUI-CustomScheduler": { "stars": 11, - "last_update": "2024-05-23 00:23:56" + "last_update": "2024-05-23 00:23:56", + "author_account_age_days": 2521 }, "https://github.com/BlakeOne/ComfyUI-NodePresets": { "stars": 11, - "last_update": "2024-05-23 00:24:07" + "last_update": "2024-05-23 00:24:07", + "author_account_age_days": 2521 }, "https://github.com/BlakeOne/ComfyUI-NodeReset": { "stars": 1, - "last_update": "2024-05-23 00:24:18" + "last_update": "2024-05-23 00:24:18", + "author_account_age_days": 2521 }, "https://github.com/BlakeOne/ComfyUI-SchedulerMixer": { "stars": 10, - "last_update": "2024-05-23 00:23:44" + "last_update": "2024-05-23 00:23:44", + "author_account_age_days": 2521 }, "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": { - "stars": 257, - "last_update": "2024-05-22 14:56:13" + "stars": 262, + "last_update": "2024-05-22 14:56:13", + "author_account_age_days": 466 }, "https://github.com/BlenderNeko/ComfyUI_Cutoff": { - "stars": 322, - "last_update": "2024-05-22 15:01:45" + "stars": 329, + "last_update": "2024-05-22 15:01:45", + "author_account_age_days": 466 }, "https://github.com/BlenderNeko/ComfyUI_Noise": { - "stars": 198, - "last_update": "2024-06-02 13:52:14" + "stars": 199, + "last_update": "2024-06-10 16:38:48", + "author_account_age_days": 466 }, "https://github.com/BlenderNeko/ComfyUI_SeeCoder": { "stars": 35, - "last_update": "2024-05-22 14:57:04" + "last_update": "2024-05-22 14:57:04", + "author_account_age_days": 466 }, "https://github.com/BlenderNeko/ComfyUI_TiledKSampler": { - "stars": 276, - "last_update": "2024-05-22 14:56:49" + "stars": 285, + "last_update": "2024-05-22 14:56:49", + "author_account_age_days": 466 }, "https://github.com/CC-BryanOttho/ComfyUI_API_Manager": { - "stars": 8, - "last_update": "2024-02-27 23:31:45" + "stars": 9, + "last_update": "2024-02-27 23:31:45", + "author_account_age_days": 473 }, "https://github.com/CYBERLOOM-INC/ComfyUI-nodes-hnmr": { "stars": 3, - "last_update": "2024-05-22 17:55:41" + "last_update": "2024-05-22 17:55:41", + "author_account_age_days": 238 }, "https://github.com/CavinHuang/comfyui-nodes-docs": { - "stars": 28, - "last_update": "2024-05-28 10:45:04" + "stars": 45, + "last_update": "2024-06-12 00:47:47", + "author_account_age_days": 2714 }, "https://github.com/Chan-0312/ComfyUI-EasyDeforum": { "stars": 7, - "last_update": "2024-05-22 23:22:14" + "last_update": "2024-05-22 23:22:14", + "author_account_age_days": 1854 }, "https://github.com/Chan-0312/ComfyUI-IPAnimate": { - "stars": 63, - "last_update": "2024-05-22 23:22:03" + "stars": 65, + "last_update": "2024-05-22 23:22:03", + "author_account_age_days": 1854 }, "https://github.com/Chan-0312/ComfyUI-Prompt-Preview": { "stars": 15, - "last_update": "2024-02-27 11:30:38" + "last_update": "2024-02-27 11:30:38", + "author_account_age_days": 1854 }, "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes": { "stars": 12, - "last_update": "2024-04-05 11:14:24" + "last_update": "2024-04-05 11:14:24", + "author_account_age_days": 1867 }, "https://github.com/Clybius/ComfyUI-Extra-Samplers": { - "stars": 47, - "last_update": "2024-04-18 04:28:09" + "stars": 51, + "last_update": "2024-04-18 04:28:09", + "author_account_age_days": 1722 }, "https://github.com/Clybius/ComfyUI-Latent-Modifiers": { - "stars": 40, - "last_update": "2024-01-02 21:57:58" + "stars": 43, + "last_update": "2024-01-02 21:57:58", + "author_account_age_days": 1722 }, "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes": { - "stars": 72, - "last_update": "2024-05-22 22:16:24" + "stars": 77, + "last_update": "2024-06-07 13:29:06", + "author_account_age_days": 3643 }, "https://github.com/Danand/ComfyUI-ComfyCouple": { - "stars": 18, - "last_update": "2024-05-07 23:06:53" + "stars": 20, + "last_update": "2024-05-07 23:06:53", + "author_account_age_days": 4277 }, "https://github.com/DarKDinDoN/comfyui-checkpoint-automatic-config": { "stars": 3, - "last_update": "2024-05-26 08:00:23" + "last_update": "2024-05-26 08:00:23", + "author_account_age_days": 4428 + }, + "https://github.com/DataCTE/prompt_injection": { + "stars": 47, + "last_update": "2024-06-04 12:52:41", + "author_account_age_days": 766 }, "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes": { - "stars": 279, - "last_update": "2024-05-22 17:38:48" + "stars": 284, + "last_update": "2024-05-22 17:38:48", + "author_account_age_days": 1763 }, "https://github.com/DigitalIO/ComfyUI-stable-wildcards": { "stars": 18, - "last_update": "2024-05-24 21:15:08" + "last_update": "2024-05-24 21:15:08", + "author_account_age_days": 4027 }, "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI": { "stars": 7, - "last_update": "2024-05-22 23:14:06" + "last_update": "2024-05-22 23:14:06", + "author_account_age_days": 3061 }, "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes": { "stars": 0, - "last_update": "2024-05-22 23:24:30" + "last_update": "2024-05-22 23:24:30", + "author_account_age_days": 3476 }, "https://github.com/DrJKL/ComfyUI-Anchors": { "stars": 4, - "last_update": "2024-03-20 22:40:29" + "last_update": "2024-03-20 22:40:29", + "author_account_age_days": 4983 }, "https://github.com/DrMWeigand/ComfyUI_ColorImageDetection": { "stars": 1, - "last_update": "2024-05-23 00:25:14" + "last_update": "2024-05-23 00:25:14", + "author_account_age_days": 1020 }, "https://github.com/Electrofried/ComfyUI-OpenAINode": { "stars": 18, - "last_update": "2023-12-05 21:34:23" + "last_update": "2023-12-05 21:34:23", + "author_account_age_days": 2608 }, "https://github.com/EllangoK/ComfyUI-post-processing-nodes": { - "stars": 143, - "last_update": "2024-05-22 17:54:09" + "stars": 144, + "last_update": "2024-05-22 17:54:09", + "author_account_age_days": 2766 }, "https://github.com/ExponentialML/ComfyUI_ModelScopeT2V": { "stars": 25, - "last_update": "2024-05-23 00:12:17" + "last_update": "2024-05-23 00:12:17", + "author_account_age_days": 1612 }, "https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter": { - "stars": 88, - "last_update": "2024-05-23 00:12:28" + "stars": 96, + "last_update": "2024-06-08 02:33:02", + "author_account_age_days": 1612 }, "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting": { - "stars": 246, - "last_update": "2024-05-23 00:12:41" + "stars": 251, + "last_update": "2024-05-23 00:12:41", + "author_account_age_days": 1612 }, "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG": { - "stars": 247, - "last_update": "2024-06-01 18:36:53" + "stars": 260, + "last_update": "2024-06-09 18:40:19", + "author_account_age_days": 3138 }, "https://github.com/Extraltodeus/LoadLoraWithTags": { - "stars": 35, - "last_update": "2024-05-22 20:36:32" + "stars": 36, + "last_update": "2024-06-03 03:04:45", + "author_account_age_days": 3138 }, "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings": { - "stars": 12, - "last_update": "2024-06-01 14:44:26" + "stars": 19, + "last_update": "2024-06-10 16:09:31", + "author_account_age_days": 3138 }, "https://github.com/Extraltodeus/Vector_Sculptor_ComfyUI": { - "stars": 70, - "last_update": "2024-06-01 15:08:11" + "stars": 78, + "last_update": "2024-06-03 03:04:03", + "author_account_age_days": 3138 }, "https://github.com/Extraltodeus/noise_latent_perlinpinpin": { - "stars": 18, - "last_update": "2024-05-22 20:36:19" + "stars": 22, + "last_update": "2024-06-03 03:04:40", + "author_account_age_days": 3138 }, "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler": { - "stars": 41, - "last_update": "2024-05-22 20:36:48" + "stars": 42, + "last_update": "2024-06-11 19:48:04", + "author_account_age_days": 3138 }, "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation": { - "stars": 318, - "last_update": "2024-05-21 00:52:49" + "stars": 329, + "last_update": "2024-05-21 00:52:49", + "author_account_age_days": 3120 }, "https://github.com/Fannovel16/ComfyUI-Loopchain": { - "stars": 26, - "last_update": "2023-12-15 14:25:35" + "stars": 27, + "last_update": "2023-12-15 14:25:35", + "author_account_age_days": 3120 }, "https://github.com/Fannovel16/ComfyUI-MagickWand": { - "stars": 68, - "last_update": "2024-05-20 14:13:55" + "stars": 69, + "last_update": "2024-05-20 14:13:55", + "author_account_age_days": 3120 }, "https://github.com/Fannovel16/ComfyUI-MotionDiff": { - "stars": 142, - "last_update": "2024-05-21 00:51:03" + "stars": 143, + "last_update": "2024-05-21 00:51:03", + "author_account_age_days": 3120 }, "https://github.com/Fannovel16/ComfyUI-Video-Matting": { - "stars": 138, - "last_update": "2024-05-21 00:51:54" + "stars": 139, + "last_update": "2024-05-21 00:51:54", + "author_account_age_days": 3120 }, "https://github.com/Fannovel16/comfyui_controlnet_aux": { - "stars": 1464, - "last_update": "2024-05-24 11:05:47" + "stars": 1518, + "last_update": "2024-05-24 11:05:47", + "author_account_age_days": 3120 }, "https://github.com/Fantaxico/ComfyUI-GCP-Storage": { "stars": 0, - "last_update": "2024-05-24 16:17:41" + "last_update": "2024-05-24 16:17:41", + "author_account_age_days": 524 }, "https://github.com/Feidorian/feidorian-ComfyNodes": { "stars": 5, - "last_update": "2024-05-22 21:30:52" + "last_update": "2024-05-22 21:30:52", + "author_account_age_days": 2743 }, "https://github.com/Fictiverse/ComfyUI_Fictiverse": { - "stars": 7, - "last_update": "2024-05-23 19:09:18" + "stars": 8, + "last_update": "2024-06-05 19:03:21", + "author_account_age_days": 660 }, "https://github.com/Fihade/IC-Light-ComfyUI-Node": { - "stars": 4, - "last_update": "2024-05-23 01:20:21" + "stars": 5, + "last_update": "2024-05-23 01:20:21", + "author_account_age_days": 2735 }, "https://github.com/FizzleDorf/ComfyUI-AIT": { "stars": 43, - "last_update": "2024-05-16 23:55:47" + "last_update": "2024-05-16 23:55:47", + "author_account_age_days": 1968 }, "https://github.com/FizzleDorf/ComfyUI_FizzNodes": { - "stars": 300, - "last_update": "2024-05-25 04:05:51" + "stars": 305, + "last_update": "2024-06-03 00:52:40", + "author_account_age_days": 1968 }, "https://github.com/FlyingFireCo/tiled_ksampler": { "stars": 56, - "last_update": "2024-05-22 23:15:17" + "last_update": "2024-05-22 23:15:17", + "author_account_age_days": 621 }, "https://github.com/ForeignGods/ComfyUI-Mana-Nodes": { - "stars": 171, - "last_update": "2024-05-29 18:29:05" + "stars": 175, + "last_update": "2024-05-29 18:29:05", + "author_account_age_days": 1232 }, "https://github.com/Franck-Demongin/NX_PromptStyler": { "stars": 4, - "last_update": "2024-05-22 23:25:21" + "last_update": "2024-05-22 23:25:21", + "author_account_age_days": 1759 }, "https://github.com/FredBill1/comfyui-fb-utils": { "stars": 0, - "last_update": "2024-05-23 01:41:02" + "last_update": "2024-05-23 01:41:02", + "author_account_age_days": 2305 }, "https://github.com/GMapeSplat/ComfyUI_ezXY": { - "stars": 18, - "last_update": "2024-05-29 17:43:08" + "stars": 20, + "last_update": "2024-05-29 17:43:08", + "author_account_age_days": 1286 }, "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": { "stars": 7, - "last_update": "2024-05-22 21:31:52" + "last_update": "2024-05-22 21:31:52", + "author_account_age_days": 2545 + }, + "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes": { + "stars": 2, + "last_update": "2024-06-12 13:49:07", + "author_account_age_days": 4556 }, "https://github.com/GentlemanHu/ComfyUI-SunoAI": { - "stars": 9, - "last_update": "2024-05-23 01:17:07" + "stars": 10, + "last_update": "2024-05-23 01:17:07", + "author_account_age_days": 2371 }, "https://github.com/Goktug/comfyui-saveimage-plus": { - "stars": 0, - "last_update": "2024-05-30 18:16:57" + "stars": 1, + "last_update": "2024-05-30 18:16:57", + "author_account_age_days": 4920 }, "https://github.com/Gourieff/comfyui-reactor-node": { - "stars": 984, - "last_update": "2024-05-30 09:41:30" + "stars": 1013, + "last_update": "2024-06-11 21:26:47", + "author_account_age_days": 1108 }, "https://github.com/GraftingRayman/ComfyUI_GraftingRayman": { "stars": 9, - "last_update": "2024-05-28 23:31:22" + "last_update": "2024-06-12 12:08:18", + "author_account_age_days": 151 }, "https://github.com/Guillaume-Fgt/ComfyUI_StableCascadeLatentRatio": { "stars": 3, - "last_update": "2024-02-26 09:37:16" + "last_update": "2024-02-26 09:37:16", + "author_account_age_days": 1468 }, "https://github.com/HAL41/ComfyUI-aichemy-nodes": { "stars": 4, - "last_update": "2024-05-22 23:10:19" + "last_update": "2024-05-22 23:10:19", + "author_account_age_days": 2834 }, "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream": { - "stars": 34, - "last_update": "2024-05-07 15:00:31" + "stars": 35, + "last_update": "2024-06-05 16:06:39", + "author_account_age_days": 598 }, "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes": { - "stars": 27, - "last_update": "2024-06-02 10:28:19" + "stars": 33, + "last_update": "2024-06-02 10:28:19", + "author_account_age_days": 598 }, "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything": { - "stars": 13, - "last_update": "2024-04-04 11:58:20" + "stars": 14, + "last_update": "2024-04-04 11:58:20", + "author_account_age_days": 598 }, "https://github.com/Haoming02/comfyui-clear-screen": { "stars": 1, - "last_update": "2023-12-12 08:16:28" + "last_update": "2023-12-12 08:16:28", + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-diffusion-cg": { - "stars": 46, - "last_update": "2024-05-08 04:00:04" + "stars": 49, + "last_update": "2024-05-08 04:00:04", + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-floodgate": { "stars": 25, - "last_update": "2024-01-31 09:08:14" + "last_update": "2024-01-31 09:08:14", + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-menu-anchor": { "stars": 3, - "last_update": "2024-01-26 03:54:55" + "last_update": "2024-01-26 03:54:55", + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-prompt-format": { "stars": 28, - "last_update": "2023-12-11 13:44:03" + "last_update": "2023-12-11 13:44:03", + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-tab-handler": { "stars": 4, - "last_update": "2023-12-14 08:24:49" + "last_update": "2023-12-14 08:24:49", + "author_account_age_days": 1319 }, "https://github.com/HaydenReeve/ComfyUI-Better-Strings": { "stars": 0, - "last_update": "2024-05-22 23:20:05" + "last_update": "2024-05-22 23:20:05", + "author_account_age_days": 2230 }, "https://github.com/HebelHuber/comfyui-enhanced-save-node": { "stars": 1, - "last_update": "2024-01-12 14:34:55" + "last_update": "2024-01-12 14:34:55", + "author_account_age_days": 2312 }, "https://github.com/Hiero207/ComfyUI-Hiero-Nodes": { "stars": 5, - "last_update": "2024-05-22 23:16:16" + "last_update": "2024-05-22 23:16:16", + "author_account_age_days": 1687 }, "https://github.com/Hopping-Mad-Games/ComfyUI_LiteLLM": { "stars": 2, - "last_update": "2024-05-23 01:11:24" + "last_update": "2024-06-12 21:27:40", + "author_account_age_days": 177 }, "https://github.com/IDGallagher/ComfyUI-IG-Nodes": { "stars": 0, - "last_update": "2024-05-22 22:14:06" + "last_update": "2024-06-04 00:24:47", + "author_account_age_days": 5469 }, "https://github.com/ITurchenko/ComfyUI-SizeFromArray": { "stars": 0, - "last_update": "2024-05-24 14:09:58" + "last_update": "2024-05-24 14:09:58", + "author_account_age_days": 3697 }, "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes": { "stars": 8, - "last_update": "2024-05-23 01:12:46" + "last_update": "2024-05-23 01:12:46", + "author_account_age_days": 2618 }, "https://github.com/Inzaniak/comfyui-ranbooru": { - "stars": 6, - "last_update": "2024-05-22 23:12:23" + "stars": 7, + "last_update": "2024-05-22 23:12:23", + "author_account_age_days": 3898 }, "https://github.com/IsItDanOrAi/ComfyUI-Stereopsis": { "stars": 2, - "last_update": "2024-05-23 00:22:46" + "last_update": "2024-05-23 00:22:46", + "author_account_age_days": 100 }, "https://github.com/JPS-GER/ComfyUI_JPS-Nodes": { - "stars": 31, - "last_update": "2024-05-22 20:39:14" + "stars": 32, + "last_update": "2024-05-22 20:39:14", + "author_account_age_days": 304 }, "https://github.com/Jannchie/ComfyUI-J": { - "stars": 58, - "last_update": "2024-05-23 00:16:12" + "stars": 60, + "last_update": "2024-05-23 00:16:12", + "author_account_age_days": 2541 }, "https://github.com/JaredTherriault/ComfyUI-JNodes": { - "stars": 9, - "last_update": "2024-06-02 03:43:57" + "stars": 11, + "last_update": "2024-06-11 03:54:30", + "author_account_age_days": 3560 + }, + "https://github.com/JayLyu/ComfyUI_BaiKong_Node": { + "stars": 0, + "last_update": "2024-06-04 16:30:54", + "author_account_age_days": 3256 }, "https://github.com/JcandZero/ComfyUI_GLM4Node": { - "stars": 23, - "last_update": "2024-05-22 23:12:46" + "stars": 24, + "last_update": "2024-05-22 23:12:46", + "author_account_age_days": 678 }, "https://github.com/Jcd1230/rembg-comfyui-node": { - "stars": 116, - "last_update": "2024-05-22 17:58:34" + "stars": 119, + "last_update": "2024-05-22 17:58:34", + "author_account_age_days": 4874 }, "https://github.com/JerryOrbachJr/ComfyUI-RandomSize": { "stars": 3, - "last_update": "2024-05-22 23:18:51" + "last_update": "2024-05-22 23:18:51", + "author_account_age_days": 144 }, "https://github.com/JettHu/ComfyUI-TCD": { - "stars": 68, - "last_update": "2024-05-07 08:34:59" + "stars": 75, + "last_update": "2024-06-03 11:40:18", + "author_account_age_days": 2346 }, "https://github.com/JettHu/ComfyUI_TGate": { - "stars": 43, - "last_update": "2024-05-26 08:29:23" + "stars": 45, + "last_update": "2024-05-26 08:29:23", + "author_account_age_days": 2346 }, "https://github.com/Jordach/comfy-plasma": { - "stars": 47, - "last_update": "2024-05-22 18:08:28" + "stars": 49, + "last_update": "2024-05-22 18:08:28", + "author_account_age_days": 4501 }, "https://github.com/Kaharos94/ComfyUI-Saveaswebp": { "stars": 30, - "last_update": "2024-05-22 18:06:48" + "last_update": "2024-05-22 18:06:48", + "author_account_age_days": 1183 }, "https://github.com/Kangkang625/ComfyUI-paint-by-example": { "stars": 13, - "last_update": "2024-05-22 22:20:27" + "last_update": "2024-05-22 22:20:27", + "author_account_age_days": 902 }, "https://github.com/KewkLW/ComfyUI-kewky_tools": { - "stars": 2, - "last_update": "2024-05-23 01:20:32" + "stars": 3, + "last_update": "2024-05-23 01:20:32", + "author_account_age_days": 1675 }, "https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler": { - "stars": 130, - "last_update": "2024-05-12 15:49:06" + "stars": 131, + "last_update": "2024-05-12 15:49:06", + "author_account_age_days": 1474 }, "https://github.com/KoreTeknology/ComfyUI-Universal-Styler": { "stars": 5, - "last_update": "2024-05-08 21:25:51" + "last_update": "2024-05-08 21:25:51", + "author_account_age_days": 3178 }, "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": { - "stars": 391, - "last_update": "2024-05-29 06:59:31" + "stars": 400, + "last_update": "2024-06-03 09:40:01", + "author_account_age_days": 3705 }, "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": { - "stars": 2165, - "last_update": "2024-05-21 05:29:18" + "stars": 2216, + "last_update": "2024-06-11 04:21:54", + "author_account_age_days": 3705 }, "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite": { - "stars": 370, - "last_update": "2024-05-31 18:30:58" + "stars": 382, + "last_update": "2024-06-11 17:46:53", + "author_account_age_days": 3705 }, "https://github.com/KytraScript/ComfyUI_KytraWebhookHTTP": { "stars": 3, - "last_update": "2024-05-23 00:21:43" + "last_update": "2024-05-23 00:21:43", + "author_account_age_days": 1768 }, "https://github.com/LEv145/images-grid-comfy-plugin": { - "stars": 121, - "last_update": "2024-05-30 17:54:32" + "stars": 126, + "last_update": "2024-05-30 17:54:32", + "author_account_age_days": 2196 + }, + "https://github.com/LZpenguin/ComfyUI-Text": { + "stars": 3, + "last_update": "2024-06-11 14:28:56", + "author_account_age_days": 1967 }, "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": { - "stars": 25, - "last_update": "2024-05-22 23:08:11" + "stars": 27, + "last_update": "2024-06-06 20:45:43", + "author_account_age_days": 152 }, "https://github.com/LarryJane491/Lora-Training-in-Comfy": { - "stars": 227, - "last_update": "2024-05-22 23:07:59" + "stars": 239, + "last_update": "2024-06-09 05:24:00", + "author_account_age_days": 152 }, "https://github.com/Layer-norm/comfyui-lama-remover": { - "stars": 49, - "last_update": "2024-05-25 00:12:04" + "stars": 51, + "last_update": "2024-05-25 00:12:04", + "author_account_age_days": 320 }, "https://github.com/Lerc/canvas_tab": { - "stars": 123, - "last_update": "2024-05-22 20:48:45" + "stars": 125, + "last_update": "2024-05-22 20:48:45", + "author_account_age_days": 5356 }, "https://github.com/Limitex/ComfyUI-Calculation": { "stars": 0, - "last_update": "2024-05-22 22:18:40" + "last_update": "2024-05-22 22:18:40", + "author_account_age_days": 1263 }, "https://github.com/Limitex/ComfyUI-Diffusers": { - "stars": 101, - "last_update": "2024-05-22 22:18:57" + "stars": 103, + "last_update": "2024-05-22 22:18:57", + "author_account_age_days": 1263 }, "https://github.com/Loewen-Hob/rembg-comfyui-node-better": { - "stars": 28, - "last_update": "2024-05-23 00:32:53" + "stars": 32, + "last_update": "2024-05-23 00:32:53", + "author_account_age_days": 459 }, "https://github.com/LonicaMewinsky/ComfyUI-MakeFrame": { "stars": 23, - "last_update": "2024-05-22 21:29:02" + "last_update": "2024-05-22 21:29:02", + "author_account_age_days": 964 }, "https://github.com/LonicaMewinsky/ComfyUI-RawSaver": { "stars": 1, - "last_update": "2024-05-22 21:31:28" + "last_update": "2024-05-22 21:31:28", + "author_account_age_days": 964 }, "https://github.com/Ludobico/ComfyUI-ScenarioPrompt": { - "stars": 11, - "last_update": "2024-03-26 01:28:07" + "stars": 12, + "last_update": "2024-03-26 01:28:07", + "author_account_age_days": 1021 }, "https://github.com/LyazS/comfyui-anime-seg": { "stars": 4, - "last_update": "2024-05-22 23:21:49" - }, - "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes": { - "stars": 12, - "last_update": "2024-04-05 05:11:51" + "last_update": "2024-05-22 23:21:49", + "author_account_age_days": 2845 }, "https://github.com/M1kep/ComfyLiterals": { - "stars": 10, - "last_update": "2024-05-22 20:31:38" + "stars": 11, + "last_update": "2024-05-22 20:31:38", + "author_account_age_days": 4246 }, "https://github.com/M1kep/ComfyUI-KepOpenAI": { - "stars": 24, - "last_update": "2024-05-22 20:33:54" + "stars": 26, + "last_update": "2024-05-22 20:33:54", + "author_account_age_days": 4246 }, "https://github.com/M1kep/ComfyUI-OtherVAEs": { "stars": 2, - "last_update": "2024-05-22 20:33:41" + "last_update": "2024-05-22 20:33:41", + "author_account_age_days": 4246 }, "https://github.com/M1kep/Comfy_KepKitchenSink": { "stars": 0, - "last_update": "2024-05-22 20:33:29" + "last_update": "2024-05-22 20:33:29", + "author_account_age_days": 4246 }, "https://github.com/M1kep/Comfy_KepListStuff": { - "stars": 25, - "last_update": "2024-05-22 20:31:26" + "stars": 26, + "last_update": "2024-05-22 20:31:26", + "author_account_age_days": 4246 }, "https://github.com/M1kep/Comfy_KepMatteAnything": { "stars": 10, - "last_update": "2024-05-22 20:33:16" + "last_update": "2024-05-22 20:33:16", + "author_account_age_days": 4246 }, "https://github.com/M1kep/KepPromptLang": { "stars": 4, - "last_update": "2024-05-22 20:32:56" + "last_update": "2024-05-22 20:32:56", + "author_account_age_days": 4246 }, "https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": { - "stars": 19, - "last_update": "2024-05-21 01:20:59" + "stars": 25, + "last_update": "2024-06-04 23:56:25", + "author_account_age_days": 1593 }, "https://github.com/Makeezi/ComfyUI-promptLAB": { "stars": 0, - "last_update": "2024-05-23 01:24:51" + "last_update": "2024-05-23 01:24:51", + "author_account_age_days": 1770 }, "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes": { "stars": 12, - "last_update": "2024-04-02 12:00:48" + "last_update": "2024-04-02 12:00:48", + "author_account_age_days": 370 }, "https://github.com/ManglerFTW/ComfyI2I": { - "stars": 135, - "last_update": "2023-11-03 11:09:53" + "stars": 136, + "last_update": "2023-11-03 11:09:53", + "author_account_age_days": 644 }, "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes": { - "stars": 48, - "last_update": "2024-05-31 23:45:29" + "stars": 50, + "last_update": "2024-06-11 22:07:45", + "author_account_age_days": 4958 }, "https://github.com/MarcusNyne/m9-prompts-comfyui": { - "stars": 0, - "last_update": "2024-05-23 21:06:11" + "stars": 1, + "last_update": "2024-06-11 21:19:23", + "author_account_age_days": 1411 }, "https://github.com/MariusKM/ComfyUI-BadmanNodes": { "stars": 0, - "last_update": "2024-05-31 10:15:35" + "last_update": "2024-05-31 10:15:35", + "author_account_age_days": 2219 }, "https://github.com/MarkoCa1/ComfyUI-Text": { "stars": 2, - "last_update": "2024-05-23 00:15:39" + "last_update": "2024-05-23 00:15:39", + "author_account_age_days": 1621 }, "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": { - "stars": 14, - "last_update": "2024-05-23 00:15:51" + "stars": 15, + "last_update": "2024-05-23 00:15:51", + "author_account_age_days": 1621 }, "https://github.com/Mason-McGough/ComfyUI-Mosaica": { "stars": 3, - "last_update": "2024-05-29 12:57:49" + "last_update": "2024-05-29 12:57:49", + "author_account_age_days": 3194 }, "https://github.com/Millyarde/Pomfy": { "stars": 7, - "last_update": "2024-05-22 22:22:48" + "last_update": "2024-05-22 22:22:48", + "author_account_age_days": 895 }, "https://github.com/MinusZoneAI/ComfyUI-Prompt-MZ": { - "stars": 55, - "last_update": "2024-06-02 08:46:20" + "stars": 61, + "last_update": "2024-06-12 14:21:47", + "author_account_age_days": 54 }, "https://github.com/MinusZoneAI/ComfyUI-StylizePhoto-MZ": { - "stars": 9, - "last_update": "2024-05-23 01:13:32" + "stars": 16, + "last_update": "2024-05-23 01:13:32", + "author_account_age_days": 54 }, "https://github.com/Miosp/ComfyUI-FBCNN": { "stars": 4, - "last_update": "2024-05-24 12:13:08" + "last_update": "2024-05-24 12:13:08", + "author_account_age_days": 2504 }, "https://github.com/MitoshiroPJ/comfyui_slothful_attention": { "stars": 5, - "last_update": "2024-05-22 22:09:15" + "last_update": "2024-05-22 22:09:15", + "author_account_age_days": 3956 }, "https://github.com/MokkaBoss1/ComfyUI_Mokkaboss1": { - "stars": 14, - "last_update": "2024-05-27 11:16:36" + "stars": 15, + "last_update": "2024-06-12 07:02:22", + "author_account_age_days": 367 }, "https://github.com/MrForExample/ComfyUI-3D-Pack": { - "stars": 1556, - "last_update": "2024-06-01 13:18:40" + "stars": 1610, + "last_update": "2024-06-04 20:35:47", + "author_account_age_days": 1549 }, "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved": { - "stars": 425, - "last_update": "2024-02-02 14:19:37" + "stars": 428, + "last_update": "2024-02-02 14:19:37", + "author_account_age_days": 1549 }, "https://github.com/Munkyfoot/ComfyUI-TextOverlay": { - "stars": 1, - "last_update": "2024-02-27 22:56:42" + "stars": 2, + "last_update": "2024-02-27 22:56:42", + "author_account_age_days": 3033 }, "https://github.com/Nestorchik/NStor-ComfyUI-Translation": { "stars": 1, - "last_update": "2024-05-01 12:24:22" + "last_update": "2024-05-01 12:24:22", + "author_account_age_days": 1313 }, "https://github.com/NeuralSamurAI/Comfyui-Superprompt-Unofficial": { "stars": 54, - "last_update": "2024-05-23 00:22:08" + "last_update": "2024-05-23 00:22:08", + "author_account_age_days": 82 }, "https://github.com/Nevysha/ComfyUI-nevysha-top-menu": { "stars": 4, - "last_update": "2024-05-23 00:17:31" + "last_update": "2024-05-23 00:17:31", + "author_account_age_days": 515 }, "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite": { "stars": 13, - "last_update": "2024-05-22 20:34:46" + "last_update": "2024-05-22 20:34:46", + "author_account_age_days": 5138 }, "https://github.com/NimaNzrii/comfyui-photoshop": { - "stars": 146, - "last_update": "2024-05-22 22:12:15" + "stars": 164, + "last_update": "2024-06-12 17:28:57", + "author_account_age_days": 233 }, "https://github.com/NimaNzrii/comfyui-popup_preview": { - "stars": 33, - "last_update": "2024-05-22 22:12:04" + "stars": 34, + "last_update": "2024-05-22 22:12:04", + "author_account_age_days": 233 }, "https://github.com/Niutonian/ComfyUi-NoodleWebcam": { "stars": 27, - "last_update": "2024-05-22 21:30:40" + "last_update": "2024-05-22 21:30:40", + "author_account_age_days": 1030 }, "https://github.com/Nlar/ComfyUI_CartoonSegmentation": { - "stars": 8, - "last_update": "2024-05-22 23:15:37" + "stars": 9, + "last_update": "2024-05-22 23:15:37", + "author_account_age_days": 3819 }, "https://github.com/NotHarroweD/Harronode": { "stars": 5, - "last_update": "2024-05-22 22:18:29" + "last_update": "2024-05-22 22:18:29", + "author_account_age_days": 1972 }, "https://github.com/Nourepide/ComfyUI-Allor": { - "stars": 169, - "last_update": "2024-05-22 18:11:17" + "stars": 170, + "last_update": "2024-05-22 18:11:17", + "author_account_age_days": 2834 }, "https://github.com/Nuked88/ComfyUI-N-Nodes": { - "stars": 166, - "last_update": "2024-05-21 19:52:44" + "stars": 169, + "last_update": "2024-05-21 19:52:44", + "author_account_age_days": 4468 }, "https://github.com/Nuked88/ComfyUI-N-Sidebar": { - "stars": 340, - "last_update": "2024-05-25 19:24:10" + "stars": 358, + "last_update": "2024-06-06 20:02:49", + "author_account_age_days": 4468 }, "https://github.com/Off-Live/ComfyUI-off-suite": { "stars": 0, - "last_update": "2024-04-19 07:13:08" + "last_update": "2024-04-19 07:13:08", + "author_account_age_days": 1160 }, "https://github.com/OpenArt-AI/ComfyUI-Assistant": { "stars": 14, - "last_update": "2024-05-22 22:16:57" + "last_update": "2024-05-22 22:16:57", + "author_account_age_days": 763 }, "https://github.com/PCMonsterx/ComfyUI-CSV-Loader": { "stars": 11, - "last_update": "2024-05-22 21:27:10" + "last_update": "2024-05-22 21:27:10", + "author_account_age_days": 1653 }, "https://github.com/ParisNeo/lollms_nodes_suite": { "stars": 9, - "last_update": "2024-05-23 00:22:34" + "last_update": "2024-05-23 00:22:34", + "author_account_age_days": 4758 }, "https://github.com/ParmanBabra/ComfyUI-Malefish-Custom-Scripts": { "stars": 0, - "last_update": "2024-05-22 21:26:35" + "last_update": "2024-05-22 21:26:35", + "author_account_age_days": 3631 }, "https://github.com/Pfaeff/pfaeff-comfyui": { "stars": 19, - "last_update": "2024-05-22 18:21:10" + "last_update": "2024-05-22 18:21:10", + "author_account_age_days": 3196 }, "https://github.com/PnthrLeo/comfyUI-image-search": { "stars": 0, - "last_update": "2024-06-01 09:50:50" + "last_update": "2024-06-01 09:50:50", + "author_account_age_days": 2540 }, "https://github.com/Pos13/comfyui-cyclist": { - "stars": 15, - "last_update": "2024-05-23 00:12:06" + "stars": 16, + "last_update": "2024-06-10 15:20:59", + "author_account_age_days": 1506 }, "https://github.com/QaisMalkawi/ComfyUI-QaisHelper": { "stars": 2, - "last_update": "2024-05-23 20:29:30" + "last_update": "2024-05-23 20:29:30", + "author_account_age_days": 1239 }, "https://github.com/RenderRift/ComfyUI-RenderRiftNodes": { "stars": 6, - "last_update": "2024-05-22 22:16:41" + "last_update": "2024-05-22 22:16:41", + "author_account_age_days": 175 }, "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control": { "stars": 15, - "last_update": "2024-05-05 09:22:26" + "last_update": "2024-05-05 09:22:26", + "author_account_age_days": 1370 }, "https://github.com/Ron-Digital/ComfyUI-SceneGenerator": { "stars": 2, - "last_update": "2024-05-28 18:02:38" + "last_update": "2024-06-11 07:01:17", + "author_account_age_days": 917 }, "https://github.com/Ryuukeisyou/comfyui_face_parsing": { - "stars": 33, - "last_update": "2024-05-22 22:21:46" + "stars": 42, + "last_update": "2024-05-22 22:21:46", + "author_account_age_days": 2401 }, "https://github.com/Ryuukeisyou/comfyui_io_helpers": { "stars": 1, - "last_update": "2024-05-22 22:22:59" + "last_update": "2024-05-22 22:22:59", + "author_account_age_days": 2401 }, "https://github.com/SLAPaper/ComfyUI-Image-Selector": { - "stars": 53, - "last_update": "2024-05-24 17:03:46" + "stars": 56, + "last_update": "2024-05-24 17:03:46", + "author_account_age_days": 3686 }, "https://github.com/SLAPaper/ComfyUI-dpmpp_2m_alt-Sampler": { - "stars": 5, - "last_update": "2024-04-25 07:58:30" + "stars": 7, + "last_update": "2024-06-09 18:30:03", + "author_account_age_days": 3686 }, "https://github.com/SOELexicon/ComfyUI-LexMSDBNodes": { "stars": 4, - "last_update": "2024-05-22 18:15:52" + "last_update": "2024-05-22 18:15:52", + "author_account_age_days": 4072 }, "https://github.com/SOELexicon/ComfyUI-LexTools": { - "stars": 22, - "last_update": "2024-05-23 09:39:07" + "stars": 23, + "last_update": "2024-05-23 09:39:07", + "author_account_age_days": 4072 }, "https://github.com/SayanoAI/Comfy-RVC": { - "stars": 1, - "last_update": "2024-06-01 18:44:48" + "stars": 2, + "last_update": "2024-06-12 02:54:21", + "author_account_age_days": 2592 }, "https://github.com/Scholar01/ComfyUI-Keyframe": { "stars": 10, - "last_update": "2024-02-01 16:57:40" + "last_update": "2024-02-01 16:57:40", + "author_account_age_days": 3184 + }, + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": { + "stars": 3, + "last_update": "2024-06-08 14:40:32", + "author_account_age_days": 1098 + }, + "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode": { + "stars": 1, + "last_update": "2024-06-12 22:48:48", + "author_account_age_days": 4494 }, "https://github.com/SeaArtLab/ComfyUI-Long-CLIP": { "stars": 49, - "last_update": "2024-04-29 02:27:15" + "last_update": "2024-04-29 02:27:15", + "author_account_age_days": 65 }, "https://github.com/SeargeDP/SeargeSDXL": { - "stars": 727, - "last_update": "2024-05-22 00:28:26" + "stars": 731, + "last_update": "2024-05-22 00:28:26", + "author_account_age_days": 4160 }, "https://github.com/Seedsa/Fooocus_Nodes": { - "stars": 32, - "last_update": "2024-05-29 11:52:10" + "stars": 34, + "last_update": "2024-06-03 17:13:53", + "author_account_age_days": 2596 }, "https://github.com/Shadetail/ComfyUI_Eagleshadow": { "stars": 1, - "last_update": "2024-05-21 16:37:38" - }, - "https://github.com/Shinsplat/ComfyUI-Shinsplat": { - "stars": 4, - "last_update": "2024-06-01 05:02:40" + "last_update": "2024-05-21 16:37:38", + "author_account_age_days": 3386 }, "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": { "stars": 1, - "last_update": "2024-03-08 15:16:10" + "last_update": "2024-03-08 15:16:10", + "author_account_age_days": 1193 }, "https://github.com/ShmuelRonen/ComfyUI_wav2lip": { - "stars": 23, - "last_update": "2024-05-21 14:49:10" + "stars": 39, + "last_update": "2024-06-05 08:21:09", + "author_account_age_days": 1193 }, "https://github.com/Shraknard/ComfyUI-Remover": { "stars": 4, - "last_update": "2024-05-22 23:15:06" + "last_update": "2024-05-22 23:15:06", + "author_account_age_days": 2305 }, "https://github.com/Siberpone/lazy-pony-prompter": { - "stars": 18, - "last_update": "2024-05-22 23:12:00" + "stars": 23, + "last_update": "2024-05-22 23:12:00", + "author_account_age_days": 441 }, "https://github.com/Smirnov75/ComfyUI-mxToolkit": { - "stars": 1, - "last_update": "2024-06-02 16:50:06" + "stars": 37, + "last_update": "2024-06-11 12:34:09", + "author_account_age_days": 1500 }, "https://github.com/SoftMeng/ComfyUI_ImageToText": { - "stars": 3, - "last_update": "2024-04-07 07:27:14" + "stars": 4, + "last_update": "2024-04-07 07:27:14", + "author_account_age_days": 3512 }, "https://github.com/SoftMeng/ComfyUI_Mexx_Poster": { "stars": 15, - "last_update": "2023-12-05 09:44:42" + "last_update": "2023-12-05 09:44:42", + "author_account_age_days": 3512 }, "https://github.com/SoftMeng/ComfyUI_Mexx_Styler": { "stars": 16, - "last_update": "2024-04-06 06:49:01" + "last_update": "2024-04-06 06:49:01", + "author_account_age_days": 3512 }, "https://github.com/Sorcerio/MBM-Music-Visualizer": { - "stars": 13, - "last_update": "2024-05-23 01:09:18" + "stars": 14, + "last_update": "2024-05-23 01:09:18", + "author_account_age_days": 4235 }, "https://github.com/SozeInc/ComfyUI-Mobile": { "stars": 0, - "last_update": "2024-05-31 01:31:51" + "last_update": "2024-05-31 01:31:51", + "author_account_age_days": 68 }, "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid": { "stars": 6, - "last_update": "2024-05-22 22:11:52" + "last_update": "2024-05-22 22:11:52", + "author_account_age_days": 196 }, "https://github.com/Stability-AI/ComfyUI-SAI_API": { - "stars": 36, - "last_update": "2024-05-23 05:09:39" + "stars": 37, + "last_update": "2024-06-06 14:18:15", + "author_account_age_days": 831 }, "https://github.com/Stability-AI/stability-ComfyUI-nodes": { - "stars": 175, - "last_update": "2024-05-22 15:30:47" + "stars": 179, + "last_update": "2024-05-22 15:30:47", + "author_account_age_days": 831 }, "https://github.com/StartHua/ComfyUI_OOTDiffusion_CXH": { - "stars": 87, - "last_update": "2024-03-04 09:33:57" + "stars": 89, + "last_update": "2024-03-04 09:33:57", + "author_account_age_days": 2823 }, "https://github.com/StartHua/ComfyUI_PCDMs": { "stars": 2, - "last_update": "2024-05-22 23:21:14" + "last_update": "2024-05-22 23:21:14", + "author_account_age_days": 2823 }, "https://github.com/StartHua/ComfyUI_Seg_VITON": { - "stars": 160, - "last_update": "2024-05-22 23:20:17" + "stars": 161, + "last_update": "2024-05-22 23:20:17", + "author_account_age_days": 2823 }, "https://github.com/StartHua/Comfyui_joytag": { - "stars": 15, - "last_update": "2024-05-22 23:20:28" + "stars": 17, + "last_update": "2024-05-22 23:20:28", + "author_account_age_days": 2823 }, "https://github.com/StartHua/Comfyui_segformer_b2_clothes": { - "stars": 33, - "last_update": "2024-05-22 23:20:39" + "stars": 35, + "last_update": "2024-05-22 23:20:39", + "author_account_age_days": 2823 }, "https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts": { - "stars": 93, - "last_update": "2024-06-01 20:27:53" + "stars": 95, + "last_update": "2024-06-01 20:27:53", + "author_account_age_days": 77 }, "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes": { - "stars": 445, - "last_update": "2024-06-02 11:07:52" + "stars": 460, + "last_update": "2024-06-05 01:09:25", + "author_account_age_days": 2138 }, "https://github.com/Sxela/ComfyWarp": { "stars": 21, - "last_update": "2024-05-22 20:47:11" + "last_update": "2024-05-22 20:47:11", + "author_account_age_days": 3360 }, "https://github.com/TGu-97/ComfyUI-TGu-utils": { "stars": 1, - "last_update": "2024-05-22 21:07:45" + "last_update": "2024-05-22 21:07:45", + "author_account_age_days": 518 }, "https://github.com/THtianhao/ComfyUI-FaceChain": { - "stars": 79, - "last_update": "2024-05-24 08:41:14" + "stars": 81, + "last_update": "2024-05-24 08:41:14", + "author_account_age_days": 3679 }, "https://github.com/THtianhao/ComfyUI-Portrait-Maker": { "stars": 166, - "last_update": "2024-05-22 21:18:05" + "last_update": "2024-05-22 21:18:05", + "author_account_age_days": 3679 }, "https://github.com/TJ16th/comfyUI_TJ_NormalLighting": { - "stars": 125, - "last_update": "2024-05-23 00:25:37" + "stars": 129, + "last_update": "2024-05-23 00:25:37", + "author_account_age_days": 2523 }, "https://github.com/TMElyralab/Comfyui-MusePose": { - "stars": 117, - "last_update": "2024-06-02 02:14:36" + "stars": 239, + "last_update": "2024-06-12 11:44:33", + "author_account_age_days": 85 }, "https://github.com/TRI3D-LC/tri3d-comfyui-nodes": { "stars": 16, - "last_update": "2024-05-30 06:46:34" + "last_update": "2024-06-12 13:00:22", + "author_account_age_days": 427 }, "https://github.com/TW-CUI/TW-CUI-Util": { "stars": 0, - "last_update": "2024-05-31 13:49:50" + "last_update": "2024-06-12 20:58:33", + "author_account_age_days": 19 }, "https://github.com/TaiTair/comfyui-simswap": { - "stars": 5, - "last_update": "2024-05-28 21:58:53" + "stars": 7, + "last_update": "2024-05-28 21:58:53", + "author_account_age_days": 3555 }, "https://github.com/Taremin/comfyui-prompt-extranetworks": { "stars": 2, - "last_update": "2024-05-22 23:08:34" + "last_update": "2024-05-22 23:08:34", + "author_account_age_days": 2203 }, "https://github.com/Taremin/comfyui-string-tools": { "stars": 1, - "last_update": "2024-05-22 23:08:45" + "last_update": "2024-05-22 23:08:45", + "author_account_age_days": 2203 }, "https://github.com/Taremin/webui-monaco-prompt": { "stars": 24, - "last_update": "2024-05-23 13:58:57" + "last_update": "2024-05-23 13:58:57", + "author_account_age_days": 2203 }, "https://github.com/TeaCrab/ComfyUI-TeaNodes": { "stars": 4, - "last_update": "2024-05-22 20:44:05" + "last_update": "2024-05-22 20:44:05", + "author_account_age_days": 3206 }, "https://github.com/TemryL/ComfyS3": { - "stars": 13, - "last_update": "2024-05-30 12:14:59" + "stars": 15, + "last_update": "2024-05-30 12:14:59", + "author_account_age_days": 857 }, "https://github.com/TemryL/ComfyUI-IDM-VTON": { - "stars": 148, - "last_update": "2024-05-30 12:21:57" + "stars": 180, + "last_update": "2024-05-30 12:21:57", + "author_account_age_days": 857 }, "https://github.com/TencentQQGYLab/ComfyUI-ELLA": { - "stars": 261, - "last_update": "2024-05-07 03:07:38" + "stars": 271, + "last_update": "2024-05-07 03:07:38", + "author_account_age_days": 86 }, "https://github.com/TheBarret/ZSuite": { "stars": 6, - "last_update": "2024-05-22 21:29:14" + "last_update": "2024-05-22 21:29:14", + "author_account_age_days": 2701 }, "https://github.com/TheBill2001/comfyui-upscale-by-model": { "stars": 0, - "last_update": "2024-02-24 00:49:19" + "last_update": "2024-02-24 00:49:19", + "author_account_age_days": 1430 }, "https://github.com/TheMistoAI/ComfyUI-Anyline": { - "stars": 224, - "last_update": "2024-05-23 05:12:45" + "stars": 252, + "last_update": "2024-06-12 11:34:17", + "author_account_age_days": 153 + }, + "https://github.com/ThereforeGames/ComfyUI-Unprompted": { + "stars": 2, + "last_update": "2024-06-08 04:39:40", + "author_account_age_days": 923 }, "https://github.com/TinyTerra/ComfyUI_tinyterraNodes": { - "stars": 302, - "last_update": "2024-06-02 10:02:07" + "stars": 311, + "last_update": "2024-06-07 08:13:31", + "author_account_age_days": 609 }, "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler": { - "stars": 16, - "last_update": "2024-05-22 22:13:06" + "stars": 18, + "last_update": "2024-05-22 22:13:06", + "author_account_age_days": 849 }, "https://github.com/Tropfchen/ComfyUI-Embedding_Picker": { "stars": 25, - "last_update": "2024-05-24 20:02:20" + "last_update": "2024-05-24 20:02:20", + "author_account_age_days": 3842 }, "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector": { "stars": 6, - "last_update": "2024-05-24 19:48:43" + "last_update": "2024-05-24 19:48:43", + "author_account_age_days": 3842 }, "https://github.com/Trung0246/ComfyUI-0246": { - "stars": 88, - "last_update": "2024-05-24 03:45:59" + "stars": 90, + "last_update": "2024-05-24 03:45:59", + "author_account_age_days": 3368 }, "https://github.com/Ttl/ComfyUi_NNLatentUpscale": { - "stars": 152, - "last_update": "2024-05-22 20:50:03" + "stars": 161, + "last_update": "2024-05-22 20:50:03", + "author_account_age_days": 4910 }, "https://github.com/Umikaze-job/select_folder_path_easy": { "stars": 4, - "last_update": "2024-05-22 21:30:13" + "last_update": "2024-05-22 21:30:13", + "author_account_age_days": 207 }, "https://github.com/VAST-AI-Research/ComfyUI-Tripo": { - "stars": 58, - "last_update": "2024-05-23 01:11:56" + "stars": 61, + "last_update": "2024-05-23 01:11:56", + "author_account_age_days": 230 }, "https://github.com/WASasquatch/ASTERR": { - "stars": 11, - "last_update": "2023-09-30 01:11:46" + "stars": 12, + "last_update": "2023-09-30 01:11:46", + "author_account_age_days": 4614 }, "https://github.com/WASasquatch/ComfyUI_Preset_Merger": { - "stars": 20, - "last_update": "2023-08-23 04:57:58" + "stars": 21, + "last_update": "2023-08-23 04:57:58", + "author_account_age_days": 4614 }, "https://github.com/WASasquatch/FreeU_Advanced": { - "stars": 93, - "last_update": "2024-03-05 15:36:38" + "stars": 94, + "last_update": "2024-03-05 15:36:38", + "author_account_age_days": 4614 }, "https://github.com/WASasquatch/PPF_Noise_ComfyUI": { "stars": 20, - "last_update": "2023-10-01 03:36:57" + "last_update": "2023-10-01 03:36:57", + "author_account_age_days": 4614 }, "https://github.com/WASasquatch/PowerNoiseSuite": { "stars": 52, - "last_update": "2023-09-19 17:04:01" + "last_update": "2023-09-19 17:04:01", + "author_account_age_days": 4614 }, "https://github.com/WASasquatch/WAS_Extras": { "stars": 23, - "last_update": "2023-11-20 17:14:58" + "last_update": "2023-11-20 17:14:58", + "author_account_age_days": 4614 }, "https://github.com/WASasquatch/was-node-suite-comfyui": { - "stars": 886, - "last_update": "2024-06-02 15:13:39" + "stars": 910, + "last_update": "2024-06-09 17:58:46", + "author_account_age_days": 4614 }, "https://github.com/WebDev9000/WebDev9000-Nodes": { "stars": 1, - "last_update": "2023-12-01 02:23:18" + "last_update": "2023-12-01 02:23:18", + "author_account_age_days": 3740 }, "https://github.com/Wicloz/ComfyUI-Simply-Nodes": { "stars": 1, - "last_update": "2024-04-11 01:32:57" + "last_update": "2024-04-11 01:32:57", + "author_account_age_days": 3632 }, "https://github.com/XmYx/deforum-comfy-nodes": { - "stars": 98, - "last_update": "2024-05-21 01:46:57" + "stars": 104, + "last_update": "2024-06-12 14:14:32", + "author_account_age_days": 2594 }, "https://github.com/Xyem/Xycuno-Oobabooga": { "stars": 3, - "last_update": "2024-05-23 00:14:14" + "last_update": "2024-05-23 00:14:14", + "author_account_age_days": 4313 }, "https://github.com/YMC-GitHub/ymc-node-suite-comfyui": { "stars": 16, - "last_update": "2024-05-22 21:15:51" + "last_update": "2024-05-22 21:15:51", + "author_account_age_days": 2683 }, "https://github.com/YOUR-WORST-TACO/ComfyUI-TacoNodes": { - "stars": 13, - "last_update": "2024-05-22 20:48:23" + "stars": 14, + "last_update": "2024-05-22 20:48:23", + "author_account_age_days": 3744 }, "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI": { "stars": 14, - "last_update": "2024-05-22 18:04:22" + "last_update": "2024-05-22 18:04:22", + "author_account_age_days": 774 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-APISR": { - "stars": 308, - "last_update": "2024-05-22 14:14:46" + "stars": 310, + "last_update": "2024-05-22 14:14:46", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Animated-optical-illusions": { - "stars": 0, - "last_update": "2024-06-02 16:41:54" + "stars": 17, + "last_update": "2024-06-02 17:00:07", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-ArtGallery": { - "stars": 318, - "last_update": "2024-05-22 08:53:46" + "stars": 343, + "last_update": "2024-06-12 04:40:50", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG": { - "stars": 536, - "last_update": "2024-05-22 14:14:18" + "stars": 545, + "last_update": "2024-05-22 14:14:18", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO": { - "stars": 130, - "last_update": "2024-05-22 14:14:31" + "stars": 135, + "last_update": "2024-05-22 14:14:31", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DepthFM": { - "stars": 66, - "last_update": "2024-05-22 14:14:03" + "stars": 67, + "last_update": "2024-05-22 14:14:03", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini": { - "stars": 568, - "last_update": "2024-05-22 14:15:11" + "stars": 578, + "last_update": "2024-05-22 14:15:11", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID": { - "stars": 1160, - "last_update": "2024-05-22 13:57:55" + "stars": 1179, + "last_update": "2024-05-22 13:57:55", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Phi-3-mini": { - "stars": 165, - "last_update": "2024-05-22 13:40:05" + "stars": 168, + "last_update": "2024-05-22 13:40:05", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO": { - "stars": 736, - "last_update": "2024-05-22 14:13:49" + "stars": 742, + "last_update": "2024-05-22 14:13:49", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PixArt-alpha-Diffusers": { "stars": 40, - "last_update": "2024-05-22 13:40:58" + "last_update": "2024-05-22 13:40:58", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Q-Align": { "stars": 3, - "last_update": "2024-05-22 14:15:52" + "last_update": "2024-05-22 14:15:52", + "author_account_age_days": 328 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2": { + "stars": 33, + "last_update": "2024-06-11 16:37:54", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": { "stars": 179, - "last_update": "2024-05-22 14:14:57" + "last_update": "2024-05-22 14:14:57", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO": { - "stars": 89, - "last_update": "2024-05-22 13:40:44" + "stars": 90, + "last_update": "2024-05-22 13:40:44", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE": { - "stars": 72, - "last_update": "2024-05-22 13:41:14" + "stars": 73, + "last_update": "2024-05-22 13:41:14", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Text_Image-Composite": { - "stars": 69, - "last_update": "2024-05-31 12:03:55" + "stars": 71, + "last_update": "2024-05-31 12:03:55", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM": { - "stars": 422, - "last_update": "2024-05-22 13:01:07" + "stars": 444, + "last_update": "2024-05-22 13:01:07", + "author_account_age_days": 328 }, "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn": { - "stars": 1418, - "last_update": "2024-04-17 19:57:18" + "stars": 1433, + "last_update": "2024-04-17 19:57:18", + "author_account_age_days": 328 }, "https://github.com/ZaneA/ComfyUI-ImageReward": { "stars": 22, - "last_update": "2024-02-04 23:38:10" + "last_update": "2024-02-04 23:38:10", + "author_account_age_days": 5528 }, "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools": { "stars": 1, - "last_update": "2024-05-23 01:19:25" + "last_update": "2024-05-23 01:19:25", + "author_account_age_days": 1182 }, "https://github.com/Zuellni/ComfyUI-Custom-Nodes": { - "stars": 43, - "last_update": "2023-09-19 12:11:26" + "stars": 44, + "last_update": "2023-09-19 12:11:26", + "author_account_age_days": 511 }, "https://github.com/Zuellni/ComfyUI-ExLlama": { - "stars": 89, - "last_update": "2024-05-17 20:55:36" + "stars": 96, + "last_update": "2024-06-05 07:53:12", + "author_account_age_days": 511 }, "https://github.com/Zuellni/ComfyUI-ExLlama-Nodes": { - "stars": 89, - "last_update": "2024-05-17 20:55:36" + "stars": 96, + "last_update": "2024-06-05 07:53:12", + "author_account_age_days": 511 }, "https://github.com/Zuellni/ComfyUI-PickScore-Nodes": { "stars": 21, - "last_update": "2024-05-22 18:07:53" + "last_update": "2024-05-22 18:07:53", + "author_account_age_days": 511 }, "https://github.com/a1lazydog/ComfyUI-AudioScheduler": { - "stars": 88, - "last_update": "2024-05-06 16:53:15" + "stars": 89, + "last_update": "2024-05-06 16:53:15", + "author_account_age_days": 4790 }, "https://github.com/aburahamu/ComfyUI-IsNiceParts": { "stars": 2, - "last_update": "2024-05-18 16:11:58" + "last_update": "2024-05-18 16:11:58", + "author_account_age_days": 61 }, "https://github.com/aburahamu/ComfyUI-RequestsPoster": { "stars": 2, - "last_update": "2024-05-18 16:11:21" + "last_update": "2024-05-18 16:11:21", + "author_account_age_days": 61 }, "https://github.com/abyz22/image_control": { - "stars": 7, - "last_update": "2024-05-22 23:10:07" + "stars": 14, + "last_update": "2024-05-22 23:10:07", + "author_account_age_days": 151 }, "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface": { "stars": 4, - "last_update": "2024-05-22 23:24:45" + "last_update": "2024-05-22 23:24:45", + "author_account_age_days": 692 }, "https://github.com/adieyal/comfyui-dynamicprompts": { - "stars": 171, - "last_update": "2024-02-05 06:55:50" + "stars": 174, + "last_update": "2024-02-05 06:55:50", + "author_account_age_days": 5005 }, "https://github.com/adriflex/ComfyUI_Blender_Texdiff": { "stars": 1, - "last_update": "2024-05-22 23:14:18" + "last_update": "2024-05-22 23:14:18", + "author_account_age_days": 2210 }, "https://github.com/aegis72/aegisflow_utility_nodes": { - "stars": 21, - "last_update": "2024-05-22 22:10:29" + "stars": 22, + "last_update": "2024-05-22 22:10:29", + "author_account_age_days": 572 }, "https://github.com/aegis72/comfyui-styles-all": { "stars": 28, - "last_update": "2024-05-22 22:10:41" + "last_update": "2024-05-22 22:10:41", + "author_account_age_days": 572 }, "https://github.com/ai-liam/comfyui-liam": { "stars": 2, - "last_update": "2024-05-22 22:21:34" + "last_update": "2024-06-11 03:14:52", + "author_account_age_days": 1509 }, "https://github.com/ai-liam/comfyui_liam_util": { "stars": 2, - "last_update": "2024-05-22 22:21:23" + "last_update": "2024-05-22 22:21:23", + "author_account_age_days": 1509 }, "https://github.com/aianimation55/ComfyUI-FatLabels": { "stars": 4, - "last_update": "2024-05-22 21:26:01" + "last_update": "2024-05-22 21:26:01", + "author_account_age_days": 262 }, "https://github.com/al-swaiti/ComfyUI-CascadeResolutions": { "stars": 1, - "last_update": "2024-04-06 16:48:55" + "last_update": "2024-04-06 16:48:55", + "author_account_age_days": 918 }, "https://github.com/alessandrozonta/ComfyUI-CenterNode": { "stars": 2, - "last_update": "2024-05-23 01:17:52" + "last_update": "2024-05-23 01:17:52", + "author_account_age_days": 1185 }, "https://github.com/alessandrozonta/ComfyUI-Layers": { "stars": 6, - "last_update": "2024-05-28 09:52:49" + "last_update": "2024-06-11 09:45:15", + "author_account_age_days": 1185 + }, + "https://github.com/alessandrozonta/ComfyUI-OpenPose": { + "stars": 1, + "last_update": "2024-06-10 14:55:52", + "author_account_age_days": 1185 }, "https://github.com/alexopus/ComfyUI-Image-Saver": { - "stars": 25, - "last_update": "2024-05-27 18:10:58" + "stars": 30, + "last_update": "2024-05-27 18:10:58", + "author_account_age_days": 2668 }, "https://github.com/ali1234/comfyui-job-iterator": { - "stars": 56, - "last_update": "2024-05-22 20:54:21" + "stars": 58, + "last_update": "2024-05-22 20:54:21", + "author_account_age_days": 4848 }, "https://github.com/alisson-anjos/ComfyUI-Ollama-Describer": { - "stars": 21, - "last_update": "2024-05-23 00:17:43" + "stars": 22, + "last_update": "2024-05-23 00:17:43", + "author_account_age_days": 589 }, "https://github.com/alpertunga-bile/prompt-generator-comfyui": { - "stars": 60, - "last_update": "2024-05-26 20:38:11" + "stars": 61, + "last_update": "2024-06-09 18:31:22", + "author_account_age_days": 1261 }, "https://github.com/alsritter/asymmetric-tiling-comfyui": { "stars": 14, - "last_update": "2024-05-22 20:43:07" + "last_update": "2024-05-22 20:43:07", + "author_account_age_days": 1982 }, "https://github.com/alt-key-project/comfyui-dream-project": { - "stars": 66, - "last_update": "2024-05-22 20:51:52" + "stars": 67, + "last_update": "2024-05-22 20:51:52", + "author_account_age_days": 648 }, "https://github.com/alt-key-project/comfyui-dream-video-batches": { - "stars": 48, - "last_update": "2024-05-22 20:52:05" + "stars": 50, + "last_update": "2024-05-22 20:52:05", + "author_account_age_days": 648 }, "https://github.com/an90ray/ComfyUI_RErouter_CustomNodes": { "stars": 0, - "last_update": "2024-05-22 22:21:00" + "last_update": "2024-05-22 22:21:00", + "author_account_age_days": 177 }, "https://github.com/andersxa/comfyui-PromptAttention": { "stars": 19, - "last_update": "2024-05-22 18:16:30" + "last_update": "2024-05-22 18:16:30", + "author_account_age_days": 2941 }, "https://github.com/angeloshredder/StableCascadeResizer": { "stars": 1, - "last_update": "2024-05-23 00:12:55" + "last_update": "2024-05-23 00:12:55", + "author_account_age_days": 1817 }, "https://github.com/ansonkao/comfyui-geometry": { "stars": 7, - "last_update": "2023-11-30 02:45:49" + "last_update": "2023-11-30 02:45:49", + "author_account_age_days": 334 }, "https://github.com/antrobot1234/antrobots-comfyUI-nodepack": { - "stars": 8, - "last_update": "2024-05-28 14:44:16" + "stars": 9, + "last_update": "2024-05-28 14:44:16", + "author_account_age_days": 2851 }, "https://github.com/aria1th/ComfyUI-LogicUtils": { - "stars": 18, - "last_update": "2024-05-23 01:27:16" + "stars": 19, + "last_update": "2024-05-23 01:27:16", + "author_account_age_days": 2333 }, "https://github.com/asagi4/ComfyUI-CADS": { "stars": 29, - "last_update": "2024-05-23 18:14:56" + "last_update": "2024-05-23 18:14:56", + "author_account_age_days": 429 }, "https://github.com/asagi4/comfyui-prompt-control": { - "stars": 148, - "last_update": "2024-05-26 13:32:54" + "stars": 154, + "last_update": "2024-06-05 17:20:01", + "author_account_age_days": 429 }, "https://github.com/asagi4/comfyui-utility-nodes": { "stars": 7, - "last_update": "2024-05-25 11:40:49" + "last_update": "2024-05-25 11:40:49", + "author_account_age_days": 429 }, "https://github.com/aszc-dev/ComfyUI-CoreMLSuite": { - "stars": 82, - "last_update": "2024-05-22 21:23:52" + "stars": 83, + "last_update": "2024-05-22 21:23:52", + "author_account_age_days": 2715 }, "https://github.com/atmaranto/ComfyUI-SaveAsScript": { - "stars": 35, - "last_update": "2024-05-23 22:59:27" + "stars": 37, + "last_update": "2024-05-23 22:59:27", + "author_account_age_days": 2337 }, "https://github.com/audioscavenger/ComfyUI-Thumbnails": { - "stars": 3, - "last_update": "2024-06-01 14:58:23" + "stars": 4, + "last_update": "2024-06-07 07:19:30", + "author_account_age_days": 4109 }, "https://github.com/audioscavenger/save-image-extended-comfyui": { - "stars": 7, - "last_update": "2024-06-01 20:35:08" + "stars": 12, + "last_update": "2024-06-06 18:41:09", + "author_account_age_days": 4109 }, "https://github.com/avatechai/avatar-graph-comfyui": { - "stars": 206, - "last_update": "2024-05-22 21:14:14" + "stars": 210, + "last_update": "2024-05-22 21:14:14", + "author_account_age_days": 842 }, "https://github.com/aws-samples/comfyui-llm-node-for-amazon-bedrock": { "stars": 4, - "last_update": "2024-05-22 23:13:13" + "last_update": "2024-06-12 15:04:39", + "author_account_age_days": 3547 }, "https://github.com/azure-dragon-ai/ComfyUI-ClipScore-Nodes": { "stars": 2, - "last_update": "2024-05-22 23:16:28" + "last_update": "2024-05-22 23:16:28", + "author_account_age_days": 289 }, "https://github.com/badayvedat/ComfyUI-fal-Connector": { - "stars": 10, - "last_update": "2024-05-23 01:23:54" + "stars": 11, + "last_update": "2024-06-12 11:33:44", + "author_account_age_days": 1759 }, "https://github.com/badjeff/comfyui_lora_tag_loader": { - "stars": 39, - "last_update": "2024-05-22 20:40:03" + "stars": 40, + "last_update": "2024-05-22 20:40:03", + "author_account_age_days": 5351 }, "https://github.com/banodoco/steerable-motion": { - "stars": 711, - "last_update": "2024-05-30 13:45:03" + "stars": 736, + "last_update": "2024-05-30 13:45:03", + "author_account_age_days": 390 }, "https://github.com/bash-j/mikey_nodes": { - "stars": 78, - "last_update": "2024-05-26 05:17:08" + "stars": 79, + "last_update": "2024-06-12 08:55:16", + "author_account_age_days": 4175 }, "https://github.com/bedovyy/ComfyUI_NAIDGenerator": { "stars": 17, - "last_update": "2024-03-13 09:36:48" + "last_update": "2024-03-13 09:36:48", + "author_account_age_days": 351 }, "https://github.com/bilal-arikan/ComfyUI_TextAssets": { "stars": 2, - "last_update": "2024-05-22 23:23:50" + "last_update": "2024-05-22 23:23:50", + "author_account_age_days": 3496 }, "https://github.com/bitaffinity/ComfyUI_HF_Inference": { "stars": 0, - "last_update": "2024-06-01 12:17:38" + "last_update": "2024-06-10 22:46:12", + "author_account_age_days": 45 }, "https://github.com/blepping/ComfyUI-bleh": { "stars": 30, - "last_update": "2024-05-22 23:17:49" + "last_update": "2024-05-22 23:17:49", + "author_account_age_days": 142 }, "https://github.com/blepping/ComfyUI-sonar": { - "stars": 30, - "last_update": "2024-05-22 23:18:26" + "stars": 31, + "last_update": "2024-05-22 23:18:26", + "author_account_age_days": 142 }, "https://github.com/blepping/comfyui_jankhidiffusion": { - "stars": 83, - "last_update": "2024-05-22 23:18:40" + "stars": 87, + "last_update": "2024-05-22 23:18:40", + "author_account_age_days": 142 }, "https://github.com/blueraincoatli/comfyUI_SillyNodes": { "stars": 2, - "last_update": "2024-05-23 01:13:44" + "last_update": "2024-06-09 13:30:57", + "author_account_age_days": 301 }, "https://github.com/bmad4ever/ComfyUI-Bmad-DirtyUndoRedo": { "stars": 50, - "last_update": "2024-05-22 18:11:51" + "last_update": "2024-05-22 18:11:51", + "author_account_age_days": 3525 }, "https://github.com/bmad4ever/comfyui_ab_samplercustom": { "stars": 5, - "last_update": "2024-05-22 18:12:18" + "last_update": "2024-05-22 18:12:18", + "author_account_age_days": 3525 }, "https://github.com/bmad4ever/comfyui_bmad_nodes": { - "stars": 41, - "last_update": "2024-05-22 18:12:03" + "stars": 43, + "last_update": "2024-06-12 23:18:04", + "author_account_age_days": 3525 }, "https://github.com/bmad4ever/comfyui_lists_cartesian_product": { "stars": 2, - "last_update": "2024-05-22 20:18:07" + "last_update": "2024-05-22 20:18:07", + "author_account_age_days": 3525 }, "https://github.com/bmad4ever/comfyui_quilting": { "stars": 3, - "last_update": "2024-05-24 23:10:54" + "last_update": "2024-05-24 23:10:54", + "author_account_age_days": 3525 }, "https://github.com/bmad4ever/comfyui_wfc_like": { - "stars": 3, - "last_update": "2024-05-30 16:30:28" + "stars": 5, + "last_update": "2024-06-02 23:06:37", + "author_account_age_days": 3525 }, "https://github.com/bobmagicii/comfykit-custom-nodes": { "stars": 1, - "last_update": "2024-05-24 00:53:46" + "last_update": "2024-06-04 20:04:00", + "author_account_age_days": 4733 }, "https://github.com/bradsec/ComfyUI_ResolutionSelector": { "stars": 7, - "last_update": "2024-05-22 20:44:31" + "last_update": "2024-05-22 20:44:31", + "author_account_age_days": 3644 }, "https://github.com/braintacles/braintacles-comfyui-nodes": { "stars": 1, - "last_update": "2024-05-23 06:06:16" + "last_update": "2024-05-23 06:06:16", + "author_account_age_days": 419 }, "https://github.com/brianfitzgerald/style_aligned_comfy": { - "stars": 247, - "last_update": "2024-05-30 14:23:40" + "stars": 245, + "last_update": "2024-05-30 14:23:40", + "author_account_age_days": 4228 }, "https://github.com/bronkula/comfyui-fitsize": { - "stars": 30, - "last_update": "2024-05-22 21:32:34" + "stars": 31, + "last_update": "2024-05-22 21:32:34", + "author_account_age_days": 5143 }, "https://github.com/bruefire/ComfyUI-SeqImageLoader": { - "stars": 25, - "last_update": "2024-05-22 22:08:38" + "stars": 28, + "last_update": "2024-06-08 15:48:49", + "author_account_age_days": 2354 }, "https://github.com/budihartono/comfyui_otonx_nodes": { "stars": 1, - "last_update": "2024-05-25 04:10:08" + "last_update": "2024-05-25 04:10:08", + "author_account_age_days": 4674 }, "https://github.com/bvhari/ComfyUI_ImageProcessing": { "stars": 16, - "last_update": "2024-05-22 18:08:40" + "last_update": "2024-05-22 18:08:40", + "author_account_age_days": 1163 }, "https://github.com/bvhari/ComfyUI_LatentToRGB": { "stars": 11, - "last_update": "2024-05-22 18:08:53" + "last_update": "2024-05-22 18:08:53", + "author_account_age_days": 1163 }, "https://github.com/bvhari/ComfyUI_PerpWeight": { "stars": 10, - "last_update": "2024-05-22 18:09:06" + "last_update": "2024-05-22 18:09:06", + "author_account_age_days": 1163 }, "https://github.com/bvhari/ComfyUI_SUNoise": { "stars": 3, - "last_update": "2024-05-22 18:09:19" + "last_update": "2024-05-22 18:09:19", + "author_account_age_days": 1163 }, "https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life": { - "stars": 14, - "last_update": "2024-05-23 00:09:32" + "stars": 17, + "last_update": "2024-05-23 00:09:32", + "author_account_age_days": 1193 }, "https://github.com/cdb-boop/comfyui-image-round": { "stars": 0, - "last_update": "2024-05-23 00:09:02" + "last_update": "2024-05-23 00:09:02", + "author_account_age_days": 1193 }, "https://github.com/cerspense/ComfyUI_cspnodes": { "stars": 24, - "last_update": "2024-05-15 05:27:11" + "last_update": "2024-05-15 05:27:11", + "author_account_age_days": 2670 }, "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner": { - "stars": 72, - "last_update": "2024-05-22 22:17:55" + "stars": 74, + "last_update": "2024-05-22 22:17:55", + "author_account_age_days": 1141 + }, + "https://github.com/chakib-belgaid/ComfyUI-autosize": { + "stars": 0, + "last_update": "2024-06-06 10:53:34", + "author_account_age_days": 3824 + }, + "https://github.com/chakib-belgaid/Comfyui_Prompt_styler": { + "stars": 0, + "last_update": "2024-06-04 13:38:55", + "author_account_age_days": 3824 }, "https://github.com/chandlergis/ComfyUI-IMG_Query": { "stars": 1, - "last_update": "2024-05-23 01:25:57" + "last_update": "2024-05-23 01:25:57", + "author_account_age_days": 344 + }, + "https://github.com/chandlergis/ComfyUI_EmojiOverlay": { + "stars": 0, + "last_update": "2024-06-05 10:03:17", + "author_account_age_days": 344 }, "https://github.com/chaojie/ComfyUI-AniPortrait": { - "stars": 223, - "last_update": "2024-05-22 22:26:03" + "stars": 226, + "last_update": "2024-05-22 22:26:03", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-CameraCtrl-Wrapper": { - "stars": 13, - "last_update": "2024-04-19 03:46:18" + "stars": 15, + "last_update": "2024-04-19 03:46:18", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Champ": { - "stars": 18, - "last_update": "2024-05-22 22:26:47" + "stars": 19, + "last_update": "2024-05-22 22:26:47", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-DragAnything": { - "stars": 64, - "last_update": "2024-05-16 07:13:53" + "stars": 66, + "last_update": "2024-05-16 07:13:53", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-DragNUWA": { - "stars": 354, - "last_update": "2024-03-14 06:56:41" + "stars": 357, + "last_update": "2024-03-14 06:56:41", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-DynamiCrafter": { - "stars": 103, - "last_update": "2024-03-16 19:08:28" + "stars": 108, + "last_update": "2024-03-16 19:08:28", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-EasyAnimate": { - "stars": 37, - "last_update": "2024-05-22 22:24:00" + "stars": 38, + "last_update": "2024-05-22 22:24:00", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Gemma": { "stars": 5, - "last_update": "2024-05-22 22:27:47" + "last_update": "2024-05-22 22:27:47", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-I2VGEN-XL": { "stars": 27, - "last_update": "2024-01-19 09:02:08" + "last_update": "2024-01-19 09:02:08", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Img2Img-Turbo": { "stars": 36, - "last_update": "2024-05-22 22:26:30" + "last_update": "2024-05-22 22:26:30", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-LaVIT": { "stars": 8, - "last_update": "2024-04-24 13:41:02" + "last_update": "2024-04-24 13:41:02", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-LightGlue": { "stars": 48, - "last_update": "2024-01-20 16:53:51" + "last_update": "2024-01-20 16:53:51", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": { "stars": 199, - "last_update": "2024-02-24 13:48:57" + "last_update": "2024-06-10 20:16:06", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor": { "stars": 0, - "last_update": "2024-01-20 16:51:06" + "last_update": "2024-01-20 16:51:06", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-MotionCtrl": { - "stars": 121, - "last_update": "2024-01-08 14:18:40" + "stars": 123, + "last_update": "2024-01-08 14:18:40", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD": { - "stars": 77, - "last_update": "2024-01-16 09:41:07" + "stars": 78, + "last_update": "2024-01-16 09:41:07", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-MuseTalk": { - "stars": 124, - "last_update": "2024-05-22 22:25:07" + "stars": 134, + "last_update": "2024-05-22 22:25:07", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-MuseV": { - "stars": 114, - "last_update": "2024-05-22 22:25:31" + "stars": 119, + "last_update": "2024-05-22 22:25:31", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Open-Sora": { - "stars": 84, - "last_update": "2024-05-22 22:26:59" + "stars": 86, + "last_update": "2024-05-22 22:26:59", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Open-Sora-Plan": { - "stars": 46, - "last_update": "2024-05-29 16:15:10" + "stars": 47, + "last_update": "2024-05-29 16:15:10", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Panda3d": { "stars": 13, - "last_update": "2024-03-05 06:37:32" + "last_update": "2024-03-05 06:37:32", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Pymunk": { "stars": 16, - "last_update": "2024-01-31 15:36:36" + "last_update": "2024-01-31 15:36:36", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-RAFT": { - "stars": 24, - "last_update": "2024-01-29 08:08:13" + "stars": 25, + "last_update": "2024-01-29 08:08:13", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-SimDA": { "stars": 13, - "last_update": "2024-04-25 03:38:51" + "last_update": "2024-04-25 03:38:51", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Trajectory": { "stars": 5, - "last_update": "2024-05-22 22:27:12" + "last_update": "2024-05-22 22:27:12", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-Video-Editing-X-Attention": { "stars": 17, - "last_update": "2024-05-08 00:59:14" + "last_update": "2024-05-08 00:59:14", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI-dust3r": { "stars": 14, - "last_update": "2024-05-22 22:27:33" + "last_update": "2024-05-22 22:27:33", + "author_account_age_days": 4822 }, "https://github.com/chaojie/ComfyUI_StreamingT2V": { - "stars": 22, - "last_update": "2024-05-10 09:14:57" + "stars": 23, + "last_update": "2024-05-10 09:14:57", + "author_account_age_days": 4822 }, "https://github.com/chaosaiart/Chaosaiart-Nodes": { - "stars": 43, - "last_update": "2024-05-27 10:55:18" + "stars": 46, + "last_update": "2024-05-27 10:55:18", + "author_account_age_days": 322 }, "https://github.com/chenpx976/ComfyUI-RunRunRun": { "stars": 0, - "last_update": "2024-05-23 01:19:37" + "last_update": "2024-05-23 01:19:37", + "author_account_age_days": 3403 }, "https://github.com/chesnokovivan/ComfyUI-Novakid": { "stars": 0, - "last_update": "2024-05-30 11:36:25" + "last_update": "2024-06-10 20:15:56", + "author_account_age_days": 1518 }, "https://github.com/chflame163/ComfyUI_FaceSimilarity": { - "stars": 5, - "last_update": "2024-05-23 12:48:18" + "stars": 6, + "last_update": "2024-05-23 12:48:18", + "author_account_age_days": 432 }, "https://github.com/chflame163/ComfyUI_LayerStyle": { - "stars": 552, - "last_update": "2024-05-30 01:54:23" + "stars": 590, + "last_update": "2024-06-12 12:49:05", + "author_account_age_days": 432 }, "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": { - "stars": 20, - "last_update": "2024-05-25 02:39:56" + "stars": 22, + "last_update": "2024-05-25 02:39:56", + "author_account_age_days": 432 }, "https://github.com/chflame163/ComfyUI_WordCloud": { - "stars": 59, - "last_update": "2024-05-25 02:41:06" + "stars": 60, + "last_update": "2024-05-25 02:41:06", + "author_account_age_days": 432 }, "https://github.com/chibiace/ComfyUI-Chibi-Nodes": { - "stars": 25, - "last_update": "2024-05-22 21:16:12" + "stars": 26, + "last_update": "2024-05-22 21:16:12", + "author_account_age_days": 2837 }, "https://github.com/choey/Comfy-Topaz": { - "stars": 16, - "last_update": "2024-04-10 09:05:18" + "stars": 19, + "last_update": "2024-04-10 09:05:18", + "author_account_age_days": 5511 }, "https://github.com/chrisfreilich/virtuoso-nodes": { - "stars": 39, - "last_update": "2024-05-23 01:15:43" + "stars": 42, + "last_update": "2024-05-23 01:15:43", + "author_account_age_days": 720 }, "https://github.com/chrisgoringe/cg-image-picker": { - "stars": 159, - "last_update": "2024-06-01 23:07:44" + "stars": 166, + "last_update": "2024-06-12 18:50:30", + "author_account_age_days": 4053 }, "https://github.com/chrisgoringe/cg-noise": { "stars": 23, - "last_update": "2024-02-02 23:38:25" + "last_update": "2024-06-09 11:46:04", + "author_account_age_days": 4053 }, "https://github.com/chrisgoringe/cg-prompt-info": { "stars": 24, - "last_update": "2024-05-22 21:07:33" + "last_update": "2024-05-22 21:07:33", + "author_account_age_days": 4053 }, "https://github.com/chrisgoringe/cg-use-everywhere": { - "stars": 311, - "last_update": "2024-05-20 00:48:27" + "stars": 323, + "last_update": "2024-06-06 05:23:41", + "author_account_age_days": 4053 }, "https://github.com/chrish-slingshot/CrasHUtils": { "stars": 11, - "last_update": "2024-05-22 21:15:25" + "last_update": "2024-05-22 21:15:25", + "author_account_age_days": 589 }, "https://github.com/christian-byrne/img2colors-comfyui-node": { "stars": 1, - "last_update": "2024-05-25 03:14:52" + "last_update": "2024-05-25 03:14:52", + "author_account_age_days": 1337 }, "https://github.com/christian-byrne/img2txt-comfyui-nodes": { - "stars": 18, - "last_update": "2024-05-28 14:02:16" + "stars": 22, + "last_update": "2024-05-28 14:02:16", + "author_account_age_days": 1337 }, "https://github.com/christian-byrne/size-match-compositing-nodes": { "stars": 2, - "last_update": "2024-06-01 05:49:27" + "last_update": "2024-06-01 05:49:27", + "author_account_age_days": 1337 }, "https://github.com/city96/ComfyUI_ColorMod": { - "stars": 35, - "last_update": "2024-05-22 18:06:19" + "stars": 38, + "last_update": "2024-05-22 18:06:19", + "author_account_age_days": 486 }, "https://github.com/city96/ComfyUI_DiT": { "stars": 2, - "last_update": "2024-05-22 18:06:05" + "last_update": "2024-05-22 18:06:05", + "author_account_age_days": 486 }, "https://github.com/city96/ComfyUI_ExtraModels": { - "stars": 225, - "last_update": "2024-05-31 19:56:58" + "stars": 249, + "last_update": "2024-06-11 23:04:32", + "author_account_age_days": 486 }, "https://github.com/city96/ComfyUI_NetDist": { - "stars": 207, - "last_update": "2024-05-22 18:05:10" + "stars": 214, + "last_update": "2024-05-22 18:05:10", + "author_account_age_days": 486 }, "https://github.com/city96/SD-Advanced-Noise": { - "stars": 17, - "last_update": "2024-05-22 18:05:35" + "stars": 18, + "last_update": "2024-05-22 18:05:35", + "author_account_age_days": 486 }, "https://github.com/city96/SD-Latent-Interposer": { - "stars": 159, - "last_update": "2024-05-22 18:05:22" + "stars": 162, + "last_update": "2024-05-22 18:05:22", + "author_account_age_days": 486 }, "https://github.com/city96/SD-Latent-Upscaler": { - "stars": 107, - "last_update": "2024-05-22 18:05:50" + "stars": 111, + "last_update": "2024-05-22 18:05:50", + "author_account_age_days": 486 }, "https://github.com/civitai/comfy-nodes": { - "stars": 79, - "last_update": "2024-02-29 12:23:11" + "stars": 85, + "last_update": "2024-06-09 17:54:31", + "author_account_age_days": 587 }, "https://github.com/claussteinmassl/ComfyUI-CS-CustomNodes": { "stars": 1, - "last_update": "2024-05-31 12:03:35" + "last_update": "2024-05-31 12:03:35", + "author_account_age_days": 2689 }, "https://github.com/comfyanonymous/ComfyUI": { - "stars": 36477, - "last_update": "2024-06-02 13:15:20" + "stars": 37555, + "last_update": "2024-06-12 19:22:16", + "author_account_age_days": 537 + }, + "https://github.com/comfyanonymous/ComfyUI_TensorRT": { + "stars": 227, + "last_update": "2024-06-12 11:23:12", + "author_account_age_days": 537 }, "https://github.com/comfyanonymous/ComfyUI_experiments": { - "stars": 127, - "last_update": "2024-05-22 15:29:49" + "stars": 132, + "last_update": "2024-05-22 15:29:49", + "author_account_age_days": 537 }, "https://github.com/concarne000/ConCarneNode": { "stars": 4, - "last_update": "2024-05-22 22:10:18" + "last_update": "2024-05-22 22:10:18", + "author_account_age_days": 1889 }, "https://github.com/conquestace/ComfyUI-ImageUploader": { "stars": 0, - "last_update": "2024-05-23 01:25:49" + "last_update": "2024-05-23 01:25:49", + "author_account_age_days": 4597 + }, + "https://github.com/coolzilj/ComfyUI-LJNodes": { + "stars": 37, + "last_update": "2024-06-11 10:52:32", + "author_account_age_days": 4651 }, "https://github.com/coolzilj/ComfyUI-Photopea": { - "stars": 36, - "last_update": "2024-06-02 14:33:26" + "stars": 51, + "last_update": "2024-06-03 04:57:52", + "author_account_age_days": 4651 }, "https://github.com/coreyryanhanson/ComfyQR": { "stars": 50, - "last_update": "2024-03-20 20:10:27" + "last_update": "2024-03-20 20:10:27", + "author_account_age_days": 3044 }, "https://github.com/coreyryanhanson/ComfyQR-scanning-nodes": { "stars": 8, - "last_update": "2023-10-15 03:19:16" + "last_update": "2023-10-15 03:19:16", + "author_account_age_days": 3044 }, "https://github.com/cozymantis/cozy-utils-comfyui-nodes": { "stars": 3, - "last_update": "2024-05-23 00:10:45" + "last_update": "2024-05-23 00:10:45", + "author_account_age_days": 97 }, "https://github.com/cozymantis/human-parser-comfyui-node": { - "stars": 40, - "last_update": "2024-05-23 00:10:21" + "stars": 45, + "last_update": "2024-05-23 00:10:21", + "author_account_age_days": 97 }, "https://github.com/cozymantis/pose-generator-comfyui-node": { - "stars": 25, - "last_update": "2024-05-23 00:10:33" + "stars": 26, + "last_update": "2024-05-23 00:10:33", + "author_account_age_days": 97 }, "https://github.com/crystian/ComfyUI-Crystools": { - "stars": 434, - "last_update": "2024-05-21 00:37:08" + "stars": 451, + "last_update": "2024-06-07 04:43:29", + "author_account_age_days": 4105 }, "https://github.com/crystian/ComfyUI-Crystools-save": { - "stars": 26, - "last_update": "2024-05-22 22:20:15" + "stars": 29, + "last_update": "2024-05-22 22:20:15", + "author_account_age_days": 4105 }, "https://github.com/cubiq/ComfyUI_FaceAnalysis": { - "stars": 193, - "last_update": "2024-05-29 20:20:36" + "stars": 203, + "last_update": "2024-05-29 20:20:36", + "author_account_age_days": 4999 }, "https://github.com/cubiq/ComfyUI_IPAdapter_plus": { - "stars": 2823, - "last_update": "2024-05-30 15:38:17" + "stars": 2928, + "last_update": "2024-06-09 10:11:42", + "author_account_age_days": 4999 }, "https://github.com/cubiq/ComfyUI_InstantID": { - "stars": 851, - "last_update": "2024-05-08 14:56:00" + "stars": 873, + "last_update": "2024-05-08 14:56:00", + "author_account_age_days": 4999 }, "https://github.com/cubiq/ComfyUI_SimpleMath": { - "stars": 11, - "last_update": "2023-09-26 06:31:44" + "stars": 12, + "last_update": "2023-09-26 06:31:44", + "author_account_age_days": 4999 }, "https://github.com/cubiq/ComfyUI_essentials": { - "stars": 280, - "last_update": "2024-05-29 10:34:38" + "stars": 308, + "last_update": "2024-06-10 13:26:34", + "author_account_age_days": 4999 }, "https://github.com/cubiq/PuLID_ComfyUI": { - "stars": 369, - "last_update": "2024-05-26 17:23:56" + "stars": 386, + "last_update": "2024-05-26 17:23:56", + "author_account_age_days": 4999 }, "https://github.com/cuongloveit/comfy_http_request": { "stars": 0, - "last_update": "2024-05-28 08:58:59" + "last_update": "2024-05-28 08:58:59", + "author_account_age_days": 3240 }, "https://github.com/curiousjp/ComfyUI-MaskBatchPermutations": { "stars": 3, - "last_update": "2024-05-28 13:09:32" + "last_update": "2024-05-28 13:09:32", + "author_account_age_days": 1918 }, "https://github.com/czcz1024/Comfyui-FaceCompare": { "stars": 0, - "last_update": "2024-02-23 09:08:32" + "last_update": "2024-02-23 09:08:32", + "author_account_age_days": 4222 }, "https://github.com/da2el-ai/ComfyUI-d2-size-selector": { "stars": 1, - "last_update": "2024-05-23 01:16:17" + "last_update": "2024-05-23 01:16:17", + "author_account_age_days": 378 }, "https://github.com/da2el-ai/ComfyUI-d2-steps": { "stars": 4, - "last_update": "2024-05-23 01:16:06" + "last_update": "2024-05-23 01:16:06", + "author_account_age_days": 378 }, "https://github.com/dagthomas/comfyui_dagthomas": { - "stars": 62, - "last_update": "2024-05-23 08:41:09" + "stars": 64, + "last_update": "2024-05-23 08:41:09", + "author_account_age_days": 4060 }, "https://github.com/daniabib/ComfyUI_ProPainter_Nodes": { - "stars": 122, - "last_update": "2024-05-25 15:14:53" + "stars": 138, + "last_update": "2024-05-25 15:14:53", + "author_account_age_days": 2393 }, "https://github.com/daniel-lewis-ab/ComfyUI-Llama": { "stars": 25, - "last_update": "2024-04-02 06:33:08" + "last_update": "2024-04-02 06:33:08", + "author_account_age_days": 3340 }, "https://github.com/daniel-lewis-ab/ComfyUI-TTS": { "stars": 11, - "last_update": "2024-04-02 06:32:21" + "last_update": "2024-04-02 06:32:21", + "author_account_age_days": 3340 }, "https://github.com/darkpixel/darkprompts": { - "stars": 5, - "last_update": "2024-05-23 19:48:02" - }, - "https://github.com/davask/ComfyUI_MaraScott_Nodes": { - "stars": 48, - "last_update": "2024-05-31 23:45:29" + "stars": 6, + "last_update": "2024-05-23 19:48:02", + "author_account_age_days": 5312 }, "https://github.com/dave-palt/comfyui_DSP_imagehelpers": { "stars": 0, - "last_update": "2024-05-22 23:12:11" + "last_update": "2024-05-22 23:12:11", + "author_account_age_days": 146 }, "https://github.com/daxcay/ComfyUI-DRMN": { - "stars": 5, - "last_update": "2024-05-29 15:39:05" + "stars": 8, + "last_update": "2024-06-12 08:27:53", + "author_account_age_days": 83 }, "https://github.com/daxcay/ComfyUI-JDCN": { - "stars": 49, - "last_update": "2024-05-24 06:27:36" + "stars": 51, + "last_update": "2024-06-09 14:25:27", + "author_account_age_days": 83 + }, + "https://github.com/daxcay/ComfyUI-NODEJS": { + "stars": 4, + "last_update": "2024-06-06 04:30:30", + "author_account_age_days": 83 }, "https://github.com/daxthin/DZ-FaceDetailer": { - "stars": 96, - "last_update": "2023-12-16 17:31:44" + "stars": 99, + "last_update": "2023-12-16 17:31:44", + "author_account_age_days": 1219 }, "https://github.com/dchatel/comfyui_facetools": { - "stars": 40, - "last_update": "2024-05-31 10:40:32" + "stars": 41, + "last_update": "2024-05-31 10:40:32", + "author_account_age_days": 4524 + }, + "https://github.com/denfrost/Den_ComfyUI_Workflow": { + "stars": 1, + "last_update": "2024-06-10 07:46:16", + "author_account_age_days": 3485 }, "https://github.com/deroberon/StableZero123-comfyui": { - "stars": 131, - "last_update": "2024-05-22 22:09:53" + "stars": 132, + "last_update": "2024-05-22 22:09:53", + "author_account_age_days": 5284 }, "https://github.com/deroberon/demofusion-comfyui": { "stars": 83, - "last_update": "2024-05-22 22:09:42" + "last_update": "2024-05-22 22:09:42", + "author_account_age_days": 5284 }, "https://github.com/dfl/comfyui-clip-with-break": { - "stars": 8, - "last_update": "2024-05-22 23:23:15" + "stars": 9, + "last_update": "2024-05-22 23:23:15", + "author_account_age_days": 5963 }, "https://github.com/dfl/comfyui-tcd-scheduler": { "stars": 75, - "last_update": "2024-05-22 23:23:28" + "last_update": "2024-05-22 23:23:28", + "author_account_age_days": 5963 }, "https://github.com/diStyApps/ComfyUI_FrameMaker": { "stars": 10, - "last_update": "2024-05-23 00:11:33" + "last_update": "2024-05-23 00:11:33", + "author_account_age_days": 4193 }, "https://github.com/digitaljohn/comfyui-propost": { - "stars": 99, - "last_update": "2024-05-22 23:24:19" + "stars": 101, + "last_update": "2024-05-22 23:24:19", + "author_account_age_days": 4506 }, "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector": { - "stars": 158, - "last_update": "2024-01-07 03:29:57" + "stars": 160, + "last_update": "2024-01-07 03:29:57", + "author_account_age_days": 3403 }, "https://github.com/diontimmer/ComfyUI-Vextra-Nodes": { - "stars": 59, - "last_update": "2024-05-22 17:55:21" + "stars": 60, + "last_update": "2024-05-22 17:55:21", + "author_account_age_days": 4759 }, "https://github.com/discopixel-studio/comfyui-discopixel": { "stars": 7, - "last_update": "2023-11-30 02:45:49" + "last_update": "2023-11-30 02:45:49", + "author_account_age_days": 334 }, "https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5": { "stars": 3, - "last_update": "2024-05-28 14:04:29" + "last_update": "2024-05-28 14:04:29", + "author_account_age_days": 1458 }, "https://github.com/discus0434/comfyui-caching-embeddings": { "stars": 1, - "last_update": "2024-04-09 03:52:05" + "last_update": "2024-04-09 03:52:05", + "author_account_age_days": 1458 }, "https://github.com/djbielejeski/a-person-mask-generator": { - "stars": 220, - "last_update": "2024-05-27 13:54:56" + "stars": 225, + "last_update": "2024-05-27 13:54:56", + "author_account_age_days": 4272 }, "https://github.com/dmMaze/sketch2manga": { - "stars": 24, - "last_update": "2024-05-23 00:14:41" + "stars": 23, + "last_update": "2024-05-23 00:14:41", + "author_account_age_days": 1838 }, "https://github.com/dmarx/ComfyUI-AudioReactive": { "stars": 10, - "last_update": "2024-05-22 22:12:53" + "last_update": "2024-05-22 22:12:53", + "author_account_age_days": 4493 }, "https://github.com/dmarx/ComfyUI-Keyframed": { "stars": 81, - "last_update": "2024-05-22 22:12:50" + "last_update": "2024-05-22 22:12:50", + "author_account_age_days": 4493 }, "https://github.com/drago87/ComfyUI_Dragos_Nodes": { "stars": 3, - "last_update": "2024-05-22 21:32:15" + "last_update": "2024-05-22 21:32:15", + "author_account_age_days": 3758 }, "https://github.com/drustan-hawk/primitive-types": { "stars": 5, - "last_update": "2024-05-22 21:23:12" + "last_update": "2024-05-22 21:23:12", + "author_account_age_days": 277 }, "https://github.com/e7mac/ComfyUI-ShadertoyGL": { "stars": 2, - "last_update": "2024-05-23 01:09:41" + "last_update": "2024-05-23 01:09:41", + "author_account_age_days": 4792 }, "https://github.com/ealkanat/comfyui_easy_padding": { "stars": 12, - "last_update": "2024-05-22 21:58:52" + "last_update": "2024-05-22 21:58:52", + "author_account_age_days": 2451 }, "https://github.com/edenartlab/eden_comfy_pipelines": { - "stars": 37, - "last_update": "2024-05-31 12:20:25" + "stars": 39, + "last_update": "2024-06-06 21:49:00", + "author_account_age_days": 261 }, "https://github.com/evanspearman/ComfyMath": { - "stars": 48, - "last_update": "2023-08-27 03:29:04" + "stars": 50, + "last_update": "2023-08-27 03:29:04", + "author_account_age_days": 4227 + }, + "https://github.com/exdysa/comfyui-selector": { + "stars": 1, + "last_update": "2024-06-10 05:05:28", + "author_account_age_days": 984 }, "https://github.com/failfa-st/failfast-comfyui-extensions": { - "stars": 124, - "last_update": "2024-05-09 19:24:22" + "stars": 126, + "last_update": "2024-05-09 19:24:22", + "author_account_age_days": 262 }, "https://github.com/fexli/fexli-util-node-comfyui": { "stars": 3, - "last_update": "2024-05-22 21:27:36" + "last_update": "2024-05-22 21:27:36", + "author_account_age_days": 1547 }, "https://github.com/fexploit/ComfyUI-AutoLabel": { - "stars": 3, - "last_update": "2024-05-25 19:54:58" + "stars": 4, + "last_update": "2024-05-25 19:54:58", + "author_account_age_days": 5032 }, "https://github.com/fexploit/ComfyUI-AutoTrimBG": { "stars": 2, - "last_update": "2024-05-24 20:38:15" + "last_update": "2024-05-24 20:38:15", + "author_account_age_days": 5032 + }, + "https://github.com/fexploit/ComfyUI-Classifier": { + "stars": 0, + "last_update": "2024-06-02 20:27:12", + "author_account_age_days": 5032 }, "https://github.com/filipemeneses/comfy_pixelization": { - "stars": 26, - "last_update": "2024-05-22 20:59:16" + "stars": 27, + "last_update": "2024-05-22 20:59:16", + "author_account_age_days": 3465 }, "https://github.com/filliptm/ComfyUI_Fill-Nodes": { - "stars": 71, - "last_update": "2024-05-29 19:38:26" + "stars": 91, + "last_update": "2024-06-09 08:42:25", + "author_account_age_days": 1724 }, "https://github.com/florestefano1975/ComfyUI-HiDiffusion": { - "stars": 126, - "last_update": "2024-05-22 00:33:06" + "stars": 127, + "last_update": "2024-05-22 00:33:06", + "author_account_age_days": 182 }, "https://github.com/florestefano1975/ComfyUI-StabilityAI-Suite": { "stars": 2, - "last_update": "2024-04-21 07:34:21" + "last_update": "2024-04-21 07:34:21", + "author_account_age_days": 182 }, "https://github.com/florestefano1975/comfyui-portrait-master": { - "stars": 721, - "last_update": "2024-05-22 00:30:41" + "stars": 736, + "last_update": "2024-05-22 00:30:41", + "author_account_age_days": 182 }, "https://github.com/florestefano1975/comfyui-prompt-composer": { - "stars": 205, - "last_update": "2024-05-22 00:34:06" + "stars": 207, + "last_update": "2024-05-22 00:34:06", + "author_account_age_days": 182 }, "https://github.com/flowtyone/ComfyUI-Flowty-CRM": { - "stars": 120, - "last_update": "2024-04-03 23:47:03" + "stars": 122, + "last_update": "2024-04-03 23:47:03", + "author_account_age_days": 262 }, "https://github.com/flowtyone/ComfyUI-Flowty-LDSR": { - "stars": 155, - "last_update": "2024-03-24 19:03:45" + "stars": 161, + "last_update": "2024-03-24 19:03:45", + "author_account_age_days": 262 }, "https://github.com/flowtyone/ComfyUI-Flowty-TripoSR": { - "stars": 346, - "last_update": "2024-03-19 10:49:59" + "stars": 348, + "last_update": "2024-06-06 06:01:32", + "author_account_age_days": 262 }, "https://github.com/flyingshutter/As_ComfyUI_CustomNodes": { "stars": 7, - "last_update": "2024-05-22 18:07:19" + "last_update": "2024-05-22 18:07:19", + "author_account_age_days": 3483 }, "https://github.com/fmatray/ComfyUI_BattlemapGrid": { "stars": 0, - "last_update": "2024-05-23 01:22:12" + "last_update": "2024-06-05 22:35:06", + "author_account_age_days": 3610 }, "https://github.com/fofr/ComfyUI-HyperSDXL1StepUnetScheduler": { "stars": 10, - "last_update": "2024-05-23 01:15:32" + "last_update": "2024-05-23 01:15:32", + "author_account_age_days": 5096 }, "https://github.com/forever22777/comfyui-self-guidance": { "stars": 6, - "last_update": "2024-04-22 06:40:09" + "last_update": "2024-04-22 06:40:09", + "author_account_age_days": 313 }, "https://github.com/foxtrot-roger/comfyui-rf-nodes": { "stars": 1, - "last_update": "2024-05-22 23:09:13" + "last_update": "2024-05-22 23:09:13", + "author_account_age_days": 2309 }, "https://github.com/frankchieng/ComfyUI_Aniportrait": { - "stars": 38, - "last_update": "2024-05-23 00:23:20" + "stars": 41, + "last_update": "2024-05-23 00:23:20", + "author_account_age_days": 429 }, "https://github.com/frankchieng/ComfyUI_MagicClothing": { - "stars": 382, - "last_update": "2024-05-23 00:23:32" + "stars": 398, + "last_update": "2024-05-23 00:23:32", + "author_account_age_days": 429 + }, + "https://github.com/frankchieng/ComfyUI_llm_easyanimiate": { + "stars": 7, + "last_update": "2024-06-06 08:18:29", + "author_account_age_days": 429 }, "https://github.com/fsdymy1024/ComfyUI_fsdymy": { - "stars": 1, - "last_update": "2024-05-23 01:21:16" + "stars": 2, + "last_update": "2024-05-23 01:21:16", + "author_account_age_days": 2194 }, "https://github.com/gemell1/ComfyUI_GMIC": { "stars": 5, - "last_update": "2024-05-22 21:28:51" + "last_update": "2024-05-22 21:28:51", + "author_account_age_days": 1945 }, "https://github.com/get-salt-AI/SaltAI": { - "stars": 45, - "last_update": "2024-05-23 00:54:46" + "stars": 48, + "last_update": "2024-05-23 00:54:46", + "author_account_age_days": 104 }, "https://github.com/get-salt-AI/SaltAI_Language_Toolkit": { - "stars": 11, - "last_update": "2024-05-23 00:54:34" + "stars": 15, + "last_update": "2024-05-23 00:54:34", + "author_account_age_days": 104 }, "https://github.com/get-salt-AI/SaltAI_LlamaIndex": { - "stars": 11, - "last_update": "2024-05-23 00:54:34" + "stars": 15, + "last_update": "2024-05-23 00:54:34", + "author_account_age_days": 104 }, "https://github.com/ginlov/segment_to_mask_comfyui": { "stars": 1, - "last_update": "2024-01-07 14:03:21" + "last_update": "2024-01-07 14:03:21", + "author_account_age_days": 2000 }, "https://github.com/giriss/comfy-image-saver": { - "stars": 133, - "last_update": "2024-05-22 20:40:55" + "stars": 139, + "last_update": "2024-05-22 20:40:55", + "author_account_age_days": 4226 }, "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER": { "stars": 0, - "last_update": "2024-05-23 01:20:09" + "last_update": "2024-05-23 01:20:09", + "author_account_age_days": 3891 }, "https://github.com/githubYiheng/ComfyUI_GetFileNameFromURL": { "stars": 0, - "last_update": "2024-05-23 01:19:47" + "last_update": "2024-05-23 01:19:47", + "author_account_age_days": 3891 }, "https://github.com/githubYiheng/comfyui_kmeans_filter": { "stars": 0, - "last_update": "2024-05-24 10:55:10" + "last_update": "2024-05-24 10:55:10", + "author_account_age_days": 3891 }, "https://github.com/githubYiheng/comfyui_meanshift_filter": { "stars": 0, - "last_update": "2024-05-28 03:12:18" - }, - "https://github.com/githubYiheng/comfyui_median_filter": { - "stars": 0, - "last_update": "2024-05-24 15:21:40" + "last_update": "2024-05-28 03:12:18", + "author_account_age_days": 3891 }, "https://github.com/githubYiheng/comfyui_private_postprocessor": { "stars": 0, - "last_update": "2024-05-30 07:06:09" + "last_update": "2024-06-03 16:41:26", + "author_account_age_days": 3891 }, "https://github.com/glibsonoran/Plush-for-ComfyUI": { - "stars": 101, - "last_update": "2024-05-24 16:32:17" + "stars": 103, + "last_update": "2024-05-24 16:32:17", + "author_account_age_days": 2486 }, "https://github.com/glifxyz/ComfyUI-GlifNodes": { "stars": 6, - "last_update": "2024-05-23 16:29:07" + "last_update": "2024-05-23 16:29:07", + "author_account_age_days": 562 }, "https://github.com/glowcone/comfyui-base64-to-image": { - "stars": 6, - "last_update": "2024-01-09 08:33:02" + "stars": 8, + "last_update": "2024-01-09 08:33:02", + "author_account_age_days": 3734 }, "https://github.com/godspede/ComfyUI_Substring": { "stars": 0, - "last_update": "2024-05-22 23:15:48" + "last_update": "2024-05-22 23:15:48", + "author_account_age_days": 3101 }, "https://github.com/gokayfem/ComfyUI-Depth-Visualization": { - "stars": 46, - "last_update": "2024-05-21 00:37:05" + "stars": 47, + "last_update": "2024-05-21 00:37:05", + "author_account_age_days": 1046 }, "https://github.com/gokayfem/ComfyUI-Dream-Interpreter": { - "stars": 63, - "last_update": "2024-05-21 00:36:50" + "stars": 66, + "last_update": "2024-05-21 00:36:50", + "author_account_age_days": 1046 }, "https://github.com/gokayfem/ComfyUI-Texture-Simple": { "stars": 29, - "last_update": "2024-05-21 00:19:53" + "last_update": "2024-05-21 00:19:53", + "author_account_age_days": 1046 }, "https://github.com/gokayfem/ComfyUI_VLM_nodes": { - "stars": 251, - "last_update": "2024-06-02 10:23:55" + "stars": 260, + "last_update": "2024-06-02 10:23:55", + "author_account_age_days": 1046 }, "https://github.com/gonzalu/ComfyUI_YFG_Comical": { - "stars": 10, - "last_update": "2024-05-30 03:05:46" + "stars": 12, + "last_update": "2024-06-10 00:31:59", + "author_account_age_days": 2449 }, "https://github.com/griptape-ai/ComfyUI-Griptape": { - "stars": 3, - "last_update": "2024-05-25 02:12:16" + "stars": 12, + "last_update": "2024-06-12 21:10:55", + "author_account_age_days": 509 }, "https://github.com/guill/abracadabra-comfyui": { "stars": 1, - "last_update": "2024-02-26 04:25:21" + "last_update": "2024-02-26 04:25:21", + "author_account_age_days": 4181 }, "https://github.com/guoyk93/yk-node-suite-comfyui": { "stars": 10, - "last_update": "2023-03-28 16:19:46" + "last_update": "2023-03-28 16:19:46", + "author_account_age_days": 1477 }, "https://github.com/hackkhai/ComfyUI-Image-Matting": { "stars": 11, - "last_update": "2024-05-23 00:11:45" + "last_update": "2024-05-23 00:11:45", + "author_account_age_days": 1839 + }, + "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector": { + "stars": 0, + "last_update": "2024-06-09 04:03:11", + "author_account_age_days": 94 }, "https://github.com/hay86/ComfyUI_AceNodes": { - "stars": 6, - "last_update": "2024-05-23 00:20:41" + "stars": 8, + "last_update": "2024-06-05 07:54:59", + "author_account_age_days": 4655 }, "https://github.com/hay86/ComfyUI_DDColor": { "stars": 1, - "last_update": "2024-04-17 14:38:22" + "last_update": "2024-04-17 14:38:22", + "author_account_age_days": 4655 }, "https://github.com/hay86/ComfyUI_Dreamtalk": { "stars": 7, - "last_update": "2024-04-12 09:13:05" + "last_update": "2024-04-12 09:13:05", + "author_account_age_days": 4655 }, "https://github.com/hay86/ComfyUI_MiniCPM-V": { "stars": 5, - "last_update": "2024-05-29 07:27:09" + "last_update": "2024-05-29 07:27:09", + "author_account_age_days": 4655 }, "https://github.com/hay86/ComfyUI_OpenVoice": { "stars": 3, - "last_update": "2024-05-23 00:18:52" + "last_update": "2024-05-23 00:18:52", + "author_account_age_days": 4655 }, "https://github.com/hayden-fr/ComfyUI-Image-Browsing": { "stars": 2, - "last_update": "2024-05-22 20:54:07" + "last_update": "2024-05-22 20:54:07", + "author_account_age_days": 1925 }, "https://github.com/hayden-fr/ComfyUI-Model-Manager": { "stars": 23, - "last_update": "2024-05-22 20:53:55" + "last_update": "2024-05-22 20:53:55", + "author_account_age_days": 1925 + }, + "https://github.com/hben35096/ComfyUI-ToolBox": { + "stars": 0, + "last_update": "2024-06-02 19:29:39", + "author_account_age_days": 336 }, "https://github.com/heshengtao/comfyui_LLM_party": { - "stars": 78, - "last_update": "2024-06-02 03:07:52" + "stars": 97, + "last_update": "2024-06-12 11:50:13", + "author_account_age_days": 2883 }, "https://github.com/hhhzzyang/Comfyui_Lama": { - "stars": 34, - "last_update": "2024-05-22 21:13:19" + "stars": 36, + "last_update": "2024-05-22 21:13:19", + "author_account_age_days": 495 }, "https://github.com/hiforce/comfyui-hiforce-plugin": { "stars": 2, - "last_update": "2024-02-29 09:35:31" + "last_update": "2024-02-29 09:35:31", + "author_account_age_days": 1790 }, "https://github.com/hinablue/ComfyUI_3dPoseEditor": { - "stars": 105, - "last_update": "2024-05-22 22:23:35" + "stars": 109, + "last_update": "2024-05-22 22:23:35", + "author_account_age_days": 5100 }, "https://github.com/holchan/ComfyUI-ModelDownloader": { "stars": 2, - "last_update": "2024-03-02 05:43:41" + "last_update": "2024-03-02 05:43:41", + "author_account_age_days": 1580 }, "https://github.com/huagetai/ComfyUI-Gaffer": { - "stars": 31, - "last_update": "2024-05-23 01:22:40" + "stars": 32, + "last_update": "2024-05-23 01:22:40", + "author_account_age_days": 4620 }, "https://github.com/huagetai/ComfyUI_LightGradient": { - "stars": 6, - "last_update": "2024-05-23 01:21:27" + "stars": 7, + "last_update": "2024-05-23 01:21:27", + "author_account_age_days": 4620 }, "https://github.com/huchenlei/ComfyUI-IC-Light-Native": { - "stars": 329, - "last_update": "2024-05-14 14:31:12" + "stars": 367, + "last_update": "2024-06-06 16:29:55", + "author_account_age_days": 2864 }, "https://github.com/huchenlei/ComfyUI-layerdiffuse": { - "stars": 1221, - "last_update": "2024-05-16 22:30:32" + "stars": 1243, + "last_update": "2024-05-16 22:30:32", + "author_account_age_days": 2864 }, "https://github.com/huchenlei/ComfyUI-openpose-editor": { - "stars": 10, - "last_update": "2024-04-25 22:45:00" + "stars": 11, + "last_update": "2024-04-25 22:45:00", + "author_account_age_days": 2864 }, "https://github.com/huchenlei/ComfyUI_DanTagGen": { "stars": 48, - "last_update": "2024-04-28 15:36:22" + "last_update": "2024-04-28 15:36:22", + "author_account_age_days": 2864 + }, + "https://github.com/huchenlei/ComfyUI_densediffusion": { + "stars": 41, + "last_update": "2024-06-11 00:39:28", + "author_account_age_days": 2864 + }, + "https://github.com/huchenlei/ComfyUI_omost": { + "stars": 270, + "last_update": "2024-06-11 20:06:43", + "author_account_age_days": 2864 }, "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor": { "stars": 6, - "last_update": "2024-02-24 21:41:24" + "last_update": "2024-02-24 21:41:24", + "author_account_age_days": 5629 + }, + "https://github.com/humgate/simplecomfy": { + "stars": 0, + "last_update": "2024-06-05 17:08:39", + "author_account_age_days": 1355 }, "https://github.com/hustille/ComfyUI_Fooocus_KSampler": { "stars": 57, - "last_update": "2024-05-22 20:39:48" + "last_update": "2024-05-22 20:39:48", + "author_account_age_days": 428 }, "https://github.com/hustille/ComfyUI_hus_utils": { "stars": 6, - "last_update": "2024-05-22 20:39:34" + "last_update": "2024-05-22 20:39:34", + "author_account_age_days": 428 }, "https://github.com/hylarucoder/ComfyUI-Eagle-PNGInfo": { "stars": 7, - "last_update": "2023-12-10 13:57:48" + "last_update": "2023-12-10 13:57:48", + "author_account_age_days": 3901 }, "https://github.com/iFREEGROUP/comfyui-undistort": { "stars": 1, - "last_update": "2024-05-23 07:01:39" + "last_update": "2024-05-23 07:01:39", + "author_account_age_days": 1545 }, "https://github.com/icesun963/ComfyUI_HFDownLoad": { "stars": 0, - "last_update": "2024-05-17 13:09:02" + "last_update": "2024-05-17 13:09:02", + "author_account_age_days": 4094 }, "https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words": { - "stars": 82, - "last_update": "2024-05-22 21:25:49" + "stars": 90, + "last_update": "2024-05-22 21:25:49", + "author_account_age_days": 3038 }, "https://github.com/iemesowum/ComfyUI_IsaacNodes": { "stars": 0, - "last_update": "2024-05-20 13:52:39" + "last_update": "2024-05-20 13:52:39", + "author_account_age_days": 5280 }, "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode": { - "stars": 1, - "last_update": "2024-05-22 22:31:30" + "stars": 2, + "last_update": "2024-05-22 22:31:30", + "author_account_age_days": 2850 }, "https://github.com/if-ai/ComfyUI-IF_AI_WishperSpeechNode": { - "stars": 21, - "last_update": "2024-05-22 22:02:55" + "stars": 26, + "last_update": "2024-05-22 22:02:55", + "author_account_age_days": 2850 }, "https://github.com/if-ai/ComfyUI-IF_AI_tools": { - "stars": 311, - "last_update": "2024-05-31 03:09:53" + "stars": 326, + "last_update": "2024-06-10 22:40:42", + "author_account_age_days": 2850 }, "https://github.com/imb101/ComfyUI-FaceSwap": { - "stars": 29, - "last_update": "2024-05-22 18:22:29" + "stars": 28, + "last_update": "2024-05-22 18:22:29", + "author_account_age_days": 877 }, "https://github.com/jags111/ComfyUI_Jags_Audiotools": { - "stars": 30, - "last_update": "2024-05-19 18:54:12" + "stars": 32, + "last_update": "2024-05-19 18:54:12", + "author_account_age_days": 3859 }, "https://github.com/jags111/ComfyUI_Jags_VectorMagic": { - "stars": 47, - "last_update": "2024-05-19 18:49:42" + "stars": 48, + "last_update": "2024-05-19 18:49:42", + "author_account_age_days": 3859 }, "https://github.com/jags111/efficiency-nodes-comfyui": { - "stars": 635, - "last_update": "2024-05-31 12:53:20" + "stars": 656, + "last_update": "2024-06-05 06:46:30", + "author_account_age_days": 3859 }, "https://github.com/jamal-alkharrat/ComfyUI_rotate_image": { "stars": 0, - "last_update": "2024-05-22 23:19:02" + "last_update": "2024-05-22 23:19:02", + "author_account_age_days": 965 }, "https://github.com/jamesWalker55/comfyui-p2ldgan": { "stars": 12, - "last_update": "2024-05-22 18:19:04" + "last_update": "2024-05-22 18:19:04", + "author_account_age_days": 2515 }, "https://github.com/jamesWalker55/comfyui-various": { "stars": 27, - "last_update": "2024-05-22 18:19:17" + "last_update": "2024-05-22 18:19:17", + "author_account_age_days": 2515 }, "https://github.com/jax-explorer/fast_video_comfyui": { "stars": 0, - "last_update": "2024-05-23 01:17:35" + "last_update": "2024-05-23 01:17:35", + "author_account_age_days": 565 }, "https://github.com/jeffy5/comfyui-faceless-node": { - "stars": 10, - "last_update": "2024-05-29 09:32:37" + "stars": 11, + "last_update": "2024-06-05 10:25:42", + "author_account_age_days": 2919 }, "https://github.com/jesenzhang/ComfyUI_StreamDiffusion": { - "stars": 103, - "last_update": "2024-05-23 02:40:36" + "stars": 104, + "last_update": "2024-05-23 02:40:36", + "author_account_age_days": 3640 }, "https://github.com/jiaxiangc/ComfyUI-ResAdapter": { - "stars": 268, - "last_update": "2024-05-23 00:22:23" + "stars": 267, + "last_update": "2024-05-23 00:22:23", + "author_account_age_days": 1274 }, "https://github.com/jitcoder/lora-info": { - "stars": 36, - "last_update": "2024-05-22 22:17:44" + "stars": 42, + "last_update": "2024-05-22 22:17:44", + "author_account_age_days": 4029 }, "https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes": { "stars": 4, - "last_update": "2024-05-22 20:44:56" + "last_update": "2024-05-22 20:44:56", + "author_account_age_days": 3637 }, "https://github.com/jkrauss82/ultools-comfyui": { "stars": 5, - "last_update": "2024-03-31 08:27:34" + "last_update": "2024-03-31 08:27:34", + "author_account_age_days": 4200 }, "https://github.com/jmkl/ComfyUI-ricing": { "stars": 9, - "last_update": "2024-05-22 20:54:35" + "last_update": "2024-05-22 20:54:35", + "author_account_age_days": 4585 }, "https://github.com/jojkaart/ComfyUI-sampler-lcm-alternative": { - "stars": 95, - "last_update": "2024-05-22 21:31:41" + "stars": 98, + "last_update": "2024-05-22 21:31:41", + "author_account_age_days": 4786 }, "https://github.com/jordoh/ComfyUI-Deepface": { "stars": 10, - "last_update": "2024-03-23 14:37:34" + "last_update": "2024-03-23 14:37:34", + "author_account_age_days": 4982 }, "https://github.com/jtrue/ComfyUI-JaRue": { "stars": 6, - "last_update": "2023-12-25 17:55:50" - }, - "https://github.com/jtydhr88/ComfyUI-InstantMesh": { - "stars": 124, - "last_update": "2024-06-01 01:46:34" + "last_update": "2023-12-25 17:55:50", + "author_account_age_days": 3918 }, "https://github.com/jtydhr88/ComfyUI-LayerDivider": { - "stars": 35, - "last_update": "2024-05-18 03:24:07" + "stars": 40, + "last_update": "2024-06-08 13:38:28", + "author_account_age_days": 4741 }, "https://github.com/jtydhr88/ComfyUI-Workflow-Encrypt": { - "stars": 8, - "last_update": "2024-04-07 02:47:17" + "stars": 10, + "last_update": "2024-04-07 02:47:17", + "author_account_age_days": 4741 }, "https://github.com/ka-puna/comfyui-yanc": { "stars": 6, - "last_update": "2024-05-22 21:29:37" + "last_update": "2024-05-22 21:29:37", + "author_account_age_days": 2195 }, "https://github.com/kaanyalova/ComfyUI_ExtendedImageFormats": { - "stars": 1, - "last_update": "2024-05-23 01:23:43" + "stars": 2, + "last_update": "2024-06-03 13:20:01", + "author_account_age_days": 1255 }, "https://github.com/kadirnar/ComfyUI-Transformers": { - "stars": 15, - "last_update": "2024-05-23 12:34:26" + "stars": 16, + "last_update": "2024-05-23 12:34:26", + "author_account_age_days": 2318 }, "https://github.com/kale4eat/ComfyUI-path-util": { "stars": 0, - "last_update": "2024-05-25 05:44:11" + "last_update": "2024-05-25 05:44:11", + "author_account_age_days": 1600 }, "https://github.com/kale4eat/ComfyUI-speech-dataset-toolkit": { "stars": 5, - "last_update": "2024-05-23 00:25:02" + "last_update": "2024-05-23 00:25:02", + "author_account_age_days": 1600 }, "https://github.com/kale4eat/ComfyUI-string-util": { "stars": 1, - "last_update": "2024-05-23 00:24:40" + "last_update": "2024-05-23 00:24:40", + "author_account_age_days": 1600 }, "https://github.com/kale4eat/ComfyUI-text-file-util": { "stars": 0, - "last_update": "2024-05-23 00:24:51" + "last_update": "2024-05-23 00:24:51", + "author_account_age_days": 1600 }, "https://github.com/katalist-ai/comfyUI-nsfw-detection": { "stars": 1, - "last_update": "2024-05-23 01:23:32" + "last_update": "2024-05-23 01:23:32", + "author_account_age_days": 742 }, "https://github.com/kealiu/ComfyUI-S3-Tools": { - "stars": 0, - "last_update": "2024-05-23 01:10:44" + "stars": 1, + "last_update": "2024-05-23 01:10:44", + "author_account_age_days": 4116 }, "https://github.com/kealiu/ComfyUI-Zero123-Porting": { - "stars": 7, - "last_update": "2024-05-23 01:11:13" + "stars": 11, + "last_update": "2024-05-23 01:11:13", + "author_account_age_days": 4116 }, "https://github.com/kealiu/ComfyUI-ZeroShot-MTrans": { - "stars": 123, - "last_update": "2024-05-23 01:11:01" + "stars": 127, + "last_update": "2024-05-23 01:11:01", + "author_account_age_days": 4116 }, "https://github.com/kenjiqq/qq-nodes-comfyui": { "stars": 22, - "last_update": "2024-05-22 21:34:53" + "last_update": "2024-05-22 21:34:53", + "author_account_age_days": 4878 }, "https://github.com/kft334/Knodes": { "stars": 3, - "last_update": "2024-01-14 04:23:09" + "last_update": "2024-01-14 04:23:09", + "author_account_age_days": 947 }, "https://github.com/kijai/ComfyUI-ADMotionDirector": { - "stars": 118, - "last_update": "2024-06-01 17:55:31" + "stars": 123, + "last_update": "2024-06-01 17:55:31", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-APISR-KJ": { "stars": 55, - "last_update": "2024-05-21 16:30:21" + "last_update": "2024-05-21 16:30:21", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-BrushNet-Wrapper": { - "stars": 101, - "last_update": "2024-05-21 16:49:05" + "stars": 102, + "last_update": "2024-05-21 16:49:05", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-CCSR": { - "stars": 136, - "last_update": "2024-05-22 21:09:35" + "stars": 143, + "last_update": "2024-05-22 21:09:35", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-DDColor": { - "stars": 74, - "last_update": "2024-05-21 16:04:26" + "stars": 78, + "last_update": "2024-05-21 16:04:26", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-DiffusionLight": { "stars": 48, - "last_update": "2024-05-21 16:16:52" + "last_update": "2024-05-21 16:16:52", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-DynamiCrafterWrapper": { - "stars": 337, - "last_update": "2024-06-02 13:44:22" + "stars": 446, + "last_update": "2024-06-09 11:19:05", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-ELLA-wrapper": { "stars": 102, - "last_update": "2024-05-21 16:47:28" + "last_update": "2024-05-21 16:47:28", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-Geowizard": { "stars": 80, - "last_update": "2024-05-28 14:08:34" + "last_update": "2024-05-28 14:08:34", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-IC-Light": { - "stars": 329, - "last_update": "2024-05-25 07:37:51" + "stars": 368, + "last_update": "2024-05-25 07:37:51", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-KJNodes": { - "stars": 298, - "last_update": "2024-06-01 13:07:49" + "stars": 311, + "last_update": "2024-06-10 14:46:27", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-LaVi-Bridge-Wrapper": { "stars": 19, - "last_update": "2024-05-21 16:41:18" + "last_update": "2024-05-21 16:41:18", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-Marigold": { - "stars": 363, - "last_update": "2024-05-29 12:03:37" + "stars": 371, + "last_update": "2024-06-11 10:40:36", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-SUPIR": { - "stars": 1102, - "last_update": "2024-05-21 14:56:36" + "stars": 1137, + "last_update": "2024-05-21 14:56:36", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-SVD": { "stars": 152, - "last_update": "2024-05-22 21:09:54" + "last_update": "2024-05-22 21:09:54", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-depth-fm": { - "stars": 49, - "last_update": "2024-05-22 21:10:15" + "stars": 53, + "last_update": "2024-05-22 21:10:15", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-moondream": { - "stars": 73, - "last_update": "2024-05-22 21:10:33" + "stars": 74, + "last_update": "2024-05-22 21:10:33", + "author_account_age_days": 2171 }, "https://github.com/kinfolk0117/ComfyUI_GradientDeepShrink": { "stars": 23, - "last_update": "2024-05-22 21:25:13" + "last_update": "2024-05-22 21:25:13", + "author_account_age_days": 457 }, "https://github.com/kinfolk0117/ComfyUI_Pilgram": { - "stars": 6, - "last_update": "2024-05-22 21:25:24" + "stars": 7, + "last_update": "2024-05-22 21:25:24", + "author_account_age_days": 457 }, "https://github.com/kinfolk0117/ComfyUI_SimpleTiles": { - "stars": 23, - "last_update": "2024-05-22 21:25:01" + "stars": 24, + "last_update": "2024-05-22 21:25:01", + "author_account_age_days": 457 }, "https://github.com/klinter007/klinter_nodes": { "stars": 4, - "last_update": "2024-05-02 14:41:48" + "last_update": "2024-05-02 14:41:48", + "author_account_age_days": 414 }, "https://github.com/knuknX/ComfyUI-Image-Tools": { - "stars": 2, - "last_update": "2024-01-01 03:30:49" + "stars": 3, + "last_update": "2024-01-01 03:30:49", + "author_account_age_days": 188 }, "https://github.com/kohya-ss/ControlNet-LLLite-ComfyUI": { - "stars": 142, - "last_update": "2024-05-22 20:44:44" + "stars": 145, + "last_update": "2024-05-22 20:44:44", + "author_account_age_days": 1797 }, "https://github.com/komojini/ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes": { "stars": 3, - "last_update": "2024-05-22 21:34:27" + "last_update": "2024-05-22 21:34:27", + "author_account_age_days": 571 }, "https://github.com/komojini/komojini-comfyui-nodes": { - "stars": 59, - "last_update": "2024-05-22 21:34:39" + "stars": 62, + "last_update": "2024-05-22 21:34:39", + "author_account_age_days": 571 }, "https://github.com/kunieone/ComfyUI_alkaid": { "stars": 0, - "last_update": "2024-05-23 01:10:21" + "last_update": "2024-05-23 01:10:21", + "author_account_age_days": 2508 }, "https://github.com/kwaroran/abg-comfyui": { - "stars": 21, - "last_update": "2024-05-22 18:19:51" + "stars": 22, + "last_update": "2024-05-22 18:19:51", + "author_account_age_days": 596 }, "https://github.com/l20richo/ComfyUI-Azure-Blob-Storage": { "stars": 1, - "last_update": "2024-06-02 12:21:22" + "last_update": "2024-06-06 06:27:02", + "author_account_age_days": 1155 }, "https://github.com/laksjdjf/Batch-Condition-ComfyUI": { "stars": 1, - "last_update": "2024-05-22 20:42:42" + "last_update": "2024-05-22 20:42:42", + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/LCMSampler-ComfyUI": { "stars": 14, - "last_update": "2024-05-22 20:42:17" + "last_update": "2024-05-22 20:42:17", + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/LoRTnoC-ComfyUI": { - "stars": 10, - "last_update": "2024-05-22 20:42:29" - }, - "https://github.com/laksjdjf/attention-couple-ComfyUI": { - "stars": 56, - "last_update": "2024-03-25 03:38:55" + "stars": 11, + "last_update": "2024-05-22 20:42:29", + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": { - "stars": 17, - "last_update": "2024-05-22 20:42:04" + "stars": 19, + "last_update": "2024-05-22 20:42:04", + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/cgem156-ComfyUI": { - "stars": 26, - "last_update": "2024-05-22 20:42:55" + "stars": 29, + "last_update": "2024-06-08 01:09:03", + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/pfg-ComfyUI": { - "stars": 9, - "last_update": "2024-05-22 20:41:41" + "stars": 10, + "last_update": "2024-05-22 20:41:41", + "author_account_age_days": 2819 }, "https://github.com/larsupb/LoRA-Merger-ComfyUI": { - "stars": 7, - "last_update": "2024-05-30 22:35:50" + "stars": 9, + "last_update": "2024-06-05 16:41:02", + "author_account_age_days": 3064 + }, + "https://github.com/latenightlabs/ComfyUI-LNL": { + "stars": 0, + "last_update": "2024-05-02 07:32:18", + "author_account_age_days": 139 }, "https://github.com/leoleelxh/ComfyUI-LLMs": { "stars": 6, - "last_update": "2024-03-07 07:34:10" + "last_update": "2024-03-07 07:34:10", + "author_account_age_days": 4063 }, "https://github.com/lilly1987/ComfyUI_node_Lilly": { - "stars": 50, - "last_update": "2024-05-22 17:53:19" + "stars": 49, + "last_update": "2024-05-22 17:53:19", + "author_account_age_days": 2898 }, "https://github.com/linshier/comfyui-remote-tools": { "stars": 1, - "last_update": "2024-05-28 07:44:23" + "last_update": "2024-05-28 07:44:23", + "author_account_age_days": 3780 }, "https://github.com/liusida/ComfyUI-AutoCropFaces": { - "stars": 11, - "last_update": "2024-05-20 06:51:57" + "stars": 14, + "last_update": "2024-05-20 06:51:57", + "author_account_age_days": 3196 }, "https://github.com/liusida/ComfyUI-Debug": { "stars": 6, - "last_update": "2024-04-07 11:33:02" + "last_update": "2024-04-07 11:33:02", + "author_account_age_days": 3196 }, "https://github.com/liusida/ComfyUI-Login": { - "stars": 27, - "last_update": "2024-06-02 11:37:54" + "stars": 34, + "last_update": "2024-06-07 08:03:47", + "author_account_age_days": 3196 }, "https://github.com/ljleb/comfy-mecha": { - "stars": 8, - "last_update": "2024-05-26 14:57:05" + "stars": 9, + "last_update": "2024-06-12 22:19:54", + "author_account_age_days": 2452 + }, + "https://github.com/lks-ai/ComfyUI-StableAudioSampler": { + "stars": 153, + "last_update": "2024-06-11 20:37:12", + "author_account_age_days": 88 }, "https://github.com/lks-ai/anynode": { - "stars": 265, - "last_update": "2024-06-02 10:15:02" + "stars": 379, + "last_update": "2024-06-11 16:24:50", + "author_account_age_days": 88 }, "https://github.com/lldacing/comfyui-easyapi-nodes": { - "stars": 24, - "last_update": "2024-05-24 02:51:26" + "stars": 25, + "last_update": "2024-05-24 02:51:26", + "author_account_age_days": 2081 }, "https://github.com/logtd/ComfyUI-FLATTEN": { - "stars": 58, - "last_update": "2024-05-31 22:18:36" + "stars": 59, + "last_update": "2024-06-10 03:33:47", + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-InstanceDiffusion": { - "stars": 131, - "last_update": "2024-05-22 00:02:08" + "stars": 138, + "last_update": "2024-05-22 00:02:08", + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-InversedNoise": { "stars": 5, - "last_update": "2024-05-22 00:10:18" + "last_update": "2024-05-22 00:10:18", + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-RAVE_ATTN": { "stars": 9, - "last_update": "2024-05-22 00:20:03" + "last_update": "2024-05-22 00:20:03", + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-RefSampling": { "stars": 4, - "last_update": "2024-05-22 00:04:40" + "last_update": "2024-05-22 00:04:40", + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-TrackingNodes": { - "stars": 14, - "last_update": "2024-05-22 00:03:27" + "stars": 15, + "last_update": "2024-05-22 00:03:27", + "author_account_age_days": 110 }, "https://github.com/longgui0318/comfyui-llm-assistant": { "stars": 5, - "last_update": "2024-05-22 23:13:46" + "last_update": "2024-05-22 23:13:46", + "author_account_age_days": 4153 }, "https://github.com/longgui0318/comfyui-magic-clothing": { - "stars": 18, - "last_update": "2024-04-28 03:29:42" + "stars": 20, + "last_update": "2024-06-11 21:10:33", + "author_account_age_days": 4153 }, "https://github.com/longgui0318/comfyui-mask-util": { "stars": 4, - "last_update": "2024-05-27 03:26:46" + "last_update": "2024-06-12 18:07:40", + "author_account_age_days": 4153 }, "https://github.com/longgui0318/comfyui-oms-diffusion": { - "stars": 18, - "last_update": "2024-04-28 03:29:42" + "stars": 20, + "last_update": "2024-06-11 21:10:33", + "author_account_age_days": 4153 }, "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch": { - "stars": 104, - "last_update": "2024-06-02 06:50:05" + "stars": 136, + "last_update": "2024-06-11 03:36:02", + "author_account_age_days": 4039 }, "https://github.com/lquesada/ComfyUI-Prompt-Combinator": { "stars": 17, - "last_update": "2024-05-25 18:04:20" + "last_update": "2024-05-25 18:04:20", + "author_account_age_days": 4039 }, "https://github.com/ltdrdata/ComfyUI-Impact-Pack": { - "stars": 1312, - "last_update": "2024-06-02 12:41:35" + "stars": 1346, + "last_update": "2024-06-12 16:21:31", + "author_account_age_days": 450 }, "https://github.com/ltdrdata/ComfyUI-Inspire-Pack": { - "stars": 269, - "last_update": "2024-06-02 12:41:49" + "stars": 277, + "last_update": "2024-06-12 16:22:31", + "author_account_age_days": 450 }, "https://github.com/ltdrdata/ComfyUI-Manager": { - "stars": 4048, - "last_update": "2024-06-02 15:15:33" + "stars": 4190, + "last_update": "2024-06-12 23:27:06", + "author_account_age_days": 450 + }, + "https://github.com/luandev/ComfyUI-CrewAI": { + "stars": 4, + "last_update": "2024-06-05 20:06:37", + "author_account_age_days": 3796 }, "https://github.com/m-sokes/ComfyUI-Sokes-Nodes": { "stars": 1, - "last_update": "2024-05-22 20:36:07" + "last_update": "2024-05-22 20:36:07", + "author_account_age_days": 304 }, "https://github.com/madtunebk/ComfyUI-ControlnetAux": { "stars": 8, - "last_update": "2024-05-23 22:01:38" + "last_update": "2024-06-04 12:14:51", + "author_account_age_days": 449 }, "https://github.com/mape/ComfyUI-mape-Helpers": { - "stars": 107, - "last_update": "2024-05-22 23:19:13" + "stars": 116, + "last_update": "2024-05-22 23:19:13", + "author_account_age_days": 5743 }, "https://github.com/maracman/ComfyUI-SubjectStyle-CSV": { "stars": 3, - "last_update": "2024-02-29 19:40:01" + "last_update": "2024-02-29 19:40:01", + "author_account_age_days": 1155 + }, + "https://github.com/marduk191/comfyui-marnodes": { + "stars": 0, + "last_update": "2024-06-12 12:05:24", + "author_account_age_days": 4403 }, "https://github.com/marhensa/sdxl-recommended-res-calc": { - "stars": 50, - "last_update": "2024-05-22 20:46:17" + "stars": 51, + "last_update": "2024-05-22 20:46:17", + "author_account_age_days": 4763 }, "https://github.com/martijnat/comfyui-previewlatent": { - "stars": 28, - "last_update": "2024-05-22 21:28:39" + "stars": 29, + "last_update": "2024-05-22 21:28:39", + "author_account_age_days": 2820 }, "https://github.com/massao000/ComfyUI_aspect_ratios": { - "stars": 4, - "last_update": "2024-05-22 22:23:10" + "stars": 5, + "last_update": "2024-05-22 22:23:10", + "author_account_age_days": 1395 }, "https://github.com/matan1905/ComfyUI-Serving-Toolkit": { - "stars": 36, - "last_update": "2024-05-22 21:26:46" + "stars": 37, + "last_update": "2024-06-04 19:15:36", + "author_account_age_days": 2728 }, "https://github.com/mav-rik/facerestore_cf": { - "stars": 147, - "last_update": "2024-05-22 20:53:23" + "stars": 150, + "last_update": "2024-05-22 20:53:23", + "author_account_age_days": 2909 }, "https://github.com/mbrostami/ComfyUI-HF": { - "stars": 11, - "last_update": "2024-05-27 21:45:33" + "stars": 15, + "last_update": "2024-05-27 21:45:33", + "author_account_age_days": 4310 }, "https://github.com/mbrostami/ComfyUI-TITrain": { - "stars": 6, - "last_update": "2024-05-27 21:50:06" + "stars": 7, + "last_update": "2024-05-27 21:50:06", + "author_account_age_days": 4310 }, "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding": { - "stars": 1046, - "last_update": "2024-05-24 16:09:17" + "stars": 1048, + "last_update": "2024-05-24 16:09:17", + "author_account_age_days": 2090 }, "https://github.com/meap158/ComfyUI-Background-Replacement": { - "stars": 33, - "last_update": "2024-05-22 20:43:52" + "stars": 34, + "last_update": "2024-05-22 20:43:52", + "author_account_age_days": 3191 }, "https://github.com/meap158/ComfyUI-GPU-temperature-protection": { "stars": 3, - "last_update": "2024-05-22 20:43:21" + "last_update": "2024-05-22 20:43:21", + "author_account_age_days": 3191 }, "https://github.com/meap158/ComfyUI-Prompt-Expansion": { "stars": 60, - "last_update": "2024-05-22 20:43:37" + "last_update": "2024-05-22 20:43:37", + "author_account_age_days": 3191 }, "https://github.com/melMass/comfy_mtb": { - "stars": 321, - "last_update": "2024-05-27 20:28:58" + "stars": 328, + "last_update": "2024-06-09 17:20:03", + "author_account_age_days": 3734 }, "https://github.com/mephisto83/petty-paint-comfyui-node": { "stars": 1, - "last_update": "2024-05-23 01:21:05" + "last_update": "2024-05-23 01:21:05", + "author_account_age_days": 3661 }, "https://github.com/meshmesh-io/ComfyUI-MeshMesh": { "stars": 0, - "last_update": "2024-05-23 00:10:09" + "last_update": "2024-05-23 00:10:09", + "author_account_age_days": 217 }, "https://github.com/meshmesh-io/mm-comfyui-loopback": { "stars": 1, - "last_update": "2024-05-23 00:09:57" + "last_update": "2024-05-23 00:09:57", + "author_account_age_days": 217 }, "https://github.com/meshmesh-io/mm-comfyui-megamask": { "stars": 0, - "last_update": "2024-05-23 00:09:47" + "last_update": "2024-05-23 00:09:47", + "author_account_age_days": 217 }, "https://github.com/mihaiiancu/ComfyUI_Inpaint": { "stars": 9, - "last_update": "2024-05-22 18:19:38" + "last_update": "2024-05-22 18:19:38", + "author_account_age_days": 2650 }, "https://github.com/mikkel/ComfyUI-text-overlay": { - "stars": 26, - "last_update": "2024-05-22 21:13:59" + "stars": 28, + "last_update": "2024-05-22 21:13:59", + "author_account_age_days": 5905 }, "https://github.com/mikkel/comfyui-mask-boundingbox": { - "stars": 22, - "last_update": "2024-05-22 21:26:23" + "stars": 24, + "last_update": "2024-05-22 21:26:23", + "author_account_age_days": 5905 }, "https://github.com/mirabarukaso/ComfyUI_Mira": { - "stars": 16, - "last_update": "2024-05-21 17:40:48" + "stars": 19, + "last_update": "2024-06-07 16:16:49", + "author_account_age_days": 1209 }, "https://github.com/modusCell/ComfyUI-dimension-node-modusCell": { "stars": 0, - "last_update": "2024-05-22 22:08:50" + "last_update": "2024-05-22 22:08:50", + "author_account_age_days": 4592 }, "https://github.com/moyi7712/ComfyUI_Seamless_Patten": { "stars": 7, - "last_update": "2024-05-28 16:13:06" + "last_update": "2024-05-28 16:13:06", + "author_account_age_days": 2289 }, "https://github.com/mozman/ComfyUI_mozman_nodes": { "stars": 0, - "last_update": "2024-05-22 22:13:32" + "last_update": "2024-05-22 22:13:32", + "author_account_age_days": 4068 }, "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt": { "stars": 15, - "last_update": "2023-08-14 11:27:09" + "last_update": "2023-08-14 11:27:09", + "author_account_age_days": 2597 }, "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask": { "stars": 4, - "last_update": "2024-05-28 14:09:23" + "last_update": "2024-05-28 14:09:23", + "author_account_age_days": 2934 }, "https://github.com/nagolinc/ComfyUI_FastVAEDecorder_SDXL": { "stars": 2, - "last_update": "2024-05-22 20:44:17" + "last_update": "2024-05-22 20:44:17", + "author_account_age_days": 3662 }, "https://github.com/nat-chan/ComfyUI-graphToPrompt": { "stars": 0, - "last_update": "2024-05-23 01:16:40" + "last_update": "2024-05-23 01:16:40", + "author_account_age_days": 2981 }, "https://github.com/nat-chan/comfyui-paint": { "stars": 2, - "last_update": "2024-05-20 01:58:39" + "last_update": "2024-05-20 01:58:39", + "author_account_age_days": 2981 }, "https://github.com/nat-chan/comfyui-transceiver": { "stars": 3, - "last_update": "2024-05-23 01:16:28" + "last_update": "2024-05-23 01:16:28", + "author_account_age_days": 2981 }, "https://github.com/nathannlu/ComfyUI-Cloud": { - "stars": 125, - "last_update": "2024-05-31 01:45:45" + "stars": 131, + "last_update": "2024-06-12 21:14:29", + "author_account_age_days": 2714 }, "https://github.com/nathannlu/ComfyUI-Pets": { - "stars": 35, - "last_update": "2024-03-31 23:55:42" + "stars": 36, + "last_update": "2024-03-31 23:55:42", + "author_account_age_days": 2714 }, "https://github.com/natto-maki/ComfyUI-NegiTools": { "stars": 26, - "last_update": "2024-05-22 21:31:17" + "last_update": "2024-05-22 21:31:17", + "author_account_age_days": 266 }, "https://github.com/nickve28/ComfyUI-Nich-Utils": { "stars": 8, - "last_update": "2024-05-23 00:22:57" + "last_update": "2024-05-23 00:22:57", + "author_account_age_days": 4017 }, "https://github.com/ningxiaoxiao/comfyui-NDI": { - "stars": 34, - "last_update": "2024-03-07 02:08:05" + "stars": 35, + "last_update": "2024-03-07 02:08:05", + "author_account_age_days": 2976 }, "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI": { "stars": 0, - "last_update": "2024-05-27 15:42:25" + "last_update": "2024-05-27 15:42:25", + "author_account_age_days": 324 }, "https://github.com/nirex0/ComfyUI_pytorch_openpose": { "stars": 2, - "last_update": "2024-05-29 10:51:41" + "last_update": "2024-05-29 10:51:41", + "author_account_age_days": 3491 }, "https://github.com/nkchocoai/ComfyUI-Dart": { - "stars": 15, - "last_update": "2024-05-22 23:11:22" + "stars": 17, + "last_update": "2024-05-22 23:11:22", + "author_account_age_days": 148 }, "https://github.com/nkchocoai/ComfyUI-PromptUtilities": { "stars": 6, - "last_update": "2024-05-22 23:10:42" + "last_update": "2024-05-22 23:10:42", + "author_account_age_days": 148 }, "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData": { "stars": 8, - "last_update": "2024-05-27 13:41:13" + "last_update": "2024-05-27 13:41:13", + "author_account_age_days": 148 }, "https://github.com/nkchocoai/ComfyUI-SizeFromPresets": { "stars": 4, - "last_update": "2024-05-22 23:10:30" + "last_update": "2024-05-22 23:10:30", + "author_account_age_days": 148 }, "https://github.com/nkchocoai/ComfyUI-TextOnSegs": { - "stars": 4, - "last_update": "2024-05-22 23:10:55" + "stars": 5, + "last_update": "2024-05-22 23:10:55", + "author_account_age_days": 148 }, "https://github.com/noembryo/ComfyUI-noEmbryo": { "stars": 11, - "last_update": "2024-05-22 21:26:12" + "last_update": "2024-06-04 11:27:45", + "author_account_age_days": 2731 }, "https://github.com/nosiu/comfyui-instantId-faceswap": { - "stars": 157, - "last_update": "2024-05-22 23:21:38" + "stars": 160, + "last_update": "2024-05-22 23:21:38", + "author_account_age_days": 3893 }, "https://github.com/noxinias/ComfyUI_NoxinNodes": { - "stars": 6, - "last_update": "2024-05-22 21:24:24" + "stars": 7, + "last_update": "2024-05-22 21:24:24", + "author_account_age_days": 2549 }, "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge": { - "stars": 20, - "last_update": "2024-05-22 22:22:14" + "stars": 21, + "last_update": "2024-05-22 22:22:14", + "author_account_age_days": 1706 + }, + "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace": { + "stars": 8, + "last_update": "2024-06-09 09:03:55", + "author_account_age_days": 1080 }, "https://github.com/nullquant/ComfyUI-BrushNet": { - "stars": 294, - "last_update": "2024-05-31 15:34:14" + "stars": 327, + "last_update": "2024-06-03 08:17:17", + "author_account_age_days": 1165 }, "https://github.com/olduvai-jp/ComfyUI-HfLoader": { - "stars": 1, - "last_update": "2024-05-23 00:14:52" + "stars": 3, + "last_update": "2024-05-23 00:14:52", + "author_account_age_days": 864 }, "https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92": { - "stars": 103, - "last_update": "2024-05-26 03:34:13" + "stars": 106, + "last_update": "2024-06-03 11:02:37", + "author_account_age_days": 4495 }, "https://github.com/osi1880vr/prompt_quill_comfyui": { - "stars": 8, - "last_update": "2024-05-23 01:18:37" + "stars": 9, + "last_update": "2024-05-23 01:18:37", + "author_account_age_days": 1065 }, "https://github.com/ostris/ostris_nodes_comfyui": { "stars": 19, - "last_update": "2024-05-22 21:23:24" + "last_update": "2024-05-22 21:23:24", + "author_account_age_days": 2391 }, "https://github.com/ownimage/ComfyUI-ownimage": { "stars": 0, - "last_update": "2024-05-22 22:22:37" + "last_update": "2024-05-22 22:22:37", + "author_account_age_days": 2771 }, "https://github.com/oyvindg/ComfyUI-TrollSuite": { "stars": 0, - "last_update": "2024-05-22 21:32:03" + "last_update": "2024-05-22 21:32:03", + "author_account_age_days": 2318 }, "https://github.com/oztrkoguz/ComfyUI_StoryCreator": { - "stars": 13, - "last_update": "2024-05-23 12:18:45" + "stars": 16, + "last_update": "2024-05-23 12:18:45", + "author_account_age_days": 830 }, "https://github.com/palant/extended-saveimage-comfyui": { - "stars": 9, - "last_update": "2024-03-27 14:08:21" + "stars": 10, + "last_update": "2024-03-27 14:08:21", + "author_account_age_days": 5041 }, "https://github.com/palant/image-resize-comfyui": { - "stars": 55, - "last_update": "2024-01-18 20:59:55" + "stars": 60, + "last_update": "2024-01-18 20:59:55", + "author_account_age_days": 5041 }, "https://github.com/palant/integrated-nodes-comfyui": { "stars": 31, - "last_update": "2023-12-27 22:52:00" + "last_update": "2023-12-27 22:52:00", + "author_account_age_days": 5041 }, "https://github.com/pamparamm/sd-perturbed-attention": { - "stars": 164, - "last_update": "2024-05-25 17:44:47" + "stars": 169, + "last_update": "2024-05-25 17:44:47", + "author_account_age_days": 2119 }, "https://github.com/pants007/comfy-pants": { "stars": 2, - "last_update": "2024-05-22 18:16:04" + "last_update": "2024-05-22 18:16:04", + "author_account_age_days": 2305 }, "https://github.com/paulo-coronado/comfy_clip_blip_node": { "stars": 25, - "last_update": "2024-05-22 17:39:09" + "last_update": "2024-05-22 17:39:09", + "author_account_age_days": 2675 }, "https://github.com/philz1337x/ComfyUI-ClarityAI": { - "stars": 35, - "last_update": "2024-05-23 01:19:05" + "stars": 39, + "last_update": "2024-05-23 01:19:05", + "author_account_age_days": 652 }, "https://github.com/phineas-pta/comfyui-auto-nodes-layout": { - "stars": 16, - "last_update": "2024-05-22 20:56:33" + "stars": 17, + "last_update": "2024-05-22 20:56:33", + "author_account_age_days": 2277 }, "https://github.com/picturesonpictures/comfy_PoP": { "stars": 12, - "last_update": "2024-05-22 20:51:32" + "last_update": "2024-05-22 20:51:32", + "author_account_age_days": 575 }, "https://github.com/pkpkTech/ComfyUI-SaveAVIF": { "stars": 0, - "last_update": "2024-05-22 22:19:21" + "last_update": "2024-05-22 22:19:21", + "author_account_age_days": 1491 }, "https://github.com/pkpkTech/ComfyUI-SaveQueues": { "stars": 1, - "last_update": "2024-05-22 22:19:54" + "last_update": "2024-05-22 22:19:54", + "author_account_age_days": 1491 }, "https://github.com/pkpkTech/ComfyUI-TemporaryLoader": { "stars": 1, - "last_update": "2024-05-22 22:19:44" + "last_update": "2024-05-22 22:19:44", + "author_account_age_days": 1491 }, "https://github.com/pkpkTech/ComfyUI-ngrok": { - "stars": 2, - "last_update": "2024-05-22 22:19:32" - }, - "https://github.com/portu-sim/comfyui-bmab": { - "stars": 19, - "last_update": "2024-06-02 07:32:45" + "stars": 3, + "last_update": "2024-05-22 22:19:32", + "author_account_age_days": 1491 }, "https://github.com/portu-sim/comfyui_bmab": { - "stars": 19, - "last_update": "2024-06-02 07:32:45" + "stars": 21, + "last_update": "2024-06-09 14:22:04", + "author_account_age_days": 310 }, "https://github.com/prodogape/ComfyUI-EasyOCR": { - "stars": 4, - "last_update": "2024-06-01 11:11:25" + "stars": 5, + "last_update": "2024-06-01 11:11:25", + "author_account_age_days": 1018 }, "https://github.com/prodogape/ComfyUI-Minio": { - "stars": 1, - "last_update": "2024-05-23 00:13:38" + "stars": 2, + "last_update": "2024-05-23 00:13:38", + "author_account_age_days": 1018 + }, + "https://github.com/prodogape/ComfyUI-OmDet": { + "stars": 2, + "last_update": "2024-06-05 06:47:45", + "author_account_age_days": 1018 }, "https://github.com/prozacgod/comfyui-pzc-multiworkspace": { - "stars": 6, - "last_update": "2024-05-22 23:11:46" + "stars": 7, + "last_update": "2024-05-22 23:11:46", + "author_account_age_days": 5556 }, "https://github.com/pythongosssss/ComfyUI-Custom-Scripts": { - "stars": 1247, - "last_update": "2024-06-01 16:13:08" + "stars": 1286, + "last_update": "2024-06-10 11:49:03", + "author_account_age_days": 486 }, "https://github.com/pythongosssss/ComfyUI-WD14-Tagger": { - "stars": 388, - "last_update": "2024-05-25 18:12:08" + "stars": 400, + "last_update": "2024-05-25 18:12:08", + "author_account_age_days": 486 }, "https://github.com/qwixiwp/queuetools": { "stars": 0, - "last_update": "2024-02-26 19:21:00" + "last_update": "2024-02-26 19:21:00", + "author_account_age_days": 599 }, "https://github.com/ramyma/A8R8_ComfyUI_nodes": { "stars": 4, - "last_update": "2024-05-22 20:55:02" + "last_update": "2024-05-22 20:55:02", + "author_account_age_days": 3205 }, "https://github.com/randjtw/advance-aesthetic-score": { "stars": 0, - "last_update": "2024-05-23 01:14:47" + "last_update": "2024-05-23 01:14:47", + "author_account_age_days": 749 }, "https://github.com/ratulrafsan/Comfyui-SAL-VTON": { - "stars": 45, - "last_update": "2024-05-23 00:17:20" + "stars": 53, + "last_update": "2024-05-23 00:17:20", + "author_account_age_days": 4482 }, "https://github.com/rcfcu2000/zhihuige-nodes-comfyui": { "stars": 0, - "last_update": "2024-05-22 22:13:55" + "last_update": "2024-05-22 22:13:55", + "author_account_age_days": 3413 }, "https://github.com/rcsaquino/comfyui-custom-nodes": { "stars": 1, - "last_update": "2024-05-22 22:13:43" + "last_update": "2024-05-22 22:13:43", + "author_account_age_days": 1499 }, "https://github.com/receyuki/comfyui-prompt-reader-node": { - "stars": 189, - "last_update": "2024-05-27 18:05:52" + "stars": 199, + "last_update": "2024-06-06 23:39:40", + "author_account_age_days": 2581 }, "https://github.com/redhottensors/ComfyUI-Prediction": { "stars": 9, - "last_update": "2024-05-13 19:58:16" + "last_update": "2024-05-13 19:58:16", + "author_account_age_days": 127 }, "https://github.com/rgthree/rgthree-comfy": { - "stars": 635, - "last_update": "2024-05-25 18:33:07" + "stars": 668, + "last_update": "2024-06-12 02:33:32", + "author_account_age_days": 4963 }, "https://github.com/richinsley/Comfy-LFO": { "stars": 5, - "last_update": "2024-05-22 20:46:30" + "last_update": "2024-05-22 20:46:30", + "author_account_age_days": 2669 }, "https://github.com/ricklove/comfyui-ricklove": { "stars": 0, - "last_update": "2024-05-22 23:21:25" + "last_update": "2024-05-22 23:21:25", + "author_account_age_days": 4821 + }, + "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": { + "stars": 6, + "last_update": "2024-06-07 16:16:59", + "author_account_age_days": 635 }, "https://github.com/rklaffehn/rk-comfy-nodes": { "stars": 2, - "last_update": "2024-01-23 17:12:45" + "last_update": "2024-01-23 17:12:45", + "author_account_age_days": 281 }, "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata": { "stars": 4, - "last_update": "2024-05-22 21:29:25" + "last_update": "2024-05-22 21:29:25", + "author_account_age_days": 279 }, "https://github.com/ronniebasak/ComfyUI-Tara-LLM-Integration": { - "stars": 63, - "last_update": "2024-05-09 06:26:16" + "stars": 66, + "last_update": "2024-05-09 06:26:16", + "author_account_age_days": 4143 }, "https://github.com/royceschultz/ComfyUI-Notifications": { "stars": 4, - "last_update": "2024-05-23 01:23:16" + "last_update": "2024-05-23 01:23:16", + "author_account_age_days": 2518 }, "https://github.com/royceschultz/ComfyUI-TranscriptionTools": { "stars": 12, - "last_update": "2024-05-23 01:10:10" + "last_update": "2024-05-23 01:10:10", + "author_account_age_days": 2518 }, "https://github.com/rui40000/RUI-Nodes": { "stars": 14, - "last_update": "2024-05-22 22:12:26" + "last_update": "2024-05-22 22:12:26", + "author_account_age_days": 462 }, "https://github.com/ruiqutech/ComfyUI-RuiquNodes": { "stars": 0, - "last_update": "2024-05-23 01:21:50" + "last_update": "2024-05-23 01:21:50", + "author_account_age_days": 58 }, "https://github.com/runtime44/comfyui_r44_nodes": { - "stars": 21, - "last_update": "2024-05-23 01:18:22" + "stars": 25, + "last_update": "2024-06-11 10:49:02", + "author_account_age_days": 156 }, "https://github.com/saftle/suplex_comfy_nodes": { "stars": 0, - "last_update": "2024-05-29 13:09:25" + "last_update": "2024-05-29 13:09:25", + "author_account_age_days": 4746 }, "https://github.com/sdfxai/SDFXBridgeForComfyUI": { - "stars": 2, - "last_update": "2024-04-12 14:09:45" + "stars": 3, + "last_update": "2024-04-12 14:09:45", + "author_account_age_days": 223 }, "https://github.com/seanlynch/comfyui-optical-flow": { - "stars": 22, - "last_update": "2024-05-22 20:52:17" + "stars": 24, + "last_update": "2024-05-22 20:52:17", + "author_account_age_days": 5293 }, "https://github.com/seanlynch/srl-nodes": { "stars": 3, - "last_update": "2024-05-22 21:08:00" + "last_update": "2024-05-22 21:08:00", + "author_account_age_days": 5293 }, "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": { "stars": 2, - "last_update": "2024-05-22 21:34:15" + "last_update": "2024-05-22 21:34:15", + "author_account_age_days": 3321 }, "https://github.com/shadowcz007/comfyui-Image-reward": { - "stars": 18, - "last_update": "2024-03-25 05:41:04" + "stars": 20, + "last_update": "2024-03-25 05:41:04", + "author_account_age_days": 3303 }, "https://github.com/shadowcz007/comfyui-consistency-decoder": { "stars": 1, - "last_update": "2024-02-02 01:46:54" + "last_update": "2024-02-02 01:46:54", + "author_account_age_days": 3303 }, "https://github.com/shadowcz007/comfyui-mixlab-nodes": { - "stars": 827, - "last_update": "2024-06-02 14:38:20" + "stars": 851, + "last_update": "2024-06-12 12:54:28", + "author_account_age_days": 3303 + }, + "https://github.com/shadowcz007/comfyui-sound-lab": { + "stars": 19, + "last_update": "2024-06-12 04:15:46", + "author_account_age_days": 3303 }, "https://github.com/shadowcz007/comfyui-ultralytics-yolo": { - "stars": 15, - "last_update": "2024-05-21 19:28:20" + "stars": 16, + "last_update": "2024-06-05 10:29:22", + "author_account_age_days": 3303 }, "https://github.com/shi3z/ComfyUI_Memeplex_DALLE": { "stars": 2, - "last_update": "2024-05-23 00:14:25" + "last_update": "2024-05-23 00:14:25", + "author_account_age_days": 5081 }, "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus": { - "stars": 139, - "last_update": "2024-04-17 09:02:51" + "stars": 141, + "last_update": "2024-04-17 09:02:51", + "author_account_age_days": 1753 }, "https://github.com/shiimizu/ComfyUI-TiledDiffusion": { - "stars": 189, - "last_update": "2024-05-14 22:01:41" + "stars": 200, + "last_update": "2024-05-14 22:01:41", + "author_account_age_days": 1753 }, "https://github.com/shiimizu/ComfyUI_smZNodes": { - "stars": 138, - "last_update": "2024-05-22 18:13:30" + "stars": 144, + "last_update": "2024-05-22 18:13:30", + "author_account_age_days": 1753 }, "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage": { "stars": 25, - "last_update": "2024-05-22 20:41:29" + "last_update": "2024-05-22 20:41:29", + "author_account_age_days": 2211 }, "https://github.com/shingo1228/ComfyUI-send-eagle-slim": { "stars": 19, - "last_update": "2024-05-22 20:41:15" + "last_update": "2024-05-22 20:41:15", + "author_account_age_days": 2211 }, "https://github.com/shinich39/comfyui-load-image-in-seq": { "stars": 3, - "last_update": "2024-05-23 00:20:53" + "last_update": "2024-05-23 00:20:53", + "author_account_age_days": 301 }, "https://github.com/shinich39/comfyui-local-db": { "stars": 1, - "last_update": "2024-05-23 00:21:08" + "last_update": "2024-05-23 00:21:08", + "author_account_age_days": 301 }, "https://github.com/shinich39/comfyui-ramdom-node": { "stars": 2, - "last_update": "2024-05-29 06:05:30" + "last_update": "2024-05-29 06:05:30", + "author_account_age_days": 301 }, - "https://github.com/shinich39/comfyui-ramdom-node-39": { - "stars": 2, - "last_update": "2024-05-29 06:05:30" + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": { + "stars": 0, + "last_update": "2024-06-11 20:16:29", + "author_account_age_days": 4296 }, "https://github.com/shockz0rz/ComfyUI_InterpolateEverything": { "stars": 22, - "last_update": "2024-05-22 18:13:49" + "last_update": "2024-05-22 18:13:49", + "author_account_age_days": 1614 }, "https://github.com/shockz0rz/comfy-easy-grids": { - "stars": 10, - "last_update": "2024-05-22 18:14:05" + "stars": 11, + "last_update": "2024-05-22 18:14:05", + "author_account_age_days": 1614 }, "https://github.com/siliconflow/onediff_comfy_nodes": { "stars": 11, - "last_update": "2024-05-22 22:23:22" + "last_update": "2024-05-22 22:23:22", + "author_account_age_days": 294 }, "https://github.com/sipherxyz/comfyui-art-venture": { - "stars": 77, - "last_update": "2024-05-22 18:15:39" + "stars": 80, + "last_update": "2024-05-22 18:15:39", + "author_account_age_days": 1095 }, "https://github.com/skfoo/ComfyUI-Coziness": { "stars": 21, - "last_update": "2024-05-27 18:24:29" + "last_update": "2024-05-27 18:24:29", + "author_account_age_days": 2070 }, "https://github.com/smagnetize/kb-comfyui-nodes": { "stars": 0, - "last_update": "2024-01-06 17:04:40" + "last_update": "2024-01-06 17:04:40", + "author_account_age_days": 2703 }, "https://github.com/smthemex/ComfyUI_ChatGLM_API": { - "stars": 15, - "last_update": "2024-04-27 11:43:52" + "stars": 16, + "last_update": "2024-06-07 07:20:38", + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_CustomNet": { "stars": 4, - "last_update": "2024-05-24 13:18:51" + "last_update": "2024-05-24 13:18:51", + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_HiDiffusion_Pro": { - "stars": 17, - "last_update": "2024-06-01 07:39:21" + "stars": 18, + "last_update": "2024-06-01 07:39:21", + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_ID_Animator": { - "stars": 8, - "last_update": "2024-05-17 13:53:57" + "stars": 11, + "last_update": "2024-06-05 09:35:00", + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_Llama3_8B": { "stars": 14, - "last_update": "2024-05-23 09:00:02" + "last_update": "2024-05-23 09:00:02", + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_ParlerTTS": { - "stars": 17, - "last_update": "2024-05-15 13:48:05" + "stars": 18, + "last_update": "2024-05-15 13:48:05", + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_Pic2Story": { "stars": 3, - "last_update": "2024-04-21 11:18:29" + "last_update": "2024-04-21 11:18:29", + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_Pipeline_Tool": { "stars": 6, - "last_update": "2024-05-21 11:53:31" + "last_update": "2024-06-05 01:57:01", + "author_account_age_days": 342 + }, + "https://github.com/smthemex/ComfyUI_Pops": { + "stars": 4, + "last_update": "2024-06-13 06:56:12", + "author_account_age_days": 343 + }, + "https://github.com/smthemex/ComfyUI_StableAudio_Open": { + "stars": 3, + "last_update": "2024-06-07 01:57:01", + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_StoryDiffusion": { - "stars": 12, - "last_update": "2024-05-31 09:30:47" + "stars": 31, + "last_update": "2024-06-12 13:16:01", + "author_account_age_days": 342 }, "https://github.com/space-nuko/ComfyUI-Disco-Diffusion": { "stars": 42, - "last_update": "2024-05-22 18:10:36" + "last_update": "2024-05-22 18:10:36", + "author_account_age_days": 2713 }, "https://github.com/space-nuko/ComfyUI-OpenPose-Editor": { - "stars": 148, - "last_update": "2024-05-22 18:10:49" + "stars": 151, + "last_update": "2024-05-22 18:10:49", + "author_account_age_days": 2713 }, "https://github.com/space-nuko/nui-suite": { "stars": 10, - "last_update": "2024-05-22 18:11:04" + "last_update": "2024-05-22 18:11:04", + "author_account_age_days": 2713 }, "https://github.com/spacepxl/ComfyUI-HQ-Image-Save": { "stars": 28, - "last_update": "2024-05-22 20:55:44" + "last_update": "2024-05-22 20:55:44", + "author_account_age_days": 283 }, "https://github.com/spacepxl/ComfyUI-Image-Filters": { - "stars": 73, - "last_update": "2024-05-22 20:56:05" + "stars": 76, + "last_update": "2024-06-03 04:23:53", + "author_account_age_days": 283 }, "https://github.com/spacepxl/ComfyUI-RAVE": { "stars": 79, - "last_update": "2024-05-22 20:56:19" + "last_update": "2024-05-22 20:56:19", + "author_account_age_days": 283 }, "https://github.com/spacepxl/ComfyUI-StyleGan": { - "stars": 2, - "last_update": "2024-05-29 07:13:07" + "stars": 3, + "last_update": "2024-06-10 20:16:34", + "author_account_age_days": 283 }, "https://github.com/spinagon/ComfyUI-seam-carving": { "stars": 14, - "last_update": "2024-05-23 05:07:00" + "last_update": "2024-05-23 05:07:00", + "author_account_age_days": 4729 }, "https://github.com/spinagon/ComfyUI-seamless-tiling": { - "stars": 71, - "last_update": "2024-05-23 05:03:42" + "stars": 73, + "last_update": "2024-05-23 05:03:42", + "author_account_age_days": 4729 }, "https://github.com/spro/comfyui-mirror": { "stars": 4, - "last_update": "2024-05-22 20:50:25" + "last_update": "2024-05-22 20:50:25", + "author_account_age_days": 5220 }, "https://github.com/ssitu/ComfyUI_UltimateSDUpscale": { - "stars": 587, - "last_update": "2024-05-22 18:09:32" + "stars": 604, + "last_update": "2024-05-22 18:09:32", + "author_account_age_days": 1677 }, "https://github.com/ssitu/ComfyUI_fabric": { "stars": 80, - "last_update": "2024-05-22 18:10:19" + "last_update": "2024-05-22 18:10:19", + "author_account_age_days": 1677 }, "https://github.com/ssitu/ComfyUI_restart_sampling": { - "stars": 72, - "last_update": "2024-05-22 18:09:49" + "stars": 75, + "last_update": "2024-05-22 18:09:49", + "author_account_age_days": 1677 }, "https://github.com/ssitu/ComfyUI_roop": { "stars": 59, - "last_update": "2024-05-22 18:10:03" + "last_update": "2024-05-22 18:10:03", + "author_account_age_days": 1677 }, "https://github.com/stavsap/comfyui-ollama": { - "stars": 169, - "last_update": "2024-05-27 20:12:59" + "stars": 179, + "last_update": "2024-05-27 20:12:59", + "author_account_age_days": 4072 }, "https://github.com/storyicon/comfyui_musev_evolved": { "stars": 13, - "last_update": "2024-05-23 09:09:50" + "last_update": "2024-05-23 09:09:50", + "author_account_age_days": 2540 }, "https://github.com/storyicon/comfyui_segment_anything": { - "stars": 479, - "last_update": "2024-05-31 07:36:30" + "stars": 496, + "last_update": "2024-05-31 07:36:30", + "author_account_age_days": 2540 }, "https://github.com/strimmlarn/ComfyUI_Strimmlarns_aesthetic_score": { - "stars": 23, - "last_update": "2024-03-01 23:00:05" + "stars": 25, + "last_update": "2024-06-04 22:50:25", + "author_account_age_days": 2615 }, "https://github.com/styler00dollar/ComfyUI-deepcache": { "stars": 8, - "last_update": "2024-05-22 22:18:18" + "last_update": "2024-05-22 22:18:18", + "author_account_age_days": 1834 }, "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale": { - "stars": 26, - "last_update": "2024-05-22 22:18:07" + "stars": 27, + "last_update": "2024-05-22 22:18:07", + "author_account_age_days": 1834 }, "https://github.com/subtleGradient/TinkerBot-tech-for-ComfyUI-Touchpad": { - "stars": 14, - "last_update": "2024-01-14 20:01:01" + "stars": 15, + "last_update": "2024-01-14 20:01:01", + "author_account_age_days": 5919 }, "https://github.com/sugarkwork/comfyui_cohere": { "stars": 0, - "last_update": "2024-05-16 00:13:17" + "last_update": "2024-05-16 00:13:17", + "author_account_age_days": 864 }, "https://github.com/sugarkwork/comfyui_tag_fillter": { - "stars": 12, - "last_update": "2024-05-27 13:38:24" + "stars": 15, + "last_update": "2024-05-27 13:38:24", + "author_account_age_days": 864 }, "https://github.com/syllebra/bilbox-comfyui": { - "stars": 77, - "last_update": "2024-05-22 20:40:43" + "stars": 79, + "last_update": "2024-05-22 20:40:43", + "author_account_age_days": 3124 }, "https://github.com/sylym/comfy_vid2vid": { "stars": 57, - "last_update": "2024-05-22 17:53:40" + "last_update": "2024-05-22 17:53:40", + "author_account_age_days": 1886 }, "https://github.com/szhublox/ambw_comfyui": { - "stars": 11, - "last_update": "2024-05-22 18:04:57" + "stars": 12, + "last_update": "2024-05-22 18:04:57", + "author_account_age_days": 995 }, "https://github.com/taabata/LCM_Inpaint-Outpaint_Comfy": { - "stars": 220, - "last_update": "2024-04-07 21:32:38" + "stars": 222, + "last_update": "2024-04-07 21:32:38", + "author_account_age_days": 1671 }, "https://github.com/talesofai/comfyui-browser": { - "stars": 396, - "last_update": "2024-05-21 20:51:18" + "stars": 403, + "last_update": "2024-05-21 20:51:18", + "author_account_age_days": 544 }, "https://github.com/teward/ComfyUI-Helper-Nodes": { "stars": 4, - "last_update": "2024-05-23 01:22:01" + "last_update": "2024-05-23 01:22:01", + "author_account_age_days": 5086 }, "https://github.com/theUpsider/ComfyUI-Logic": { - "stars": 90, - "last_update": "2024-05-22 20:35:47" + "stars": 93, + "last_update": "2024-05-22 20:35:47", + "author_account_age_days": 2711 }, "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader": { - "stars": 27, - "last_update": "2024-05-22 20:31:14" + "stars": 28, + "last_update": "2024-05-22 20:31:14", + "author_account_age_days": 2711 }, "https://github.com/thecooltechguy/ComfyUI-ComfyRun": { - "stars": 78, - "last_update": "2024-05-22 21:33:11" + "stars": 77, + "last_update": "2024-05-22 21:33:11", + "author_account_age_days": 2411 }, "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows": { - "stars": 29, - "last_update": "2024-05-22 21:33:47" + "stars": 32, + "last_update": "2024-05-22 21:33:47", + "author_account_age_days": 2411 }, "https://github.com/thecooltechguy/ComfyUI-MagicAnimate": { - "stars": 194, - "last_update": "2024-05-22 21:33:35" + "stars": 196, + "last_update": "2024-05-22 21:33:35", + "author_account_age_days": 2411 }, "https://github.com/thecooltechguy/ComfyUI-Stable-Video-Diffusion": { - "stars": 274, - "last_update": "2024-05-24 22:14:42" + "stars": 281, + "last_update": "2024-05-24 22:14:42", + "author_account_age_days": 2411 + }, + "https://github.com/tiankuan93/ComfyUI-V-Express": { + "stars": 65, + "last_update": "2024-06-12 06:31:31", + "author_account_age_days": 2938 + }, + "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge": { + "stars": 3, + "last_update": "2024-06-09 21:29:11", + "author_account_age_days": 3313 }, "https://github.com/tmagara/ComfyUI-Prediction-Boost": { "stars": 0, - "last_update": "2024-05-29 23:30:04" + "last_update": "2024-05-29 23:30:04", + "author_account_age_days": 4363 }, "https://github.com/tocubed/ComfyUI-AudioReactor": { "stars": 8, - "last_update": "2024-05-22 22:21:57" + "last_update": "2024-05-22 22:21:57", + "author_account_age_days": 3848 + }, + "https://github.com/tooldigital/ComfyUI-Yolo-Cropper": { + "stars": 4, + "last_update": "2024-06-04 17:46:40", + "author_account_age_days": 4306 }, "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes": { - "stars": 423, - "last_update": "2024-05-21 09:02:58" + "stars": 429, + "last_update": "2024-05-21 09:02:58", + "author_account_age_days": 3638 }, "https://github.com/traugdor/ComfyUI-quadMoons-nodes": { - "stars": 6, - "last_update": "2024-05-23 01:09:29" + "stars": 8, + "last_update": "2024-06-11 00:02:55", + "author_account_age_days": 3808 }, "https://github.com/trojblue/trNodes": { "stars": 8, - "last_update": "2024-05-22 18:04:36" + "last_update": "2024-05-22 18:04:36", + "author_account_age_days": 2246 }, "https://github.com/trumanwong/ComfyUI-NSFW-Detection": { - "stars": 15, - "last_update": "2024-05-23 01:27:29" + "stars": 16, + "last_update": "2024-05-23 01:27:29", + "author_account_age_days": 2948 }, "https://github.com/tsogzark/ComfyUI-load-image-from-url": { - "stars": 4, - "last_update": "2024-04-16 09:07:22" + "stars": 5, + "last_update": "2024-04-16 09:07:22", + "author_account_age_days": 1517 }, "https://github.com/ttulttul/ComfyUI-Iterative-Mixer": { - "stars": 95, - "last_update": "2024-05-22 22:17:20" + "stars": 96, + "last_update": "2024-05-22 22:17:20", + "author_account_age_days": 4745 }, "https://github.com/ttulttul/ComfyUI-Tensor-Operations": { "stars": 5, - "last_update": "2024-05-30 20:30:02" + "last_update": "2024-06-12 21:55:39", + "author_account_age_days": 4745 }, "https://github.com/turkyden/ComfyUI-Comic": { "stars": 1, - "last_update": "2024-04-29 09:44:07" + "last_update": "2024-06-11 03:51:14", + "author_account_age_days": 2737 }, "https://github.com/turkyden/ComfyUI-Sticker": { "stars": 0, - "last_update": "2024-05-23 01:09:52" + "last_update": "2024-06-11 03:51:33", + "author_account_age_days": 2737 }, "https://github.com/tusharbhutt/Endless-Nodes": { - "stars": 21, - "last_update": "2023-10-21 23:02:19" + "stars": 22, + "last_update": "2024-06-04 22:32:08", + "author_account_age_days": 2653 }, "https://github.com/twri/sdxl_prompt_styler": { - "stars": 584, - "last_update": "2024-05-22 18:16:58" + "stars": 595, + "last_update": "2024-05-22 18:16:58", + "author_account_age_days": 4056 }, "https://github.com/txt2any/ComfyUI-PromptOrganizer": { "stars": 0, - "last_update": "2024-05-23 01:10:33" + "last_update": "2024-05-23 01:10:33", + "author_account_age_days": 73 }, "https://github.com/ty0x2333/ComfyUI-Dev-Utils": { - "stars": 31, - "last_update": "2024-05-23 01:13:55" + "stars": 33, + "last_update": "2024-06-03 15:06:13", + "author_account_age_days": 3691 }, "https://github.com/tzwm/comfyui-profiler": { - "stars": 38, - "last_update": "2024-01-12 07:38:40" + "stars": 39, + "last_update": "2024-01-12 07:38:40", + "author_account_age_days": 4757 }, "https://github.com/uarefans/ComfyUI-Fans": { "stars": 12, - "last_update": "2024-05-22 20:34:07" + "last_update": "2024-05-22 20:34:07", + "author_account_age_days": 1260 }, "https://github.com/uetuluk/comfyui-webcam-node": { "stars": 2, - "last_update": "2024-05-12 05:52:44" + "last_update": "2024-05-12 05:52:44", + "author_account_age_days": 2302 }, "https://github.com/unwdef/unwdef-nodes-comfyui": { "stars": 1, - "last_update": "2024-04-15 19:32:36" + "last_update": "2024-04-15 19:32:36", + "author_account_age_days": 62 + }, + "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": { + "stars": 3, + "last_update": "2024-06-12 02:09:34", + "author_account_age_days": 2946 }, "https://github.com/vanillacode314/SimpleWildcardsComfyUI": { "stars": 3, - "last_update": "2024-04-09 01:57:14" + "last_update": "2024-04-09 01:57:14", + "author_account_age_days": 845 }, "https://github.com/victorchall/comfyui_webcamcapture": { - "stars": 4, - "last_update": "2024-05-31 18:01:11" + "stars": 5, + "last_update": "2024-05-31 18:01:11", + "author_account_age_days": 3134 }, "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration": { "stars": 26, - "last_update": "2024-05-22 22:11:14" + "last_update": "2024-05-22 22:11:14", + "author_account_age_days": 3415 }, "https://github.com/violet-chen/comfyui-psd2png": { - "stars": 12, - "last_update": "2024-06-02 05:07:19" + "stars": 14, + "last_update": "2024-06-12 15:30:14", + "author_account_age_days": 1386 }, "https://github.com/viperyl/ComfyUI-BiRefNet": { - "stars": 149, - "last_update": "2024-05-23 00:18:06" + "stars": 152, + "last_update": "2024-05-23 00:18:06", + "author_account_age_days": 2021 }, "https://github.com/viperyl/ComfyUI-RGT": { - "stars": 1, - "last_update": "2024-06-01 04:59:55" + "stars": 3, + "last_update": "2024-06-01 04:59:55", + "author_account_age_days": 2021 }, "https://github.com/vivax3794/ComfyUI-Vivax-Nodes": { "stars": 3, - "last_update": "2024-05-23 00:10:56" + "last_update": "2024-05-23 00:10:56", + "author_account_age_days": 1827 }, "https://github.com/vsevolod-oparin/comfyui-kandinsky22": { - "stars": 5, - "last_update": "2024-05-23 00:14:03" + "stars": 6, + "last_update": "2024-05-23 00:14:03", + "author_account_age_days": 4972 }, "https://github.com/wallish77/wlsh_nodes": { - "stars": 76, - "last_update": "2024-05-22 18:21:28" + "stars": 78, + "last_update": "2024-05-22 18:21:28", + "author_account_age_days": 2208 }, "https://github.com/wandbrandon/comfyui-pixel": { "stars": 4, - "last_update": "2024-05-10 14:45:42" + "last_update": "2024-05-10 14:45:42", + "author_account_age_days": 3372 }, "https://github.com/web3nomad/ComfyUI_Invisible_Watermark": { "stars": 1, - "last_update": "2024-05-23 01:16:54" + "last_update": "2024-05-23 01:16:54", + "author_account_age_days": 956 }, "https://github.com/wei30172/comfygen": { - "stars": 3, - "last_update": "2024-05-23 00:21:19" + "stars": 4, + "last_update": "2024-05-23 00:21:19", + "author_account_age_days": 1601 }, "https://github.com/whatbirdisthat/cyberdolphin": { "stars": 14, - "last_update": "2024-05-23 03:43:08" + "last_update": "2024-05-23 03:43:08", + "author_account_age_days": 5475 }, "https://github.com/whmc76/ComfyUI-Openpose-Editor-Plus": { - "stars": 16, - "last_update": "2024-05-22 21:28:27" + "stars": 18, + "last_update": "2024-05-22 21:28:27", + "author_account_age_days": 440 }, "https://github.com/wmatson/easy-comfy-nodes": { "stars": 13, - "last_update": "2024-05-15 23:10:21" + "last_update": "2024-05-15 23:10:21", + "author_account_age_days": 4106 }, "https://github.com/wolfden/ComfyUi_PromptStylers": { - "stars": 63, - "last_update": "2024-05-22 18:17:46" + "stars": 64, + "last_update": "2024-05-22 18:17:46", + "author_account_age_days": 5709 }, "https://github.com/wolfden/ComfyUi_String_Function_Tree": { "stars": 7, - "last_update": "2024-05-22 18:29:16" + "last_update": "2024-05-22 18:29:16", + "author_account_age_days": 5709 }, "https://github.com/wujm424606/ComfyUi-Ollama-YN": { - "stars": 7, - "last_update": "2024-05-15 03:38:37" + "stars": 9, + "last_update": "2024-05-15 03:38:37", + "author_account_age_days": 2251 }, "https://github.com/wutipong/ComfyUI-TextUtils": { "stars": 1, - "last_update": "2024-05-22 21:31:04" + "last_update": "2024-05-22 21:31:04", + "author_account_age_days": 4173 }, "https://github.com/wwwins/ComfyUI-Simple-Aspect-Ratio": { "stars": 1, - "last_update": "2024-05-22 22:22:25" + "last_update": "2024-05-22 22:22:25", + "author_account_age_days": 5038 }, "https://github.com/xXAdonesXx/NodeGPT": { - "stars": 318, - "last_update": "2024-02-01 23:20:08" + "stars": 323, + "last_update": "2024-02-01 23:20:08", + "author_account_age_days": 1467 }, "https://github.com/xiaoxiaodesha/hd_node": { "stars": 7, - "last_update": "2024-05-22 23:25:32" + "last_update": "2024-06-11 02:36:48", + "author_account_age_days": 2863 }, "https://github.com/xliry/ComfyUI_SendDiscord": { "stars": 0, - "last_update": "2024-05-23 02:21:38" + "last_update": "2024-05-23 02:21:38", + "author_account_age_days": 1262 }, "https://github.com/xuhongming251/ComfyUI-GPEN": { "stars": 2, - "last_update": "2024-05-25 03:32:25" + "last_update": "2024-05-25 03:32:25", + "author_account_age_days": 4094 }, "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils": { - "stars": 2, - "last_update": "2024-05-25 03:30:05" + "stars": 6, + "last_update": "2024-05-25 03:30:05", + "author_account_age_days": 4094 }, "https://github.com/yffyhk/comfyui_auto_danbooru": { "stars": 0, - "last_update": "2024-05-22 23:23:03" + "last_update": "2024-05-22 23:23:03", + "author_account_age_days": 3710 }, "https://github.com/yolain/ComfyUI-Easy-Use": { - "stars": 437, - "last_update": "2024-06-01 18:22:49" + "stars": 468, + "last_update": "2024-06-12 18:42:43", + "author_account_age_days": 1329 }, "https://github.com/yolanother/DTAIComfyImageSubmit": { "stars": 1, - "last_update": "2024-05-22 18:14:56" + "last_update": "2024-05-22 18:14:56", + "author_account_age_days": 4852 }, "https://github.com/yolanother/DTAIComfyLoaders": { "stars": 1, - "last_update": "2024-05-22 18:14:44" + "last_update": "2024-05-22 18:14:44", + "author_account_age_days": 4852 }, "https://github.com/yolanother/DTAIComfyPromptAgent": { "stars": 5, - "last_update": "2024-05-22 18:14:18" + "last_update": "2024-05-22 18:14:18", + "author_account_age_days": 4852 }, "https://github.com/yolanother/DTAIComfyQRCodes": { "stars": 2, - "last_update": "2024-05-22 18:15:09" + "last_update": "2024-05-22 18:15:09", + "author_account_age_days": 4852 }, "https://github.com/yolanother/DTAIComfyVariables": { "stars": 7, - "last_update": "2024-05-22 18:15:21" + "last_update": "2024-05-22 18:15:21", + "author_account_age_days": 4852 }, "https://github.com/yolanother/DTAIImageToTextNode": { "stars": 15, - "last_update": "2024-05-22 18:14:31" + "last_update": "2024-05-22 18:14:31", + "author_account_age_days": 4852 }, "https://github.com/youyegit/tdxh_node_comfyui": { "stars": 2, - "last_update": "2024-05-23 17:55:42" + "last_update": "2024-05-23 17:55:42", + "author_account_age_days": 417 }, "https://github.com/yuvraj108c/ComfyUI-Depth-Anything-Tensorrt": { - "stars": 52, - "last_update": "2024-05-31 05:52:17" + "stars": 58, + "last_update": "2024-05-31 05:52:17", + "author_account_age_days": 2141 }, "https://github.com/yuvraj108c/ComfyUI-PiperTTS": { "stars": 24, - "last_update": "2024-05-22 23:17:27" + "last_update": "2024-05-22 23:17:27", + "author_account_age_days": 2141 }, "https://github.com/yuvraj108c/ComfyUI-Pronodes": { - "stars": 0, - "last_update": "2024-05-22 23:16:51" + "stars": 1, + "last_update": "2024-05-22 23:16:51", + "author_account_age_days": 2141 }, "https://github.com/yuvraj108c/ComfyUI-Upscaler-Tensorrt": { - "stars": 28, - "last_update": "2024-05-31 05:50:59" + "stars": 36, + "last_update": "2024-05-31 05:50:59", + "author_account_age_days": 2141 }, "https://github.com/yuvraj108c/ComfyUI-Vsgan": { "stars": 2, - "last_update": "2024-05-22 23:17:02" + "last_update": "2024-05-22 23:17:02", + "author_account_age_days": 2141 }, "https://github.com/yuvraj108c/ComfyUI-Whisper": { - "stars": 45, - "last_update": "2024-05-31 05:59:22" + "stars": 48, + "last_update": "2024-05-31 05:59:22", + "author_account_age_days": 2141 }, "https://github.com/zcfrank1st/Comfyui-Toolbox": { "stars": 4, - "last_update": "2024-05-22 22:08:07" + "last_update": "2024-05-22 22:08:07", + "author_account_age_days": 4403 }, "https://github.com/zcfrank1st/Comfyui-Yolov8": { "stars": 17, - "last_update": "2024-02-25 06:28:49" + "last_update": "2024-02-25 06:28:49", + "author_account_age_days": 4403 }, "https://github.com/zcfrank1st/comfyui_visual_anagrams": { "stars": 5, - "last_update": "2023-12-05 12:31:26" + "last_update": "2023-12-05 12:31:26", + "author_account_age_days": 4403 }, "https://github.com/zer0TF/cute-comfy": { "stars": 27, - "last_update": "2024-05-22 21:18:53" + "last_update": "2024-05-22 21:18:53", + "author_account_age_days": 2658 }, "https://github.com/zfkun/ComfyUI_zfkun": { "stars": 12, - "last_update": "2024-05-27 11:21:51" + "last_update": "2024-05-27 11:21:51", + "author_account_age_days": 4851 }, "https://github.com/zhangp365/ComfyUI-utils-nodes": { "stars": 6, - "last_update": "2024-06-02 08:01:54" + "last_update": "2024-06-10 01:49:46", + "author_account_age_days": 279 }, "https://github.com/zhongpei/ComfyUI-InstructIR": { - "stars": 57, - "last_update": "2024-05-22 23:19:43" + "stars": 58, + "last_update": "2024-05-22 23:19:43", + "author_account_age_days": 3447 }, "https://github.com/zhongpei/Comfyui_image2prompt": { - "stars": 210, - "last_update": "2024-05-22 23:19:30" + "stars": 221, + "last_update": "2024-05-22 23:19:30", + "author_account_age_days": 3447 }, "https://github.com/zhuanqianfish/ComfyUI-EasyNode": { - "stars": 56, - "last_update": "2024-04-04 00:20:08" + "stars": 57, + "last_update": "2024-04-04 00:20:08", + "author_account_age_days": 4223 + }, + "https://github.com/zohac/ComfyUI_ZC_DrawShape": { + "stars": 1, + "last_update": "2024-06-05 14:54:17", + "author_account_age_days": 2650 }, "https://github.com/zombieyang/sd-ppp": { "stars": 7, - "last_update": "2024-05-27 15:07:35" + "last_update": "2024-06-12 15:21:05", + "author_account_age_days": 3906 } } \ No newline at end of file diff --git a/glob/manager_core.py b/glob/manager_core.py index 8ec941e7..d665d17e 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -23,7 +23,7 @@ sys.path.append(glob_path) import cm_global from manager_util import * -version = [2, 36] +version = [2, 38] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') comfyui_manager_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) diff --git a/glob/manager_server.py b/glob/manager_server.py index 3ad9b862..8fc1d1c5 100644 --- a/glob/manager_server.py +++ b/glob/manager_server.py @@ -208,9 +208,11 @@ async def populate_github_stats(json_obj, json_obj_github): if url in json_obj_github: json_obj['custom_nodes'][i]['stars'] = json_obj_github[url]['stars'] json_obj['custom_nodes'][i]['last_update'] = json_obj_github[url]['last_update'] + json_obj['custom_nodes'][i]['trust'] = json_obj_github[url]['author_account_age_days'] > 180 else: json_obj['custom_nodes'][i]['stars'] = -1 json_obj['custom_nodes'][i]['last_update'] = -1 + json_obj['custom_nodes'][i]['trust'] = False return json_obj @@ -505,6 +507,16 @@ async def fetch_customnode_list(request): return web.json_response(json_obj, content_type='application/json') +@PromptServer.instance.routes.get("/customnode/alternatives") +async def fetch_customnode_alternatives(request): + alter_json = await core.get_data_by_mode(request.rel_url.query["mode"], 'alter-list.json') + + for item in alter_json['items']: + populate_markdown(item) + + return web.json_response(alter_json, content_type='application/json') + + @PromptServer.instance.routes.get("/alternatives/getlist") async def fetch_alternatives_list(request): if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true": diff --git a/glob/security_check.py b/glob/security_check.py new file mode 100644 index 00000000..1c6fdf6f --- /dev/null +++ b/glob/security_check.py @@ -0,0 +1,80 @@ +import sys +import subprocess +import os + + +def security_check(): + print("[START] Security scan") + + custom_nodes_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) + comfyui_path = os.path.abspath(os.path.join(custom_nodes_path, '..')) + + guide = { + "ComfyUI_LLMVISION": """ +0.Remove ComfyUI\\custom_nodes\\ComfyUI_LLMVISION. +1.Remove pip packages: openai-1.16.3.dist-info, anthropic-0.21.4.dist-info, openai-1.30.2.dist-info, anthropic-0.26.1.dist-info, %LocalAppData%\\rundll64.exe + (For portable versions, it is recommended to reinstall. If you are using a venv, it is advised to recreate the venv.) +2.Remove these files in your system: lib/browser/admin.py, Cadmino.py, Fadmino.py, VISION-D.exe, BeamNG.UI.exe +3.Check your Windows registry for the key listed above and remove it. + (HKEY_CURRENT_USER\\Software\\OpenAICLI) +4.Run a malware scanner. +5.Change all of your passwords, everywhere. + +(Reinstall OS is recommended.) +\n +Detailed information: https://old.reddit.com/r/comfyui/comments/1dbls5n/psa_if_youve_used_the_comfyui_llmvision_node_from/ + """, + "lolMiner": """ +1. Remove pip packages: lolMiner* +2. Remove files: lolMiner*, 4G_Ethash_Linux_Readme.txt, mine* in ComfyUI dir. + +(Reinstall ComfyUI is recommended.) + """ + } + + node_blacklist = {"ComfyUI_LLMVISION": "ComfyUI_LLMVISION"} + + pip_blacklist = {"AppleBotzz": "ComfyUI_LLMVISION"} + + file_blacklist = { + "ComfyUI_LLMVISION": ["%LocalAppData%\\rundll64.exe"], + "lolMiner": [os.path.join(comfyui_path, 'lolMiner')] + } + + installed_pips = subprocess.check_output([sys.executable, '-m', "pip", "freeze"], text=True) + + detected = set() + for k, v in node_blacklist.items(): + if os.path.exists(os.path.join(custom_nodes_path, k)): + print(f"[SECURITY ALERT] custom node '{k}' is dangerous.") + detected.add(v) + + for k, v in pip_blacklist.items(): + if k in installed_pips: + detected.add(v) + break + + for k, v in file_blacklist.items(): + for x in v: + if os.path.exists(os.path.expandvars(x)): + detected.add(k) + break + + if len(detected) > 0: + for line in installed_pips.split('\n'): + for k, v in pip_blacklist.items(): + if k in line: + print(f"[SECURITY ALERT] '{line}' is dangerous.") + + print("\n########################################################################") + print(" Malware has been detected, forcibly terminating ComfyUI execution.") + print("########################################################################\n") + + for x in detected: + print(f"\n======== TARGET: {x} =========") + print(f"\nTODO:") + print(guide.get(x)) + + exit(-1) + + print("[DONE] Security scan") diff --git a/js/a1111-alter-downloader.js b/js/a1111-alter-downloader.js deleted file mode 100644 index c78d9b2d..00000000 --- a/js/a1111-alter-downloader.js +++ /dev/null @@ -1,566 +0,0 @@ -import { app } from "../../scripts/app.js"; -import { api } from "../../scripts/api.js" -import { ComfyDialog, $el } from "../../scripts/ui.js"; -import { install_checked_custom_node, manager_instance, rebootAPI } from "./common.js"; - -async function getAlterList() { - var mode = manager_instance.datasrc_combo.value; - - var skip_update = ""; - if(manager_instance.update_check_checkbox.checked) - skip_update = "&skip_update=true"; - - const response = await api.fetchApi(`/alternatives/getlist?mode=${mode}${skip_update}`); - - const data = await response.json(); - return data; -} - -export class AlternativesInstaller extends ComfyDialog { - static instance = null; - - install_buttons = []; - message_box = null; - data = null; - - clear() { - this.install_buttons = []; - this.message_box = null; - this.data = null; - } - - constructor(app, manager_dialog) { - super(); - this.manager_dialog = manager_dialog; - this.search_keyword = ''; - this.element = $el("div.comfy-modal", { parent: document.body }, []); - } - - startInstall(target) { - const self = AlternativesInstaller.instance; - - self.updateMessage(`
Installing '${target.title}'`); - } - - disableButtons() { - for(let i in this.install_buttons) { - this.install_buttons[i].disabled = true; - this.install_buttons[i].style.backgroundColor = 'gray'; - } - } - - apply_searchbox(data) { - let keyword = this.search_box.value.toLowerCase(); - for(let i in this.grid_rows) { - let data1 = this.grid_rows[i].data; - let data2 = data1.custom_node; - - if(!data2) - continue; - - let content = data1.tags.toLowerCase() + data1.description.toLowerCase() + data2.author.toLowerCase() + data2.description.toLowerCase() + data2.title.toLowerCase(); - - if(this.filter && this.filter != '*') { - if(this.filter != data2.installed) { - this.grid_rows[i].control.style.display = 'none'; - continue; - } - } - - if(keyword == "") - this.grid_rows[i].control.style.display = null; - else if(content.includes(keyword)) { - this.grid_rows[i].control.style.display = null; - } - else { - this.grid_rows[i].control.style.display = 'none'; - } - } - } - - async invalidateControl() { - this.clear(); - - // splash - while (this.element.children.length) { - this.element.removeChild(this.element.children[0]); - } - - const msg = $el('div', {id:'custom-message'}, - [$el('br'), - 'The custom node DB is currently being updated, and updates to custom nodes are being checked for.', - $el('br'), - 'NOTE: Update only checks for extensions that have been fetched.', - $el('br')]); - msg.style.height = '100px'; - msg.style.verticalAlign = 'middle'; - this.element.appendChild(msg); - - // invalidate - this.data = (await getAlterList()).items; - - this.element.removeChild(msg); - - while (this.element.children.length) { - this.element.removeChild(this.element.children[0]); - } - - this.createHeaderControls(); - await this.createGrid(); - this.apply_searchbox(this.data); - this.createBottomControls(); - } - - updateMessage(msg, btn_id) { - this.message_box.innerHTML = msg; - if(btn_id) { - const rebootButton = document.getElementById(btn_id); - const self = this; - rebootButton.addEventListener("click", - function() { - if(rebootAPI()) { - self.close(); - self.manager_dialog.close(); - } - }); - } - } - - invalidate_checks(is_checked, install_state) { - if(is_checked) { - for(let i in this.grid_rows) { - let data = this.grid_rows[i].data; - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - - checkbox.disabled = data.custom_node.installed != install_state; - - if(checkbox.disabled) { - for(let j in buttons) { - buttons[j].style.display = 'none'; - } - } - else { - for(let j in buttons) { - buttons[j].style.display = null; - } - } - } - - this.checkbox_all.disabled = false; - } - else { - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(checkbox.check) - return; // do nothing - } - - // every checkbox is unchecked -> enable all checkbox - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - checkbox.disabled = false; - - for(let j in buttons) { - buttons[j].style.display = null; - } - } - - this.checkbox_all.checked = false; - this.checkbox_all.disabled = true; - } - } - - check_all(is_checked) { - if(is_checked) { - // lookup first checked item's state - let check_state = null; - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(checkbox.checked) { - check_state = this.grid_rows[i].data.custom_node.installed; - } - } - - if(check_state == null) - return; - - // check only same state items - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(this.grid_rows[i].data.custom_node.installed == check_state) - checkbox.checked = true; - } - } - else { - // uncheck all - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - checkbox.checked = false; - checkbox.disabled = false; - - for(let j in buttons) { - buttons[j].style.display = null; - } - } - - this.checkbox_all.disabled = true; - } - } - - async createGrid() { - var grid = document.createElement('table'); - grid.setAttribute('id', 'alternatives-grid'); - - this.grid_rows = {}; - - let self = this; - - 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"; - - var header0 = document.createElement('th'); - header0.style.width = "20px"; - this.checkbox_all = $el("input",{type:'checkbox', id:'check_all'},[]); - header0.appendChild(this.checkbox_all); - this.checkbox_all.checked = false; - this.checkbox_all.disabled = true; - this.checkbox_all.addEventListener('change', function() { self.check_all.call(self, self.checkbox_all.checked); }); - - var header1 = document.createElement('th'); - header1.innerHTML = '  ID  '; - header1.style.width = "20px"; - var header2 = document.createElement('th'); - header2.innerHTML = 'Tags'; - header2.style.width = "10%"; - var header3 = document.createElement('th'); - header3.innerHTML = 'Author'; - header3.style.width = "150px"; - var header4 = document.createElement('th'); - header4.innerHTML = 'Title'; - header4.style.width = "20%"; - var header5 = document.createElement('th'); - header5.innerHTML = 'Description'; - header5.style.width = "50%"; - var header6 = document.createElement('th'); - header6.innerHTML = 'Install'; - header6.style.width = "130px"; - - header1.style.position = "sticky"; - header1.style.top = "0px"; - header2.style.position = "sticky"; - header2.style.top = "0px"; - header3.style.position = "sticky"; - header3.style.top = "0px"; - header4.style.position = "sticky"; - header4.style.top = "0px"; - header5.style.position = "sticky"; - header5.style.top = "0px"; - - thead.appendChild(headerRow); - headerRow.appendChild(header0); - headerRow.appendChild(header1); - headerRow.appendChild(header2); - headerRow.appendChild(header3); - headerRow.appendChild(header4); - headerRow.appendChild(header5); - headerRow.appendChild(header6); - - headerRow.style.backgroundColor = "Black"; - headerRow.style.color = "White"; - headerRow.style.textAlign = "center"; - headerRow.style.width = "100%"; - headerRow.style.padding = "0"; - - grid.appendChild(thead); - grid.appendChild(tbody); - - if(this.data) - for (var i = 0; i < this.data.length; i++) { - const data = this.data[i]; - var dataRow = document.createElement('tr'); - - let data0 = document.createElement('td'); - let checkbox = $el("input",{type:'checkbox', id:`check_${i}`},[]); - data0.appendChild(checkbox); - checkbox.checked = false; - checkbox.addEventListener('change', function() { self.invalidate_checks.call(self, checkbox.checked, data.custom_node?.installed); }); - - var data1 = document.createElement('td'); - data1.style.textAlign = "center"; - data1.innerHTML = i+1; - var data2 = document.createElement('td'); - data2.innerHTML = ` ${data.tags}`; - var data3 = document.createElement('td'); - var data4 = document.createElement('td'); - if(data.custom_node) { - data3.innerHTML = ` ${data.custom_node.author}`; - data4.innerHTML = ` ${data.custom_node.title}`; - } - else { - data3.innerHTML = ` Unknown`; - data4.innerHTML = ` Unknown`; - } - var data5 = document.createElement('td'); - data5.innerHTML = data.description; - var data6 = document.createElement('td'); - data6.style.textAlign = "center"; - - var installBtn = document.createElement('button'); - var installBtn2 = null; - var installBtn3 = null; - - if(data.custom_node) { - this.install_buttons.push(installBtn); - - switch(data.custom_node.installed) { - case 'Disabled': - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Enable'; - installBtn3.style.backgroundColor = 'blue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - installBtn.style.color = 'white'; - break; - case 'Update': - installBtn2 = document.createElement('button'); - installBtn2.innerHTML = 'Update'; - installBtn2.style.backgroundColor = 'blue'; - installBtn2.style.color = 'white'; - this.install_buttons.push(installBtn2); - - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Disable'; - installBtn3.style.backgroundColor = 'MediumSlateBlue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - installBtn.style.color = 'white'; - break; - case 'True': - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Disable'; - installBtn3.style.backgroundColor = 'MediumSlateBlue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - installBtn.style.color = 'white'; - break; - case 'False': - installBtn.innerHTML = 'Install'; - installBtn.style.backgroundColor = 'black'; - installBtn.style.color = 'white'; - break; - default: - installBtn.innerHTML = 'Try Install'; - installBtn.style.backgroundColor = 'Gray'; - installBtn.style.color = 'white'; - } - - let j = i; - if(installBtn2 != null) { - installBtn2.style.width = "120px"; - installBtn2.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'update'); - }); - - data6.appendChild(installBtn2); - } - - if(installBtn3 != null) { - installBtn3.style.width = "120px"; - installBtn3.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'toggle_active'); - }); - - data6.appendChild(installBtn3); - } - - - installBtn.style.width = "120px"; - installBtn.addEventListener('click', function() { - if(this.innerHTML == 'Uninstall') { - if (confirm(`Are you sure uninstall ${data.title}?`)) { - install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'uninstall'); - } - } - else { - install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'install'); - } - }); - - data6.appendChild(installBtn); - } - - dataRow.style.backgroundColor = "var(--bg-color)"; - dataRow.style.color = "var(--fg-color)"; - dataRow.style.textAlign = "left"; - - dataRow.appendChild(data0); - dataRow.appendChild(data1); - dataRow.appendChild(data2); - dataRow.appendChild(data3); - dataRow.appendChild(data4); - dataRow.appendChild(data5); - dataRow.appendChild(data6); - tbody.appendChild(dataRow); - - let buttons = []; - if(installBtn) { - buttons.push(installBtn); - } - if(installBtn2) { - buttons.push(installBtn2); - } - if(installBtn3) { - buttons.push(installBtn3); - } - - this.grid_rows[i] = {data:data, buttons:buttons, checkbox:checkbox, control:dataRow}; - } - - const panel = document.createElement('div'); - panel.style.width = "100%"; - panel.appendChild(grid); - - function handleResize() { - const parentHeight = self.element.clientHeight; - const gridHeight = parentHeight - 200; - - grid.style.height = gridHeight + "px"; - } - window.addEventListener("resize", handleResize); - - grid.style.position = "relative"; - grid.style.display = "inline-block"; - grid.style.width = "100%"; - grid.style.height = "100%"; - grid.style.overflowY = "scroll"; - this.element.style.height = "85%"; - this.element.style.width = "80%"; - this.element.appendChild(panel); - - handleResize(); - } - - createFilterCombo() { - let combo = document.createElement("select"); - - combo.style.cssFloat = "left"; - combo.style.fontSize = "14px"; - combo.style.padding = "4px"; - combo.style.background = "black"; - combo.style.marginLeft = "2px"; - combo.style.width = "199px"; - combo.id = `combo-manger-filter`; - combo.style.borderRadius = "15px"; - - let items = - [ - { value:'*', text:'Filter: all' }, - { value:'Disabled', text:'Filter: disabled' }, - { value:'Update', text:'Filter: update' }, - { value:'True', text:'Filter: installed' }, - { value:'False', text:'Filter: not-installed' }, - ]; - - items.forEach(item => { - const option = document.createElement("option"); - option.value = item.value; - option.text = item.text; - combo.appendChild(option); - }); - - let self = this; - combo.addEventListener('change', function(event) { - self.filter = event.target.value; - self.apply_searchbox(); - }); - - if(self.filter) { - combo.value = self.filter; - } - - return combo; - } - - createHeaderControls() { - let self = this; - this.search_box = $el('input.cm-search-filter', {type:'text', id:'manager-alternode-search-box', placeholder:'input search keyword', value:this.search_keyword}, []); - this.search_box.style.height = "25px"; - this.search_box.onkeydown = (event) => { - if (event.key === 'Enter') { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - } - if (event.key === 'Escape') { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - } - }; - - let search_button = document.createElement("button"); - search_button.className = "cm-small-button"; - search_button.innerHTML = "Search"; - search_button.onclick = () => { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - }; - search_button.style.display = "inline-block"; - - let filter_control = this.createFilterCombo(); - filter_control.style.display = "inline-block"; - - let cell = $el('td', {width:'100%'}, [filter_control, this.search_box, ' ', search_button]); - let search_control = $el('table', {width:'100%'}, - [ - $el('tr', {}, [cell]) - ] - ); - - cell.style.textAlign = "right"; - this.element.appendChild(search_control); - } - - async createBottomControls() { - var close_button = document.createElement("button"); - close_button.className = "cm-small-button"; - close_button.innerHTML = "Close"; - close_button.onclick = () => { this.close(); } - close_button.style.display = "inline-block"; - - this.message_box = $el('div', {id:'alternatives-installer-message'}, [$el('br'), '']); - this.message_box.style.height = '60px'; - this.message_box.style.verticalAlign = 'middle'; - - this.element.appendChild(this.message_box); - this.element.appendChild(close_button); - } - - async show() { - try { - this.invalidateControl(); - this.element.style.display = "block"; - this.element.style.zIndex = 10001; - } - catch(exception) { - app.ui.dialog.show(`Failed to get alternatives list. / ${exception}`); - console.error(exception); - } - } -} diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index ab23bddf..1f07f4a5 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -11,8 +11,7 @@ import { 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"; +import { CustomNodesManager } from "./custom-nodes-manager.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, show_message } from "./common.js"; @@ -568,10 +567,10 @@ async function fetchUpdates(update_check_checkbox) { async function() { app.ui.dialog.close(); - if(!CustomNodesInstaller.instance) - CustomNodesInstaller.instance = new CustomNodesInstaller(app, self); - - await CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.UPDATE); + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + await CustomNodesManager.instance.show(CustomNodesManager.ShowMode.UPDATE); } ); @@ -714,12 +713,13 @@ class ManagerMenuDialog extends ComfyDialog { [ $el("button.cm-button", { type: "button", - textContent: "Install Custom Nodes", + textContent: "Custom Nodes Manager", onclick: () => { - if(!CustomNodesInstaller.instance) - CustomNodesInstaller.instance = new CustomNodesInstaller(app, self); - CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.NORMAL); + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.NORMAL); } }), @@ -728,9 +728,10 @@ class ManagerMenuDialog extends ComfyDialog { textContent: "Install Missing Custom Nodes", onclick: () => { - if(!CustomNodesInstaller.instance) - CustomNodesInstaller.instance = new CustomNodesInstaller(app, self); - CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.MISSING_NODES); + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.MISSING); } }), @@ -768,9 +769,10 @@ class ManagerMenuDialog extends ComfyDialog { textContent: "Alternatives of A1111", onclick: () => { - if(!AlternativesInstaller.instance) - AlternativesInstaller.instance = new AlternativesInstaller(app, self); - AlternativesInstaller.instance.show(); + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.ALTERNATIVES); } }), diff --git a/js/common.js b/js/common.js index 9fb7a182..7090855f 100644 --- a/js/common.js +++ b/js/common.js @@ -24,72 +24,6 @@ export function rebootAPI() { return false; } -export async function install_checked_custom_node(grid_rows, target_i, caller, mode) { - if(caller) { - let failed = ''; - - caller.disableButtons(); - - for(let i in grid_rows) { - if(!grid_rows[i].checkbox.checked && i != target_i) - continue; - - var target; - - if(grid_rows[i].data.custom_node) { - target = grid_rows[i].data.custom_node; - } - else { - target = grid_rows[i].data; - } - - caller.startInstall(target); - - try { - const response = await api.fetchApi(`/customnode/${mode}`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(target) - }); - - if(response.status == 403) { - show_message('This action is not allowed with this security level configuration.'); - caller.updateMessage(''); - await caller.invalidateControl(); - return; - } - - if(response.status == 404) { - show_message('With the current security level configuration, only custom nodes from the "default channel" can be installed.'); - caller.updateMessage(''); - await caller.invalidateControl(); - return; - } - - if(response.status == 400) { - show_message(`${mode} failed: ${target.title}`); - continue; - } - - const status = await response.json(); - app.ui.dialog.close(); - target.installed = 'True'; - continue; - } - catch(exception) { - failed += `
${target.title}`; - } - } - - if(failed != '') { - show_message(`${mode} failed: ${failed}`); - } - - await caller.invalidateControl(); - caller.updateMessage("
To apply the installed/updated/disabled/enabled custom node, please ComfyUI. And refresh browser.", 'cm-reboot-button1'); - } -}; - export var manager_instance = null; export function setManagerInstance(obj) { diff --git a/js/custom-nodes-downloader.js b/js/custom-nodes-downloader.js deleted file mode 100644 index e60cde7e..00000000 --- a/js/custom-nodes-downloader.js +++ /dev/null @@ -1,943 +0,0 @@ -import { app } from "../../scripts/app.js"; -import { api } from "../../scripts/api.js" -import { ComfyDialog, $el } from "../../scripts/ui.js"; -import { install_checked_custom_node, manager_instance, rebootAPI } from "./common.js"; - - -async function getCustomNodes() { - var mode = manager_instance.datasrc_combo.value; - - var skip_update = ""; - if(manager_instance.update_check_checkbox.checked) - skip_update = "&skip_update=true"; - - const response = await api.fetchApi(`/customnode/getlist?mode=${mode}${skip_update}`); - - const data = await response.json(); - return data; -} - -async function getCustomnodeMappings() { - var mode = manager_instance.datasrc_combo.value; - - const response = await api.fetchApi(`/customnode/getmappings?mode=${mode}`); - - const data = await response.json(); - return data; -} - -async function getConflictMappings() { - var mode = manager_instance.datasrc_combo.value; - - const response = await api.fetchApi(`/customnode/getmappings?mode=${mode}`); - - const data = await response.json(); - - let node_to_extensions_map = {}; - - for(let k in data) { - for(let i in data[k][0]) { - let node = data[k][0][i]; - let l = node_to_extensions_map[node]; - if(!l) { - l = []; - node_to_extensions_map[node] = l; - } - l.push(k); - } - } - - let conflict_map = {}; - for(let node in node_to_extensions_map) { - if(node_to_extensions_map[node].length > 1) { - for(let i in node_to_extensions_map[node]) { - let extension = node_to_extensions_map[node][i]; - let l = conflict_map[extension]; - - if(!l) { - l = []; - conflict_map[extension] = l; - } - - for(let j in node_to_extensions_map[node]) { - let extension2 = node_to_extensions_map[node][j]; - if(extension != extension2) - l.push([node, extension2]); - } - } - } - } - - return conflict_map; -} - -async function getUnresolvedNodesInComponent() { - try { - var mode = manager_instance.datasrc_combo.value; - - const response = await api.fetchApi(`/component/get_unresolved`); - - const data = await response.json(); - return data.nodes; - } - catch { - return []; - } -} - -export class CustomNodesInstaller extends ComfyDialog { - static instance = null; - - install_buttons = []; - message_box = null; - data = null; - - static ShowMode = { - NORMAL: 0, - MISSING_NODES: 1, - UPDATE: 2, - }; - - clear() { - this.install_buttons = []; - this.message_box = null; - this.data = null; - } - - constructor(app, manager_dialog) { - super(); - this.manager_dialog = manager_dialog; - this.search_keyword = ''; - this.element = $el("div.comfy-modal", { parent: document.body }, []); - - this.currentSortProperty = ''; // The property currently being sorted - this.currentSortAscending = true; // The direction of the current sort - } - - startInstall(target) { - const self = CustomNodesInstaller.instance; - - self.updateMessage(`
Installing '${target.title}'`); - } - - disableButtons() { - for(let i in this.install_buttons) { - this.install_buttons[i].disabled = true; - this.install_buttons[i].style.backgroundColor = 'gray'; - } - } - - apply_searchbox(data) { - let keyword = this.search_box.value.toLowerCase(); - for(let i in this.grid_rows) { - let data = this.grid_rows[i].data; - let content = data.author.toLowerCase() + data.description.toLowerCase() + data.title.toLowerCase() + data.reference.toLowerCase(); - - if(this.filter && this.filter != '*') { - if(this.filter == 'True' && (data.installed == 'Update' || data.installed == 'Fail')) { - this.grid_rows[i].control.style.display = null; - } - else if(this.filter != data.installed) { - this.grid_rows[i].control.style.display = 'none'; - continue; - } - } - - if(keyword == "") - this.grid_rows[i].control.style.display = null; - else if(content.includes(keyword)) { - this.grid_rows[i].control.style.display = null; - } - else { - this.grid_rows[i].control.style.display = 'none'; - } - } - } - - async filter_missing_node(data) { - const mappings = await getCustomnodeMappings(); - - // build regex->url map - const regex_to_url = []; - for (let i in data) { - if(data[i]['nodename_pattern']) { - let item = {regex: new RegExp(data[i].nodename_pattern), url: data[i].files[0]}; - regex_to_url.push(item); - } - } - - // build name->url map - const name_to_urls = {}; - for (const url in mappings) { - const names = mappings[url]; - - for(const name in names[0]) { - let v = name_to_urls[names[0][name]]; - if(v == undefined) { - v = []; - name_to_urls[names[0][name]] = v; - } - v.push(url); - } - } - - const registered_nodes = new Set(); - for (let i in LiteGraph.registered_node_types) { - registered_nodes.add(LiteGraph.registered_node_types[i].type); - } - - const missing_nodes = new Set(); - const workflow = app.graph.serialize(); - const group_nodes = workflow.extra && workflow.extra.groupNodes ? workflow.extra.groupNodes : []; - let nodes = workflow.nodes; - - for (let i in group_nodes) { - let group_node = group_nodes[i]; - nodes = nodes.concat(group_node.nodes); - } - - for (let i in nodes) { - const node_type = nodes[i].type; - if(node_type.startsWith('workflow/')) - continue; - - if (!registered_nodes.has(node_type)) { - const urls = name_to_urls[node_type.trim()]; - if(urls) - urls.forEach(url => { - missing_nodes.add(url); - }); - else { - for(let j in regex_to_url) { - if(regex_to_url[j].regex.test(node_type)) { - missing_nodes.add(regex_to_url[j].url); - } - } - } - } - } - - let unresolved_nodes = await getUnresolvedNodesInComponent(); - for (let i in unresolved_nodes) { - let node_type = unresolved_nodes[i]; - const url = name_to_urls[node_type]; - if(url) - missing_nodes.add(url); - } - - return data.filter(node => node.files.some(file => missing_nodes.has(file))); - } - - async invalidateControl() { - this.clear(); - - // splash - while (this.element.children.length) { - this.element.removeChild(this.element.children[0]); - } - - const msg = $el('div', {id:'custom-message'}, - [$el('br'), - 'The custom node DB is currently being updated, and updates to custom nodes are being checked for.', - $el('br'), - 'NOTE: Update only checks for extensions that have been fetched.', - $el('br')]); - msg.style.height = '100px'; - msg.style.verticalAlign = 'middle'; - msg.style.color = "var(--fg-color)"; - - this.element.appendChild(msg); - - // invalidate - let data = await getCustomNodes(); - this.data = data.custom_nodes; - this.channel = data.channel; - - this.conflict_mappings = await getConflictMappings(); - - if(this.show_mode == CustomNodesInstaller.ShowMode.MISSING_NODES) - this.data = await this.filter_missing_node(this.data); - - this.element.removeChild(msg); - - while (this.element.children.length) { - this.element.removeChild(this.element.children[0]); - } - - this.createHeaderControls(); - await this.createGrid(); - this.apply_searchbox(this.data); - this.createBottomControls(); - } - - updateMessage(msg, btn_id) { - this.message_box.innerHTML = msg; - if(btn_id) { - const rebootButton = document.getElementById(btn_id); - const self = this; - rebootButton.addEventListener("click", - function() { - if(rebootAPI()) { - self.close(); - self.manager_dialog.close(); - } - }); - console.log(rebootButton); - } - } - - invalidate_checks(is_checked, install_state) { - if(is_checked) { - for(let i in this.grid_rows) { - let data = this.grid_rows[i].data; - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - - checkbox.disabled = data.installed != install_state; - - if(checkbox.disabled) { - for(let j in buttons) { - buttons[j].style.display = 'none'; - } - } - else { - for(let j in buttons) { - buttons[j].style.display = null; - } - } - } - - this.checkbox_all.disabled = false; - } - else { - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(checkbox.check) - return; // do nothing - } - - // every checkbox is unchecked -> enable all checkbox - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - checkbox.disabled = false; - - for(let j in buttons) { - buttons[j].style.display = null; - } - } - - this.checkbox_all.checked = false; - this.checkbox_all.disabled = true; - } - } - - check_all(is_checked) { - if(is_checked) { - // lookup first checked item's state - let check_state = null; - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(checkbox.checked) { - check_state = this.grid_rows[i].data.installed; - } - } - - if(check_state == null) - return; - - // check only same state items - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(this.grid_rows[i].data.installed == check_state) - checkbox.checked = true; - } - } - else { - // uncheck all - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - checkbox.checked = false; - checkbox.disabled = false; - - for(let j in buttons) { - buttons[j].style.display = null; - } - } - - this.checkbox_all.disabled = true; - } - } - - sortData(property, ascending = true) { - this.data.sort((a, b) => { - // Check if either value is -1 and handle accordingly - if (a[property] === -1) return 1; // Always put a at the end if its value is -1 - if (b[property] === -1) return -1; // Always put b at the end if its value is -1 - // And be careful here, (-1<'2024-01-01') and (-1>'2024-01-01') are both false! So I handle -1 seperately. - if (a[property] < b[property]) return ascending ? -1 : 1; - if (a[property] > b[property]) return ascending ? 1 : -1; - return 0; - }); - } - - resetHeaderStyles() { - const headers = ['th_author', 'th_title', 'th_stars', 'th_last_update']; // Add the IDs of all your sortable headers here - headers.forEach(headerId => { - const header = this.element.querySelector(`#${headerId}`); - if (header) { - header.style.backgroundColor = ''; // Reset to default background color - // Add other style resets if necessary - } - }); - } - - toggleSort(property) { - // If currently sorted by this property, toggle the direction; else, sort ascending - if (this.currentSortProperty === property) { - this.currentSortAscending = !this.currentSortAscending; - } else { - this.currentSortAscending = false; - } - this.currentSortProperty = property; - - this.resetHeaderStyles(); // Reset styles of all sortable headers - - // Determine the ID of the header based on the property - let headerId = ''; - if (property === 'stars') { - headerId = 'th_stars'; - } else if (property === 'last_update') { - headerId = 'th_last_update'; - } else if (property === 'author') { - headerId = 'th_author'; - } else if (property === 'title') { - headerId = 'th_title'; - } - - // If we have a valid headerId, change its style to indicate it's the active sort column - if (headerId) { - const activeHeader = this.element.querySelector(`#${headerId}`); - if (activeHeader) { - activeHeader.style.backgroundColor = '#222'; - // Slightly brighter. Add other style changes if necessary. - } - } - - // Call sortData with the current property and direction - this.sortData(property, this.currentSortAscending); - - // Refresh the grid to display sorted data - this.createGrid(); - this.apply_searchbox(this.data); - } - - async createGrid() { - // Remove existing table if present - var grid = this.element.querySelector('#custom-nodes-grid'); - var panel; - let self = this; - if (grid) { - grid.querySelector('tbody').remove(); - panel = grid.parentNode; - } else { - grid = document.createElement('table'); - grid.setAttribute('id', 'custom-nodes-grid'); - - this.grid_rows = {}; - - var thead = document.createElement('thead'); - - var headerRow = document.createElement('tr'); - thead.style.position = "sticky"; - thead.style.top = "0px"; - thead.style.borderCollapse = "collapse"; - thead.style.tableLayout = "fixed"; - - var header0 = document.createElement('th'); - header0.style.width = "20px"; - this.checkbox_all = $el("input",{type:'checkbox', id:'check_all'},[]); - header0.appendChild(this.checkbox_all); - this.checkbox_all.checked = false; - this.checkbox_all.disabled = true; - this.checkbox_all.addEventListener('change', function() { self.check_all.call(self, self.checkbox_all.checked); }); - - var header1 = document.createElement('th'); - header1.innerHTML = '  ID  '; - header1.style.width = "20px"; - - var header2 = document.createElement('th'); - header2.innerHTML = 'Author'; - header2.style.width = "150px"; - header2.style.cursor = 'pointer'; - header2.setAttribute('id', 'th_author'); - header2.onclick = () => this.toggleSort('author'); - - var header3 = document.createElement('th'); - header3.innerHTML = 'Name'; - header3.style.width = "20%"; - header3.style.cursor = 'pointer'; - header3.setAttribute('id', 'th_title'); - header3.onclick = () => this.toggleSort('title'); - - var header4 = document.createElement('th'); - header4.innerHTML = 'Description'; - header4.style.width = "60%"; - // header4.classList.add('expandable-column'); - - var header5 = document.createElement('th'); - header5.innerHTML = '   ★   '; - header5.style.width = "130px"; - header5.setAttribute('id', 'th_stars'); - header5.style.cursor = 'pointer'; - header5.onclick = () => this.toggleSort('stars'); - - var header6 = document.createElement('th'); - header6.innerHTML = 'Last Update'; - header6.style.width = "130px"; - header6.setAttribute('id', 'th_last_update'); - header6.style.cursor = 'pointer'; - header6.onclick = () => this.toggleSort('last_update'); - - var header7 = document.createElement('th'); - header7.innerHTML = 'Install'; - header7.style.width = "130px"; - - header0.style.position = "sticky"; - header0.style.top = "0px"; - header1.style.position = "sticky"; - header1.style.top = "0px"; - header2.style.position = "sticky"; - header2.style.top = "0px"; - header3.style.position = "sticky"; - header3.style.top = "0px"; - header4.style.position = "sticky"; - header4.style.top = "0px"; - header5.style.position = "sticky"; - header5.style.top = "0px"; - header6.style.position = "sticky"; - header6.style.top = "0px"; - header7.style.position = "sticky"; - header7.style.top = "0px"; - - thead.appendChild(headerRow); - headerRow.appendChild(header0); - headerRow.appendChild(header1); - headerRow.appendChild(header2); - headerRow.appendChild(header3); - headerRow.appendChild(header4); - headerRow.appendChild(header5); - headerRow.appendChild(header6); - headerRow.appendChild(header7); - - headerRow.style.backgroundColor = "Black"; - headerRow.style.color = "White"; - headerRow.style.textAlign = "center"; - headerRow.style.width = "100%"; - headerRow.style.padding = "0"; - - grid.appendChild(thead); - - panel = document.createElement('div'); - panel.style.width = "100%"; - panel.appendChild(grid); - this.element.appendChild(panel); - } - var tbody = document.createElement('tbody'); - grid.appendChild(tbody); - - if(this.data) - for (var i = 0; i < this.data.length; i++) { - const data = this.data[i]; - let dataRow = document.createElement('tr'); - - let data0 = document.createElement('td'); - let checkbox = $el("input",{type:'checkbox', id:`check_${i}`},[]); - data0.appendChild(checkbox); - checkbox.checked = false; - checkbox.addEventListener('change', function() { self.invalidate_checks.call(self, checkbox.checked, data.installed); }); - - var data1 = document.createElement('td'); - data1.style.textAlign = "center"; - data1.innerHTML = i+1; - - var data2 = document.createElement('td'); - data2.style.maxWidth = "100px"; - data2.className = "cm-node-author" - data2.textContent = ` ${data.author}`; - data2.style.whiteSpace = "nowrap"; - data2.style.overflow = "hidden"; - data2.style.textOverflow = "ellipsis"; - - var data3 = document.createElement('td'); - data3.style.maxWidth = "200px"; - data3.style.wordWrap = "break-word"; - data3.className = "cm-node-name" - data3.innerHTML = ` ${data.title}`; - if(data.installed == 'Fail') - data3.innerHTML = ' (IMPORT FAILED)' + data3.innerHTML; - - var data4 = document.createElement('td'); - data4.innerHTML = data.description; - data4.className = "cm-node-desc" - - let conflicts = this.conflict_mappings[data.files[0]]; - if(conflicts) { - let buf = '

Conflicted Nodes:
'; - for(let k in conflicts) { - let node_name = conflicts[k][0]; - - let extension_name = conflicts[k][1].split('/').pop(); - if(extension_name.endsWith('/')) { - extension_name = extension_name.slice(0, -1); - } - if(node_name.endsWith('.git')) { - extension_name = extension_name.slice(0, -4); - } - - buf += `${node_name} [${extension_name}], `; - } - - if(buf.endsWith(', ')) { - buf = buf.slice(0, -2); - } - buf += "

"; - data4.innerHTML += buf; - } - - var data5 = document.createElement('td'); - data5.style.maxWidth = "100px"; - data5.className = "cm-node-stars" - if(data.stars < 0) { - data5.textContent = 'N/A'; - } - else { - data5.textContent = `${data.stars}`; - } - data5.style.whiteSpace = "nowrap"; - data5.style.overflow = "hidden"; - data5.style.textOverflow = "ellipsis"; - data5.style.textAlign = "center"; - - var lastUpdateDate = new Date(); - var data6 = document.createElement('td'); - data6.style.maxWidth = "100px"; - data6.className = "cm-node-last-update"; - if(data.last_update < 0) { - data6.textContent = 'N/A'; - } - else { - data6.textContent = `${data.last_update}`.split(' ')[0]; - } - data6.style.whiteSpace = "nowrap"; - data6.style.overflow = "hidden"; - data6.style.textOverflow = "ellipsis"; - data6.style.textAlign = "center"; - - var data7 = document.createElement('td'); - data7.style.textAlign = "center"; - - var installBtn = document.createElement('button'); - installBtn.className = "cm-btn-install"; - var installBtn2 = null; - var installBtn3 = null; - var installBtn4 = null; - - this.install_buttons.push(installBtn); - - switch(data.installed) { - case 'Disabled': - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Enable'; - installBtn3.className = "cm-btn-enable"; - installBtn3.style.backgroundColor = 'blue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - break; - - case 'Update': - installBtn2 = document.createElement('button'); - installBtn2.innerHTML = 'Update'; - installBtn2.className = "cm-btn-update"; - installBtn2.style.backgroundColor = 'blue'; - installBtn2.style.color = 'white'; - this.install_buttons.push(installBtn2); - - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Disable'; - installBtn3.className = "cm-btn-disable"; - installBtn3.style.backgroundColor = 'MediumSlateBlue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - break; - - case 'Fail': - installBtn4 = document.createElement('button'); - installBtn4.innerHTML = 'Try fix'; - installBtn4.className = "cm-btn-disable"; - installBtn4.style.backgroundColor = '#6495ED'; - installBtn4.style.color = 'white'; - this.install_buttons.push(installBtn4); - - case 'True': - if(manager_instance.update_check_checkbox.checked) { - installBtn2 = document.createElement('button'); - installBtn2.innerHTML = 'Try update'; - installBtn2.className = "cm-btn-update"; - installBtn2.style.backgroundColor = 'Gray'; - installBtn2.style.color = 'white'; - this.install_buttons.push(installBtn2); - } - - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Disable'; - installBtn3.className = "cm-btn-disable"; - installBtn3.style.backgroundColor = 'MediumSlateBlue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - break; - case 'False': - installBtn.innerHTML = 'Install'; - installBtn.style.backgroundColor = 'black'; - installBtn.style.color = 'white'; - break; - - default: - installBtn.innerHTML = `Try Install`; - installBtn.style.backgroundColor = 'Gray'; - installBtn.style.color = 'white'; - } - - let j = i; - if(installBtn2 != null) { - installBtn2.style.width = "120px"; - installBtn2.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'update'); - }); - - data7.appendChild(installBtn2); - } - - if(installBtn3 != null) { - installBtn3.style.width = "120px"; - installBtn3.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'toggle_active'); - }); - - data7.appendChild(installBtn3); - } - - if(installBtn4 != null) { - installBtn4.style.width = "120px"; - installBtn4.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'fix'); - }); - - data7.appendChild(installBtn4); - } - - installBtn.style.width = "120px"; - installBtn.addEventListener('click', function() { - if(this.innerHTML == 'Uninstall') { - if (confirm(`Are you sure uninstall ${data.title}?`)) { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'uninstall'); - } - } - else { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'install'); - } - }); - - if(!data.author.startsWith('#NOTICE')){ - data7.appendChild(installBtn); - } - - if(data.installed == 'Fail' || data.author.startsWith('#NOTICE')) - dataRow.style.backgroundColor = "#880000"; - else - dataRow.style.backgroundColor = "var(--bg-color)"; - dataRow.style.color = "var(--fg-color)"; - dataRow.style.textAlign = "left"; - - dataRow.appendChild(data0); - dataRow.appendChild(data1); - dataRow.appendChild(data2); - dataRow.appendChild(data3); - dataRow.appendChild(data4); - dataRow.appendChild(data5); - dataRow.appendChild(data6); - dataRow.appendChild(data7); - tbody.appendChild(dataRow); - - let buttons = []; - if(installBtn) { - buttons.push(installBtn); - } - if(installBtn2) { - buttons.push(installBtn2); - } - if(installBtn3) { - buttons.push(installBtn3); - } - - this.grid_rows[i] = {data:data, buttons:buttons, checkbox:checkbox, control:dataRow}; - } - - function handleResize() { - const parentHeight = self.element.clientHeight; - const gridHeight = parentHeight - 200; - - grid.style.height = gridHeight + "px"; - } - window.addEventListener("resize", handleResize); - - grid.style.position = "relative"; - grid.style.display = "inline-block"; - grid.style.width = "100%"; - grid.style.height = "100%"; - grid.style.overflowY = "scroll"; - this.element.style.height = "85%"; - this.element.style.width = "80%"; - - handleResize(); - } - - createFilterCombo() { - let combo = document.createElement("select"); - - combo.style.cssFloat = "left"; - combo.style.fontSize = "14px"; - combo.style.padding = "4px"; - combo.style.background = "black"; - combo.style.marginLeft = "2px"; - combo.style.width = "199px"; - combo.id = `combo-manger-filter`; - combo.style.borderRadius = "15px"; - - let items = - [ - { value:'*', text:'Filter: all' }, - { value:'Disabled', text:'Filter: disabled' }, - { value:'Update', text:'Filter: update' }, - { value:'True', text:'Filter: installed' }, - { value:'False', text:'Filter: not-installed' }, - { value:'Fail', text:'Filter: import failed' }, - ]; - - items.forEach(item => { - const option = document.createElement("option"); - option.value = item.value; - option.text = item.text; - combo.appendChild(option); - }); - - if(this.show_mode == CustomNodesInstaller.ShowMode.UPDATE) { - this.filter = 'Update'; - } - else if(this.show_mode == CustomNodesInstaller.ShowMode.MISSING_NODES) { - this.filter = '*'; - } - - let self = this; - combo.addEventListener('change', function(event) { - self.filter = event.target.value; - self.apply_searchbox(); - }); - - if(self.filter) { - combo.value = self.filter; - } - - return combo; - } - - createHeaderControls() { - let self = this; - this.search_box = $el('input.cm-search-filter', {type:'text', id:'manager-customnode-search-box', placeholder:'input search keyword', value:this.search_keyword}, []); - this.search_box.style.height = "25px"; - this.search_box.onkeydown = (event) => { - if (event.key === 'Enter') { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - } - if (event.key === 'Escape') { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - } - }; - - - let search_button = document.createElement("button"); - search_button.className = "cm-small-button"; - search_button.innerHTML = "Search"; - search_button.onclick = () => { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - }; - search_button.style.display = "inline-block"; - - let filter_control = this.createFilterCombo(); - filter_control.style.display = "inline-block"; - - let channel_badge = ''; - if(this.channel != 'default') { - channel_badge = $el('span', {id:'cm-channel-badge'}, [`Channel: ${this.channel} (Incomplete list)`]); - } - else { - - } - let cell = $el('td', {width:'100%'}, [filter_control, channel_badge, this.search_box, ' ', search_button]); - let search_control = $el('table', {width:'100%'}, - [ - $el('tr', {}, [cell]) - ] - ); - - cell.style.textAlign = "right"; - - this.element.appendChild(search_control); - } - - async createBottomControls() { - var close_button = document.createElement("button"); - close_button.className = "cm-small-button"; - close_button.innerHTML = "Close"; - close_button.onclick = () => { this.close(); } - close_button.style.display = "inline-block"; - - this.message_box = $el('div', {id:'custom-installer-message'}, [$el('br'), '']); - this.message_box.style.height = '60px'; - this.message_box.style.verticalAlign = 'middle'; - - this.element.appendChild(this.message_box); - this.element.appendChild(close_button); - } - - async show(show_mode) { - this.show_mode = show_mode; - - if(this.show_mode != CustomNodesInstaller.ShowMode.NORMAL) { - this.search_keyword = ''; - } - - try { - this.invalidateControl(); - - this.element.style.display = "block"; - this.element.style.zIndex = 10001; - } - catch(exception) { - app.ui.dialog.show(`Failed to get custom node list. / ${exception}`); - } - } -} \ No newline at end of file diff --git a/js/custom-nodes-manager.js b/js/custom-nodes-manager.js new file mode 100644 index 00000000..a89e1b39 --- /dev/null +++ b/js/custom-nodes-manager.js @@ -0,0 +1,1524 @@ +import { app } from "../../scripts/app.js"; +import { api } from "../../scripts/api.js" +import { $el } from "../../scripts/ui.js"; +import { manager_instance, rebootAPI, install_via_git_url } from "./common.js"; + +// https://cenfun.github.io/turbogrid/api.html +import TG from "./turbogrid.esm.js"; + +const icons = { + search: '', + extensions: '', + conflicts: '' +} + +const pageCss = ` +.cn-manager { + --grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + z-index: 10001; + width: 80%; + height: 80%; + display: flex; + flex-direction: column; + gap: 10px; + color: var(--fg-color); + font-family: arial, sans-serif; +} + +.cn-manager .cn-flex-auto { + flex: auto; +} + +.cn-manager button { + font-size: 16px; + color: var(--input-text); + background-color: var(--comfy-input-bg); + border-radius: 8px; + border-color: var(--border-color); + border-style: solid; + margin: 0; + padding: 4px 8px; + min-width: 100px; +} + +.cn-manager button:disabled, +.cn-manager input:disabled, +.cn-manager select:disabled { + color: gray; +} + +.cn-manager button:disabled { + background-color: var(--comfy-input-bg); +} + +.cn-manager .cn-manager-restart { + display: none; + background-color: #500000; + color: white; +} + +.cn-manager-header { + display: flex; + flex-wrap: wrap; + gap: 5px; + align-items: center; + padding: 0 5px; +} + +.cn-manager-header label { + display: flex; + gap: 5px; + align-items: center; +} + +.cn-manager-filter { + height: 28px; + line-height: 28px; +} + +.cn-manager-keywords { + height: 28px; + line-height: 28px; + padding: 0 5px 0 26px; + background-size: 16px; + background-position: 5px center; + background-repeat: no-repeat; + background-image: url("data:image/svg+xml;charset=utf8,${encodeURIComponent(icons.search.replace("currentColor", "#888"))}"); +} + +.cn-manager-status { + padding-left: 10px; +} + +.cn-manager-grid { + flex: auto; + border: 1px solid var(--border-color); + overflow: hidden; +} + +.cn-manager-selection { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.cn-manager-message { + +} + +.cn-manager-footer { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.cn-manager-grid .tg-turbogrid { + font-family: var(--grid-font); + font-size: 15px; + background: var(--bg-color); +} + +.cn-manager-grid .cn-node-name a { + color: skyblue; + text-decoration: none; +} + +.cn-manager-grid .cn-node-desc a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +.cn-manager-grid .tg-cell a:hover { + text-decoration: underline; +} + +.cn-manager-grid .cn-extensions-button, +.cn-manager-grid .cn-conflicts-button { + display: inline-block; + width: 20px; + height: 20px; + color: green; + border: none; + padding: 0; + margin: 0; + background: none; + min-width: 20px; +} + +.cn-manager-grid .cn-conflicts-button { + color: orange; +} + +.cn-manager-grid .cn-extensions-list, +.cn-manager-grid .cn-conflicts-list { + line-height: normal; + text-align: left; + max-height: 80%; + min-height: 200px; + min-width: 300px; + overflow-y: auto; + font-size: 12px; + border-radius: 5px; + padding: 10px; + filter: drop-shadow(2px 5px 5px rgb(0 0 0 / 30%)); +} + +.cn-manager-grid .cn-extensions-list { + border-color: var(--bg-color); +} + +.cn-manager-grid .cn-conflicts-list { + background-color: #CCCC55; + color: #AA3333; +} + +.cn-manager-grid .cn-extensions-list h3, +.cn-manager-grid .cn-conflicts-list h3 { + margin: 0; + padding: 5px 0; + color: #000; +} + +.cn-tag-list { + display: flex; + flex-wrap: wrap; + gap: 5px; + align-items: center; + margin-bottom: 5px; +} + +.cn-tag-list > div { + background-color: var(--border-color); + border-radius: 5px; + padding: 0 5px; +} + +.cn-install-buttons { + display: flex; + flex-direction: column; + gap: 3px; + padding: 3px; + align-items: center; + justify-content: center; + height: 100%; +} + +.cn-selected-buttons { + display: flex; + gap: 5px; + align-items: center; + padding-right: 20px; +} + +.cn-manager .cn-btn-enable { + background-color: blue; + color: white; +} + +.cn-manager .cn-btn-disable { + background-color: MediumSlateBlue; + color: white; +} + +.cn-manager .cn-btn-update { + background-color: blue; + color: white; +} + +.cn-manager .cn-btn-try-update { + background-color: Gray; + color: white; +} + +.cn-manager .cn-btn-try-fix { + background-color: #6495ED; + color: white; +} + +.cn-manager .cn-btn-install { + background-color: black; + color: white; +} + +.cn-manager .cn-btn-try-install { + background-color: Gray; + color: white; +} + +.cn-manager .cn-btn-uninstall { + background-color: red; + color: white; +} + +@keyframes cn-btn-loading-bg { + 0% { + left: 0; + } + 100% { + left: -100px; + } +} + +.cn-manager button.cn-btn-loading { + position: relative; + overflow: hidden; + border-color: rgb(0 119 207 / 80%); + background-color: var(--comfy-input-bg); +} + +.cn-manager button.cn-btn-loading::after { + position: absolute; + top: 0; + left: 0; + content: ""; + width: 500px; + height: 100%; + background-image: repeating-linear-gradient( + -45deg, + rgb(0 119 207 / 30%), + rgb(0 119 207 / 30%) 10px, + transparent 10px, + transparent 15px + ); + animation: cn-btn-loading-bg 3s linear infinite; +} + +.cn-manager-light .cn-node-name a { + color: blue; +} + +.cn-manager-light .cm-warn-note { + background-color: #ccc !important; +} + +.cn-manager-light .cn-btn-install { + background-color: #333; +} + +`; + +const pageHtml = ` +
+ + +
+
+
+
+
+
+
+ +`; + +const ShowMode = { + NORMAL: "Normal", + UPDATE: "Update", + MISSING: "Missing", + ALTERNATIVES: "Alternatives" +}; + +export class CustomNodesManager { + static instance = null; + static ShowMode = ShowMode; + + constructor(app, manager_dialog) { + this.app = app; + this.manager_dialog = manager_dialog; + this.id = "cn-manager"; + + app.registerExtension({ + name: "Comfy.CustomNodesManager", + afterConfigureGraph: (missingNodeTypes) => { + const item = this.getFilterItem(ShowMode.MISSING); + if (item) { + item.hasData = false; + item.hashMap = null; + } + } + }); + + this.filter = ''; + this.keywords = ''; + this.restartMap = {}; + + this.init(); + } + + init() { + + if (!document.querySelector(`style[context="${this.id}"]`)) { + const $style = document.createElement("style"); + $style.setAttribute("context", this.id); + $style.innerHTML = pageCss; + document.head.appendChild($style); + } + + this.element = $el("div", { + parent: document.body, + className: "comfy-modal cn-manager" + }); + this.element.innerHTML = pageHtml; + this.initFilter(); + this.bindEvents(); + this.initGrid(); + } + + initFilter() { + const $filter = this.element.querySelector(".cn-manager-filter"); + const filterList = [{ + label: "All", + value: "", + hasData: true + }, { + label: "Installed", + value: "True", + hasData: true + }, { + label: "Disabled", + value: "Disabled", + hasData: true + }, { + label: "Import Failed", + value: "Fail", + hasData: true + }, { + label: "Not Installed", + value: "False", + hasData: true + }, { + label: "Unknown", + value: "None", + hasData: true + }, { + label: "Update", + value: ShowMode.UPDATE, + hasData: false + }, { + label: "Missing", + value: ShowMode.MISSING, + hasData: false + }, { + label: "Alternatives of A1111", + value: ShowMode.ALTERNATIVES, + hasData: false + }]; + this.filterList = filterList; + $filter.innerHTML = filterList.map(item => { + return `` + }).join(""); + } + + getFilterItem(filter) { + return this.filterList.find(it => it.value === filter) + } + + getInstallButtons(installed, title) { + + const buttons = { + "enable": { + label: "Enable", + mode: "toggle_active" + }, + "disable": { + label: "Disable", + mode: "toggle_active" + }, + + "update": { + label: "Update", + mode: "update" + }, + "try-update": { + label: "Try update", + mode: "update" + }, + + "try-fix": { + label: "Try fix", + mode: "fix" + }, + + "install": { + label: "Install", + mode: "install" + }, + "try-install": { + label: "Try install", + mode: "install" + }, + "uninstall": { + label: "Uninstall", + mode: "uninstall" + } + } + + const installGroups = { + "Disabled": ["enable", "uninstall"], + "Update": ["update", "disable", "uninstall"], + "Fail": ["try-fix", "uninstall"], + "True": ["try-update", "disable", "uninstall"], + "False": ["install"], + 'None': ["try-install"] + } + + if (!manager_instance.update_check_checkbox.checked) { + installGroups.True = installGroups.True.filter(it => it !== "try-update"); + } + + if (title === "ComfyUI-Manager") { + installGroups.True = installGroups.True.filter(it => it !== "disable"); + } + + const list = installGroups[installed]; + if (!list) { + return ""; + } + + return list.map(id => { + const bt = buttons[id]; + return ``; + }).join(""); + } + + getButton(target) { + if(!target) { + return; + } + const mode = target.getAttribute("mode"); + if (!mode) { + return; + } + const group = target.getAttribute("group"); + if (!group) { + return; + } + return { + group, + mode, + target, + label: target.innerText + } + } + + bindEvents() { + const eventsMap = { + ".cn-manager-filter": { + change: (e) => { + + if (this.grid) { + this.grid.selectAll(false); + } + + const value = e.target.value + this.filter = value; + const item = this.getFilterItem(value); + if (item && !item.hasData) { + this.loadData(value); + return; + } + this.updateGrid(); + } + }, + + ".cn-manager-keywords": { + input: (e) => { + const keywords = `${e.target.value}`.trim(); + if (keywords !== this.keywords) { + this.keywords = keywords; + this.updateGrid(); + } + }, + focus: (e) => e.target.select() + }, + + ".cn-manager-selection": { + click: (e) => { + const btn = this.getButton(e.target); + if (btn) { + const nodes = this.selectedMap[btn.group]; + if (nodes) { + this.installNodes(nodes, btn); + } + } + } + }, + + ".cn-manager-close": { + click: (e) => this.close() + }, + + ".cn-manager-restart": { + click: () => { + if(rebootAPI()) { + this.close(); + this.manager_dialog.close(); + } + } + }, + + ".cn-manager-check-update": { + click: (e) => { + e.target.classList.add("cn-btn-loading"); + this.setFilter(ShowMode.UPDATE); + this.loadData(ShowMode.UPDATE); + } + }, + + ".cn-manager-check-missing": { + click: (e) => { + e.target.classList.add("cn-btn-loading"); + this.setFilter(ShowMode.MISSING); + this.loadData(ShowMode.MISSING); + } + }, + + ".cn-manager-install-url": { + click: (e) => { + const url = prompt("Please enter the URL of the Git repository to install", ""); + if (url !== null) { + install_via_git_url(url, this.manager_dialog); + } + } + } + }; + Object.keys(eventsMap).forEach(selector => { + const target = this.element.querySelector(selector); + if (target) { + const events = eventsMap[selector]; + if (events) { + Object.keys(events).forEach(type => { + target.addEventListener(type, events[type]); + }); + } + } + }); + } + + // =========================================================================================== + + initGrid() { + const container = this.element.querySelector(".cn-manager-grid"); + const grid = new TG.Grid(container); + this.grid = grid; + + const autoHeightColumns = ['description', "alternatives"]; + + let prevViewRowsLength = 0; + grid.bind('onUpdated', (e, d) => { + + const viewRows = grid.viewRows; + if (viewRows.length !== prevViewRowsLength) { + prevViewRowsLength = viewRows.length; + this.showStatus(`${prevViewRowsLength} custom nodes`); + } + + const visibleRowList = grid.viewport.rows; + const rows = []; + const heights = []; + + visibleRowList.forEach(function(viewIndex) { + // display index after filter is no equal global index + const rowItem = grid.getViewRowItem(viewIndex); + if (rowItem.rowHeightFixed) { + return; + } + + const list = autoHeightColumns.map(k => { + const cellNode = grid.getCellNode(rowItem, k); + if (cellNode) { + const div = cellNode.querySelector('.tg-multiline-fixing'); + // 10px is padding top and bottom + const realHeight = Math.max(TG.$(div).height() + 10, grid.options.rowHeight); + return realHeight; + } + }).filter(n => n); + + if (list.length) { + rowItem.rowHeightFixed = true; + rows.push(rowItem); + heights.push(Math.max.apply(null, list)); + } + + }); + if (!rows.length) { + return; + } + grid.setRowHeight(rows, heights); + }); + + grid.bind('onColumnWidthChanged', (e, d) => { + if (autoHeightColumns.includes(d.id)) { + // reset when column width changed + grid.forEachRow(function(row) { + row.rowHeightFixed = false; + }); + } + }); + + grid.bind('onSelectChanged', (e, changes) => { + this.renderSelected(); + }); + + grid.bind('onClick', (e, d) => { + const btn = this.getButton(d.e.target); + if (btn) { + this.installNodes([d.rowItem.hash], btn, d.rowItem.title); + } + }); + + grid.setOption({ + theme: 'dark', + selectVisible: true, + selectMultiple: true, + selectAllVisible: true, + + textSelectable: true, + scrollbarRound: true, + + frozenColumn: 1, + rowNotFound: "No Results", + + rowHeight: 30 * 3 + 3 * 4, + bindWindowResize: true, + bindContainerResize: true, + + // updateGrid handler for filter and keywords + rowFilter: (rowItem) => { + + const searchableColumns = ["title", "author", "description"]; + if (this.hasAlternatives()) { + searchableColumns.push("alternatives"); + } + + let shouldShown = grid.highlightKeywordsFilter(rowItem, searchableColumns, this.keywords); + + if (shouldShown) { + if(this.filter && rowItem.filterTypes) { + shouldShown = rowItem.filterTypes.includes(this.filter); + } + } + + return shouldShown; + } + }); + + } + + hasAlternatives() { + return this.filter === ShowMode.ALTERNATIVES + } + + renderGrid() { + + // update theme + const colorPalette = this.app.ui.settings.settingsValues['Comfy.ColorPalette']; + Array.from(this.element.classList).forEach(cn => { + if (cn.startsWith("cn-manager-")) { + this.element.classList.remove(cn); + } + }); + this.element.classList.add(`cn-manager-${colorPalette}`); + + const options = { + theme: colorPalette === "light" ? "" : "dark" + }; + + const rows = this.custom_nodes || []; + rows.forEach((item, i) => { + item.id = i + 1; + const nodeKey = item.files[0]; + const extensionInfo = this.extension_mappings[nodeKey]; + if(extensionInfo) { + const { extensions, conflicts } = extensionInfo; + if (extensions.length) { + item.extensions = extensions.length; + item.extensionsList = extensions; + } + if (conflicts) { + item.conflicts = conflicts.length; + item.conflictsList = conflicts; + } + } + }); + + const columns = [{ + id: 'id', + name: 'ID', + width: 50, + align: 'center' + }, { + id: 'title', + name: 'Title', + width: 200, + minWidth: 100, + maxWidth: 500, + classMap: 'tg-multiline cn-node-name', + formatter: (title, rowItem, columnItem) => { + return `
+ ${rowItem.installed === 'Fail' ? '(IMPORT FAILED)' : ''} + ${title} +
`; + } + }, { + id: 'installed', + name: 'Install', + width: 130, + minWidth: 110, + maxWidth: 200, + sortable: false, + align: 'center', + formatter: (installed, rowItem, columnItem) => { + if (rowItem.restart) { + return `Restart Required`; + } + const buttons = this.getInstallButtons(installed, rowItem.title); + return `
${buttons}
`; + } + }, { + id: "alternatives", + name: "Alternatives", + width: 400, + maxWidth: 5000, + invisible: !this.hasAlternatives(), + classMap: 'tg-multiline cn-node-desc', + formatter: (alternatives, rowItem, columnItem) => { + return `
${alternatives}
`; + } + }, { + id: 'description', + name: 'Description', + width: 400, + maxWidth: 5000, + classMap: 'tg-multiline cn-node-desc', + formatter: (description, rowItem, columnItem) => { + return `
${description}
`; + } + }, { + id: "extensions", + name: "Extensions", + width: 80, + align: 'center', + formatter: (extensions, rowItem, columnItem) => { + const extensionsList = rowItem.extensionsList; + if (!extensionsList) { + return; + } + const list = []; + const eId = `popover_extensions_${columnItem.id}_${rowItem.tg_index}`; + list.push(``) + list.push(`
`) + list.push(`

【${rowItem.title}】Extension Nodes (${extensionsList.length})

`); + extensionsList.forEach(en => { + list.push(`
  • ${en}
  • `); + }) + list.push("
    "); + return list.join(""); + } + }, { + id: "conflicts", + name: "Conflicts", + width: 80, + align: 'center', + formatter: (conflicts, rowItem, columnItem) => { + const conflictsList = rowItem.conflictsList; + if (!conflictsList) { + return; + } + const list = []; + const cId = `popover_conflicts_${columnItem.id}_${rowItem.tg_index}`; + list.push(``) + list.push(`
    `) + list.push(`

    【${rowItem.title}】Conflicted Nodes (${conflictsList.length})

    `); + conflictsList.forEach(en => { + let [node_name, extension_name] = en; + extension_name = extension_name.split('/').filter(it => it).pop(); + if(extension_name.endsWith('.git')) { + extension_name = extension_name.slice(0, -4); + } + list.push(`
  • ${node_name} [${extension_name}]
  • `); + }) + list.push("
    "); + return list.join(""); + } + }, { + id: 'author', + name: 'Author', + width: 100, + classMap: "cn-node-author", + formatter: (author, rowItem, columnItem) => { + if (rowItem.trust) { + return `✅ ${author}`; + } + return author; + } + }, { + id: 'stars', + name: '★', + align: 'center', + classMap: "cn-node-stars", + formatter: (stars) => { + if (stars < 0) { + return 'N/A'; + } + if (typeof stars === 'number') { + return stars.toLocaleString(); + } + return stars; + } + }, { + id: 'last_update', + name: 'Last Update', + align: 'center', + type: 'date', + width: 100, + classMap: "cn-node-last-update", + formatter: (last_update) => { + if (last_update < 0) { + return 'N/A'; + } + return `${last_update}`.split(' ')[0]; + } + }]; + + this.grid.setData({ + options, + rows, + columns + }); + + this.grid.render(); + + } + + updateGrid() { + if (this.grid) { + this.grid.update(); + if (this.hasAlternatives()) { + this.grid.forEachRow(function(row) { + row.rowHeightFixed = false; + }); + this.grid.showColumn("alternatives"); + } else { + this.grid.hideColumn("alternatives"); + } + } + } + + // =========================================================================================== + + renderSelected() { + const selectedList = this.grid.getSelectedRows(); + if (!selectedList.length) { + this.showSelection(""); + return; + } + + const selectedMap = {}; + selectedList.forEach(item => { + let type = item.installed; + if (item.restart) { + type = "Restart Required"; + } + if (selectedMap[type]) { + selectedMap[type].push(item.hash); + } else { + selectedMap[type] = [item.hash]; + } + }); + + this.selectedMap = selectedMap; + + const list = []; + Object.keys(selectedMap).forEach(v => { + const filterItem = this.getFilterItem(v); + list.push(`
    + Selected ${selectedMap[v].length} ${filterItem ? filterItem.label : v} + ${this.grid.hasMask ? "" : this.getInstallButtons(v)} +
    `); + }); + + this.showSelection(list.join("")); + } + + focusInstall(item, mode) { + const cellNode = this.grid.getCellNode(item, "installed"); + if (cellNode) { + const cellBtn = cellNode.querySelector(`button[mode="${mode}"]`); + if (cellBtn) { + cellBtn.classList.add("cn-btn-loading"); + return true + } + } + } + + async installNodes(list, btn, title) { + + const { target, label, mode} = btn; + + if(mode === "uninstall") { + title = title || `${list.length} custom nodes`; + if (!confirm(`Are you sure uninstall ${title}?`)) { + return; + } + } + + target.classList.add("cn-btn-loading"); + this.showLoading(); + this.showError(""); + + let needRestart = false; + let errorMsg = ""; + for (const hash of list) { + + const item = this.grid.getRowItemBy("hash", hash); + if (!item) { + errorMsg = `Not found custom node: ${hash}`; + break; + } + + this.grid.scrollRowIntoView(item); + + if (!this.focusInstall(item, mode)) { + this.grid.onNextUpdated(() => { + this.focusInstall(item, mode); + }); + } + + this.showStatus(`${label} ${item.title} ...`); + + const data = item.originalData; + const res = await this.fetchData(`/customnode/${mode}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data) + }); + + if (res.error) { + + errorMsg = `${item.title} ${mode} failed: `; + if(res.status == 403) { + errorMsg += `This action is not allowed with this security level configuration.`; + } else if(res.status == 404) { + errorMsg += `With the current security level configuration, only custom nodes from the "default channel" can be installed.`; + } else { + errorMsg += res.error.message; + } + + break; + } + + needRestart = true; + + this.grid.setRowSelected(item, false); + item.restart = true; + this.restartMap[item.hash] = true; + this.grid.updateCell(item, "installed"); + + //console.log(res.data); + + } + + this.hideLoading(); + target.classList.remove("cn-btn-loading"); + + if (errorMsg) { + this.showError(errorMsg); + } else { + this.showStatus(`${label} ${list.length} custom node(s) successfully`); + } + + if (needRestart) { + this.showRestart(); + this.showMessage(`To apply the installed/updated/disabled/enabled custom node, please restart ComfyUI. And refresh browser.`, "red") + } + + } + + // =========================================================================================== + + async fetchData(route, options) { + let err; + const res = await api.fetchApi(route, options).catch(e => { + err = e; + }); + + if (!res) { + return { + status: 400, + error: new Error("Unknown Error") + } + } + + const { status, statusText } = res; + if (err) { + return { + status, + error: err + } + } + + if (status !== 200) { + return { + status, + error: new Error(statusText || "Unknown Error") + } + } + + const data = await res.json(); + if (!data) { + return { + status, + error: new Error(`Failed to load data: ${route}`) + } + } + return { + status, + data + } + } + + // =========================================================================================== + + async getExtensionMappings() { + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading extension mappings (${mode}) ...`); + const res = await this.fetchData(`/customnode/getmappings?mode=${mode}`); + if (res.error) { + console.log(res.error); + return {} + } + + const data = res.data; + + const extension_mappings = {}; + const conflicts_map = {}; + Object.keys(data).forEach(k => { + const [extensions, metadata] = data[k]; + extension_mappings[k] = { + extensions, + metadata + } + extensions.forEach(node => { + let l = conflicts_map[node]; + if(!l) { + l = []; + conflicts_map[node] = l; + } + l.push(k); + }) + }) + + Object.keys(conflicts_map).forEach(node => { + const list = conflicts_map[node]; + if(list.length > 1) { + list.forEach(k => { + const item = extension_mappings[k]; + if(!item) { + console.log(`not found ${k}`) + return; + } + + if (!item.conflicts) { + item.conflicts = []; + } + list.forEach(key => { + if(k !== key) { + item.conflicts.push([node, key]) + } + }) + }) + } + }) + + return extension_mappings; + } + + async getMissingNodes() { + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading missing nodes (${mode}) ...`); + const res = await this.fetchData(`/customnode/getmappings?mode=${mode}`); + if (res.error) { + this.showError(`Failed to get custom node mappings: ${res.error}`); + return; + } + + const mappings = res.data; + + // build regex->url map + const regex_to_url = []; + this.custom_nodes.forEach(node => { + if(node.nodename_pattern) { + regex_to_url.push({ + regex: new RegExp(node.nodename_pattern), + url: node.files[0] + }); + } + }); + + // build name->url map + const name_to_urls = {}; + for (const url in mappings) { + const names = mappings[url]; + + for(const name in names[0]) { + let v = name_to_urls[names[0][name]]; + if(v == undefined) { + v = []; + name_to_urls[names[0][name]] = v; + } + v.push(url); + } + } + + const registered_nodes = new Set(); + for (let i in LiteGraph.registered_node_types) { + registered_nodes.add(LiteGraph.registered_node_types[i].type); + } + + const missing_nodes = new Set(); + const workflow = app.graph.serialize(); + const group_nodes = workflow.extra && workflow.extra.groupNodes ? workflow.extra.groupNodes : []; + let nodes = workflow.nodes; + + for (let i in group_nodes) { + let group_node = group_nodes[i]; + nodes = nodes.concat(group_node.nodes); + } + + for (let i in nodes) { + const node_type = nodes[i].type; + if(node_type.startsWith('workflow/')) + continue; + + if (!registered_nodes.has(node_type)) { + const urls = name_to_urls[node_type.trim()]; + if(urls) + urls.forEach(url => { + missing_nodes.add(url); + }); + else { + for(let j in regex_to_url) { + if(regex_to_url[j].regex.test(node_type)) { + missing_nodes.add(regex_to_url[j].url); + } + } + } + } + } + + const resUnresolved = await this.fetchData(`/component/get_unresolved`); + const unresolved = resUnresolved.data; + if (unresolved && unresolved.nodes) { + unresolved.nodes.forEach(node_type => { + const url = name_to_urls[node_type]; + if(url) { + missing_nodes.add(url); + } + }); + } + + const hashMap = {}; + this.custom_nodes.forEach(item => { + if (item.files.some(file => missing_nodes.has(file))) { + hashMap[item.hash] = true; + } + }); + return hashMap; + } + + async getAlternatives() { + + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading alternatives (${mode}) ...`); + const res = await this.fetchData(`/customnode/alternatives?mode=${mode}`); + if (res.error) { + this.showError(`Failed to get alternatives: ${res.error}`); + return []; + } + + const hashMap = {}; + const { items } = res.data; + + items.forEach(item => { + + const custom_node = this.custom_nodes.find(node => node.files.find(file => file === item.id)); + if (!custom_node) { + console.log(`Not found custom node: ${item.id}`); + return; + } + + const tags = `${item.tags}`.split(",").map(tag => { + return `
    ${tag.trim()}
    `; + }).join("") + + hashMap[custom_node.hash] = { + alternatives: `
    ${tags}
    ${item.description}` + } + + }); + + return hashMap + } + + async loadData(show_mode = ShowMode.NORMAL) { + this.show_mode = show_mode; + console.log("Show mode:", show_mode); + + this.showLoading(); + + this.extension_mappings = await this.getExtensionMappings(); + + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading custom nodes (${mode}) ...`); + + const skip_update = this.show_mode === ShowMode.UPDATE ? "" : "&skip_update=true"; + const res = await this.fetchData(`/customnode/getlist?mode=${mode}${skip_update}`); + if (res.error) { + this.showError("Failed to get custom node list."); + this.hideLoading(); + return + } + + const { channel, custom_nodes} = res.data; + this.channel = channel; + this.custom_nodes = custom_nodes; + + if(this.channel !== 'default') { + this.element.querySelector(".cn-manager-channel").innerHTML = `Channel: ${this.channel} (Incomplete list)`; + } + + for (const item of custom_nodes) { + item.originalData = JSON.parse(JSON.stringify(item)); + item.hash = await calculateHash(item); + } + + const filterItem = this.getFilterItem(this.show_mode); + if(filterItem) { + let hashMap; + if(this.show_mode == ShowMode.UPDATE) { + hashMap = {}; + custom_nodes.forEach(it => { + if (it.installed === "Update") { + hashMap[it.hash] = true; + } + }); + } else if(this.show_mode == ShowMode.MISSING) { + hashMap = await this.getMissingNodes(); + } else if(this.show_mode == ShowMode.ALTERNATIVES) { + hashMap = await this.getAlternatives(); + } + filterItem.hashMap = hashMap; + filterItem.hasData = true; + } + + custom_nodes.forEach(nodeItem => { + if (this.restartMap[nodeItem.hash]) { + nodeItem.restart = true; + } + const filterTypes = new Set(); + this.filterList.forEach(filterItem => { + const { value, hashMap } = filterItem; + if (hashMap) { + const hashData = hashMap[nodeItem.hash] + if (hashData) { + filterTypes.add(value); + if (value === ShowMode.UPDATE) { + nodeItem.installed = "Update"; + } + if (typeof hashData === "object") { + Object.assign(nodeItem, hashData); + } + } + } else { + if (nodeItem.installed === value) { + filterTypes.add(value); + } + const map = { + "Update": "True", + "Disabled": "True", + "Fail": "True", + "None": "False" + } + if (map[nodeItem.installed]) { + filterTypes.add(map[nodeItem.installed]); + } + } + }); + nodeItem.filterTypes = Array.from(filterTypes); + }); + + this.renderGrid(); + + this.hideLoading(); + + } + + // =========================================================================================== + + showSelection(msg) { + this.element.querySelector(".cn-manager-selection").innerHTML = msg; + } + + showError(err) { + this.showMessage(err, "red"); + } + + showMessage(msg, color) { + if (color) { + msg = `${msg}`; + } + this.element.querySelector(".cn-manager-message").innerHTML = msg; + } + + showStatus(msg, color) { + if (color) { + msg = `${msg}`; + } + this.element.querySelector(".cn-manager-status").innerHTML = msg; + } + + showLoading() { + this.setDisabled(true); + if (this.grid) { + this.grid.showLoading(); + this.grid.showMask({ + opacity: 0.05 + }); + } + } + + hideLoading() { + this.setDisabled(false); + if (this.grid) { + this.grid.hideLoading(); + this.grid.hideMask(); + } + } + + setDisabled(disabled) { + + const $close = this.element.querySelector(".cn-manager-close"); + const $restart = this.element.querySelector(".cn-manager-restart"); + + const list = [ + ".cn-manager-header input", + ".cn-manager-header select", + ".cn-manager-footer button", + ".cn-manager-selection button" + ].map(s => { + return Array.from(this.element.querySelectorAll(s)); + }) + .flat() + .filter(it => { + return it !== $close && it !== $restart; + }); + + list.forEach($elem => { + if (disabled) { + $elem.setAttribute("disabled", "disabled"); + } else { + $elem.removeAttribute("disabled"); + } + }); + + Array.from(this.element.querySelectorAll(".cn-btn-loading")).forEach($elem => { + $elem.classList.remove("cn-btn-loading"); + }); + + } + + showRestart() { + this.element.querySelector(".cn-manager-restart").style.display = "block"; + } + + setFilter(filterValue) { + let filter = ""; + const filterItem = this.getFilterItem(filterValue); + if(filterItem) { + filter = filterItem.value; + } + this.filter = filter; + this.element.querySelector(".cn-manager-filter").value = filter; + } + + setKeywords(keywords = "") { + this.keywords = keywords; + this.element.querySelector(".cn-manager-keywords").value = keywords; + } + + show(show_mode) { + this.element.style.display = "flex"; + this.setFilter(show_mode); + this.setKeywords(""); + this.showSelection(""); + this.showMessage(""); + this.loadData(show_mode); + } + + close() { + this.element.style.display = "none"; + } +} + +// =========================================================================================== + +async function calculateHash(item) { + const message = item.title + item.files[0]; + return md5(message); +} + +function md5(inputString) { + const hc = '0123456789abcdef'; + const rh = n => {let j,s='';for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;} + const ad = (x,y) => {let l=(x&0xFFFF)+(y&0xFFFF);let m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);} + const rl = (n,c) => (n<>>(32-c)); + const cm = (q,a,b,x,s,t) => ad(rl(ad(ad(a,q),ad(x,t)),s),b); + const ff = (a,b,c,d,x,s,t) => cm((b&c)|((~b)&d),a,b,x,s,t); + const gg = (a,b,c,d,x,s,t) => cm((b&d)|(c&(~d)),a,b,x,s,t); + const hh = (a,b,c,d,x,s,t) => cm(b^c^d,a,b,x,s,t); + const ii = (a,b,c,d,x,s,t) => cm(c^(b|(~d)),a,b,x,s,t); + const sb = x => { + let i;const nblk=((x.length+8)>>6)+1;const blks=[];for(i=0;i>2]|=x.charCodeAt(i)<<((i%4)*8);} + blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks; + } + let i,x=sb(inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd; + for(i=0;i{i.d(e,{A:()=>l});var o=i(256),n=i.n(o),s=i(505),r=i.n(s)()(n());r.push([t.id,'.tg-turbogrid{position:relative;z-index:0;width:100%;height:100%;margin:0;padding:0;box-sizing:border-box;font-size:14px;font-family:arial,sans-serif;outline:0;cursor:default;overflow:hidden}.tg-turbogrid *,.tg-turbogrid *::before,.tg-turbogrid *::after{box-sizing:border-box}.tg-text-unselectable.tg-turbogrid{user-select:none}.tg-turbogrid svg{display:block;pointer-events:none}.tg-turbogrid .tg-symbols{font-family:webdings,sans-serif}.tg-turbogrid .tg-nowrap{white-space:nowrap}.tg-turbogrid .tg-align-left{text-align:left}.tg-turbogrid .tg-align-center{text-align:center}.tg-turbogrid .tg-align-right{text-align:right}@keyframes tg-fade-in{from{opacity:0}to{opacity:1}}@keyframes tg-fade-out{from{opacity:1}to{opacity:0}}.tg-turbogrid .tg-fade-in{animation-name:tg-fade-in;animation-duration:.2s;animation-fill-mode:both}.tg-turbogrid .tg-fade-in .tg-scrollbar-track{display:none}.tg-turbogrid .tg-fade-out{animation-name:tg-fade-out;animation-duration:.2s;animation-fill-mode:both}.tg-turbogrid .tg-fade-out .tg-scrollbar-track{display:none}.tg-turbogrid .tg-mask{position:absolute;top:0;left:0;z-index:200;display:none;width:100%;height:100%;background-color:#000;opacity:.1}@keyframes tg-loading-animation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.tg-turbogrid .tg-loading{position:absolute;top:50%;left:50%;z-index:300;display:none;transform:translate(-50%, -50%);pointer-events:none}.tg-turbogrid .tg-loading-default{width:35px;height:35px;color:#0077cf;animation:1s tg-loading-animation linear infinite}.tg-turbogrid .tg-loading-fast{animation:.382s tg-loading-animation linear infinite}.tg-turbogrid .tg-checkbox{width:100%;height:100%;cursor:pointer;overflow:hidden}.tg-turbogrid .tg-checkbox:hover .tg-checkbox-item{fill:#005ba1}.tg-turbogrid .tg-checkbox.tg-select-icon-all{height:18px}.tg-turbogrid .tg-checkbox .tg-icon-checkbox{position:absolute;top:50%;left:50%;display:block;width:16px;height:16px;transform:translate(-50%, -50%)}.tg-turbogrid .tg-checkbox .tg-checkbox-item{display:none;fill:gray}.tg-turbogrid .tg-checkbox .tg-checkbox-none{display:block}.tg-turbogrid .tg-checkbox.tg-selected .tg-checkbox-selected{display:block;fill:#0077cf}.tg-turbogrid .tg-checkbox.tg-mixed .tg-checkbox-mixed{display:block;fill:#0077cf}.tg-turbogrid .tg-radio{cursor:pointer;overflow:hidden}.tg-turbogrid .tg-radio:hover .tg-icon-radio::before{border-color:#005ba1}.tg-turbogrid .tg-radio .tg-icon-radio{position:absolute;top:50%;left:50%;width:16px;height:16px;transform:translate(-50%, -50%)}.tg-turbogrid .tg-radio .tg-icon-radio::before{position:absolute;top:50%;left:50%;content:"";display:block;width:16px;height:16px;border:thin solid gray;border-radius:50%;background:#fff;transform:translate(-50%, -50%)}.tg-turbogrid .tg-radio .tg-icon-radio::after{position:absolute;top:50%;left:50%;content:"";display:none;width:10px;height:10px;border-radius:50%;background:#0077cf;transform:translate(-50%, -50%)}.tg-turbogrid .tg-radio.tg-selected .tg-icon-radio::after{display:block;border-color:#0077cf}.tg-turbogrid .tg-scrollbar{position:absolute;z-index:100;overflow:hidden;user-select:none}.tg-turbogrid .tg-scrollbar-v{top:0;right:0}.tg-turbogrid .tg-scrollbar-h{left:0;bottom:0}.tg-turbogrid .tg-scrollbar-track{position:relative;width:100%;height:100%;background:#f9f9f9;overflow:hidden;user-select:none}.tg-turbogrid .tg-scrollbar-thumb{position:absolute;top:0;left:0;border-radius:1px;background:#999;overflow:hidden;user-select:none}.tg-turbogrid .tg-scrollbar-thumb:hover{background:#888}.tg-turbogrid .tg-scrollbar-thumb-hold{background:#666}.tg-turbogrid .tg-scrollbar-thumb-hold:hover{background:#666}.tg-turbogrid .tg-scrollbar-round .tg-scrollbar-track{border-radius:10px}.tg-turbogrid .tg-scrollbar-round .tg-scrollbar-thumb{border-radius:10px}.tg-turbogrid .tg-scroll-pane{position:relative;margin:0;padding:0;border:none;outline:none;overflow:hidden}.tg-turbogrid .tg-scroll-view{position:relative;width:100%;height:100%;margin:0;padding:0;border:none;overflow:hidden}.tg-turbogrid .tg-scroll-body{position:absolute}.tg-turbogrid .tg-header{position:relative;width:10000px;border-left:0;overflow:hidden}.tg-turbogrid .tg-header-table{position:relative;color:#5e5e5e;font-weight:bold;font-size:14px;line-height:16px;border-bottom:thin solid #e5e5e5;overflow:hidden}.tg-turbogrid .tg-header-item{position:absolute;bottom:0}.tg-turbogrid .tg-header-group-item{overflow:hidden}.tg-turbogrid .tg-header-group-item::after{position:absolute;left:5px;bottom:0;content:"";display:block;width:calc(100% - 10px);height:1px;border-bottom:thin solid #ccc}.tg-turbogrid .tg-column-header{position:absolute;bottom:0;overflow:hidden}.tg-turbogrid .tg-column-header .tg-column-name{padding:10px 5px;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-column-header .tg-column-name.tg-header-group-name{margin:0 5px;padding:5px 0}.tg-turbogrid .tg-column-resizing{position:absolute;top:0;right:-5px;z-index:100;width:10px;height:100%;background:#ccc;cursor:ew-resize;opacity:0}.tg-turbogrid .tg-header-column-last .tg-column-resizing{right:0}.tg-turbogrid .tg-column-sortable .tg-column-name{cursor:pointer}.tg-turbogrid .tg-column-sortable .tg-sort-indicator{cursor:pointer}.tg-turbogrid .tg-column-sorted{color:#000}.tg-turbogrid .tg-header-sort-h .tg-column-name{padding:12px 5px 15px}.tg-turbogrid .tg-header-sort-h .tg-column-sort{width:100%;height:15px;margin-top:-15px;padding:0 5px;overflow:hidden}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator{position:relative;display:none;width:100%;height:100%}.tg-turbogrid .tg-header-sort-h .tg-column-sorted .tg-column-sort .tg-sort-indicator{display:block}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-line{position:absolute;top:1px;width:100%;height:0;border-top:thin solid #1e1e1e;overflow:hidden}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon{position:absolute;top:5px;left:0;right:inherit}.tg-turbogrid .tg-header-sort-h .tg-align-right .tg-sort-indicator-icon{left:inherit;right:0}.tg-turbogrid .tg-header-sort-h .tg-align-center .tg-sort-indicator-icon{left:50%;transform:translateX(-50%)}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-sort-h{display:block;width:19px;height:6px}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item{display:none;fill:#1e1e1e}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item-light{fill:#ababab}.tg-turbogrid .tg-column-sort-v{display:flex;flex-direction:row;align-items:center}.tg-turbogrid .tg-column-sort-v .tg-column-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-column-sort-v.tg-align-right{justify-content:right}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator{position:relative;width:16px;height:16px}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon{position:absolute}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-sort-v{display:block;width:10px;height:16px}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item{fill:#ababab}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item-light{fill:#ababab}.tg-turbogrid .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item{fill:#1e1e1e}.tg-turbogrid .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item-light{fill:#ababab}.tg-turbogrid .tg-sort-desc .tg-sort-indicator .tg-sort-indicator-icon .tg-desc{display:block}.tg-turbogrid .tg-sort-desc .tg-sort-indicator .tg-sort-indicator-icon .tg-asc{display:none}.tg-turbogrid .tg-sort-asc .tg-sort-indicator .tg-sort-indicator-icon .tg-desc{display:none}.tg-turbogrid .tg-sort-asc .tg-sort-indicator .tg-sort-indicator-icon .tg-asc{display:block}.tg-turbogrid .tg-column-line{position:absolute;top:0;left:0;z-index:100;display:none;height:100%;pointer-events:none}.tg-turbogrid .tg-column-line-item{position:absolute;top:0;bottom:0;display:block;width:0;height:100%;border-left:thin solid #ccc}.tg-turbogrid .tg-column-line-item.tg-active{border-left:thin solid #0077cf}.tg-turbogrid .tg-column-dragging{cursor:ew-resize}.tg-turbogrid .tg-column-dragging .tg-column-name{cursor:ew-resize}.tg-turbogrid .tg-column-dragging .tg-column-resizing:not(.tg-resizing-active){display:none}.tg-turbogrid .tg-tree{position:relative;display:flex;flex-direction:row;place-items:center left;width:100%;height:100%;overflow:hidden}.tg-turbogrid .tg-tree-icon{position:relative;width:15px;height:100%;min-height:9px;text-align:left;cursor:pointer;overflow:hidden}.tg-turbogrid .tg-tree-icon .tg-icon-tree{position:absolute;top:50%;left:0;display:block;width:9px;height:9px;transform:translate(0, -50%);overflow:hidden}.tg-turbogrid .tg-tree-icon .tg-tree-item{display:none}.tg-turbogrid .tg-tree-icon-collapsed .tg-tree-collapsed{display:block}.tg-turbogrid .tg-tree-icon-empty .tg-tree-collapsed{opacity:.5}.tg-turbogrid .tg-tree-icon-expanded .tg-tree-expanded{display:block}.tg-turbogrid .tg-tree-name{flex:1;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-tree-header .tg-tree .tg-tree-icon{display:none}.tg-turbogrid .tg-tree-icon-all{position:relative;height:17px}.tg-turbogrid .tg-tree-header-indent .tg-tree{padding-left:5px}.tg-turbogrid .tg-tree-header-indent .tg-tree .tg-tree-icon{display:block}.tg-turbogrid .tg-tree-header-indent.tg-column-sort-h .tg-column-sort{width:calc(100% - 20px);margin-left:20px}.tg-turbogrid .tg-pane{position:absolute;width:100%;outline:0;overflow:hidden}.tg-turbogrid .tg-header-frame{position:relative;display:block;outline:0;overflow:hidden}.tg-turbogrid .tg-header-frame .tg-pane{height:100%}.tg-turbogrid .tg-body-frame{position:relative;width:100%;outline:0}.tg-turbogrid .tg-body-message{position:absolute;display:none;width:100%;height:100%;padding:10px;overflow:hidden}.tg-turbogrid .tg-body-message img,.tg-turbogrid .tg-body-message div{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.tg-turbogrid .tg-body{position:absolute;outline:0}.tg-turbogrid .tg-cell-hover-icon{display:none}.tg-touch-device.tg-turbogrid .tg-cell-hover-icon{display:inherit}.tg-turbogrid .tg-cell-row-number{font-weight:normal}.tg-turbogrid .tg-cell-row-drag .tg-row-drag-icon{position:absolute;top:50%;left:50%;width:24px;height:24px;cursor:move;opacity:.8;transform:translate(-50%, -50%)}.tg-turbogrid .tg-cell-row-drag .tg-row-drag-icon:hover{opacity:1}.tg-turbogrid .tg-cell{position:absolute;z-index:1;height:100%;margin:0;padding:0 5px;color:#1e1e1e;white-space:nowrap;text-overflow:ellipsis;vertical-align:middle;overflow:hidden}.tg-turbogrid .tg-cell:focus{outline:none}.tg-turbogrid .tg-cell.tg-flashing{border:1px solid red !important}.tg-turbogrid .tg-cell.tg-selected{background-color:beige}.tg-turbogrid .tg-cell.tg-multiline{display:flex;flex-direction:column;justify-content:center;padding:5px;line-height:normal;white-space:normal;text-overflow:ellipsis}.tg-turbogrid .tg-cell.tg-multiline .tg-multiline-wrapper{overflow:hidden}.tg-turbogrid .tg-cell.tg-align-left.tg-cell-negative{padding-left:1px}.tg-turbogrid .tg-cell.tg-align-right.tg-cell-negative{padding-right:1px}.tg-turbogrid .tg-row{position:absolute;width:100%;border:0;border-bottom:thin solid #e5e5e5}.tg-turbogrid .tg-row.tg-group-line{border-bottom:thin solid #999}.tg-turbogrid .tg-row.tg-none-line{border-bottom:none}.tg-turbogrid .tg-row.tg-top-line{border-top:thin solid #e5e5e5}.tg-turbogrid .tg-row.tg-group{font-weight:bold;overflow:hidden}.tg-turbogrid .tg-row.tg-group .tg-cell.tg-align-left.tg-cell-negative{padding-left:0}.tg-turbogrid .tg-row.tg-group .tg-cell.tg-align-right.tg-cell-negative{padding-right:0}.tg-turbogrid .tg-row.tg-hover .tg-cell .tg-cell-hover-icon{display:inherit}.tg-turbogrid .tg-row.tg-dragging{opacity:.3}.tg-turbogrid .tg-row.tg-clone{z-index:1000;border:1px dashed #ccc;border-right:none;border-left:none;background:#fff;cursor:move;opacity:.5}.tg-turbogrid .tg-row.tg-clone *{cursor:move}.tg-turbogrid .tg-row-placeholder{position:absolute;z-index:9999;width:100%;border-top:2px solid #00a8e1;pointer-events:none}.tg-turbogrid .tg-row::before,.tg-turbogrid .tg-row::after{position:absolute;top:0;left:0;content:"";z-index:100;display:none;width:100%;height:100%;pointer-events:none}.tg-turbogrid .tg-hover.tg-row::before{display:block;background:rgba(0,0,0,.08)}.tg-turbogrid .tg-selected.tg-row::after{display:block;background:rgba(0,0,0,.13)}.tg-lightblue .tg-header-item{border-top:thin solid #e8eaf0;border-right:thin solid #e8eaf0}.tg-lightblue .tg-column-name{padding:5px;color:#304265}.tg-lightblue .tg-header-group-item::after{display:none}.tg-lightblue .tg-checkbox .tg-icon-item{fill:#d4d7e0}.tg-lightblue .tg-checkbox:hover .tg-icon-item{fill:#107fff}.tg-lightblue .tg-checkbox.tg-selected .tg-select-checkbox{fill:#107fff}.tg-lightblue .tg-checkbox.tg-mixed .tg-select-mixed{fill:#107fff}.tg-lightblue .tg-cell{color:#304265;border-right:thin solid #e8eaf0}.tg-lightblue .tg-row{border-bottom:thin solid #e8eaf0}.tg-lightblue .tg-row.tg-group-line{border-bottom:thin solid #c9ccd8}.tg-lightblue .tg-row.tg-selected{background:rgba(58,116,213,.05)}.tg-lightblue .tg-row.tg-hover{background:rgba(58,116,213,.05)}.tg-lightblue .tg-row.tg-even{background:#fbfcfe}.tg-lightblue .tg-row.tg-odd{background:#fff}.tg-lightblue .tg-hover.tg-row::before{background:rgba(58,116,213,.05)}.tg-lightblue .tg-selected.tg-row::after{background:rgba(58,116,213,.1)}.tg-lightblue .tg-header-frame{border-bottom:thin solid #e8eaf0}.tg-lightblue .tg-row-not-found .tg-frozen-line-v{border-right:none}.tg-lightblue .tg-scrollbar-track{background:#fff}.tg-lightblue .tg-scrollbar-thumb{background:rgba(48,66,101,.35)}.tg-lightblue .tg-scrollbar-thumb:hover{background-color:#a8a8a8}.tg-lightblue .tg-scrollbar-thumb:active{background-color:#787878}.tg-dark{background:#1e1e1e}.tg-dark .tg-checkbox .tg-icon-item{fill:#ababab}.tg-dark .tg-header-table{color:#ccc;border-bottom:thin solid #333}.tg-dark .tg-header-group-item::after{border-bottom:1px solid #999}.tg-dark .tg-column-sorted{color:#fff}.tg-dark .tg-column-sorted .tg-tree-icon-all .tg-icon-item{fill:#fff}.tg-dark .tg-header-sort-h .tg-sort-indicator-line{border-top:thin solid #eee}.tg-dark .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item{fill:#eee}.tg-dark .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item-light{fill:#666}.tg-dark .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item{fill:#666}.tg-dark .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item-light{fill:#666}.tg-dark .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item{fill:#fff}.tg-dark .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item-light{fill:#666}.tg-dark .tg-tree-icon .tg-icon-item{fill:#fff}.tg-dark .tg-tree-icon-all .tg-icon-item{fill:#999}.tg-dark .tg-header-item .tg-tree-icon .tg-icon-item{fill:#999}.tg-dark .tg-header-item .tg-column-sorted .tg-tree-icon .tg-icon-item{fill:#fff}.tg-dark .tg-row{border-bottom:thin solid #333}.tg-dark .tg-row.tg-group-line{border-bottom:thin solid #666}.tg-dark .tg-row.tg-clone{border:1px dashed #1e1e1e;opacity:.1}.tg-dark .tg-cell{color:#eee}.tg-dark .tg-body-message{color:#eee}.tg-dark .tg-hover.tg-row::before{background:rgba(255,255,255,.1)}.tg-dark .tg-selected.tg-row::after{background:rgba(255,255,255,.2)}.tg-dark .tg-mask{background-color:#fff}.tg-dark .tg-scrollbar-track{background:#333}.tg-dark .tg-scrollbar-thumb{background:#bbb}.tg-dark .tg-scrollbar-thumb:hover{background:#ddd}.tg-dark .tg-scrollbar-thumb-hold{background:#eee}.tg-dark .tg-scrollbar-thumb-hold:hover{background:#eee}.tg-pointer-events-none{pointer-events:none}',""]);const l=r},505:t=>{t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i="",o=void 0!==e[5];return e[4]&&(i+="@supports (".concat(e[4],") {")),e[2]&&(i+="@media ".concat(e[2]," {")),o&&(i+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),i+=t(e),o&&(i+="}"),e[2]&&(i+="}"),e[4]&&(i+="}"),i})).join("")},e.i=function(t,i,o,n,s){"string"==typeof t&&(t=[[null,t,void 0]]);var r={};if(o)for(var l=0;l0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=s),i&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=i):c[2]=i),n&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=n):c[4]="".concat(n)),e.push(c))}},e}},256:t=>{t.exports=function(t){return t[1]}}},e={};function i(o){var n=e[o];if(void 0!==n)return n.exports;var s=e[o]={id:o,exports:{}};return t[o](s,s.exports,i),s.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var o in e)i.o(e,o)&&!i.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var o={};(()=>{i.d(o,{$:()=>w,MP:()=>e,_d:()=>k,xA:()=>Xt,In:()=>X,T8:()=>D,Gr:()=>kt,ht:()=>qt,J0:()=>d,xv:()=>Yt,Ay:()=>Kt});const t="turbogrid",e={ID:t,NS:`tg-${t}`,VERSION:"3.1.0",TIMESTAMP:"2024-06-04T10:15:28.564Z",UP:"up",DOWN:"down",LEFT:"left",RIGHT:"right",TREE_INDENT:15},n=function(t){if(!t||"object"!=typeof t)return!1;const e=Object.prototype.toString.call(t);return!!["[object Object]","[object Array]"].includes(e)&&(!t.constructor||!![Object,Array].includes(t.constructor))},s=function(t,e){let i;return t.forEach((t=>{n(t)&&(i||(i=t instanceof Array?[]:{}),t instanceof Array?function(t,e,i){const o=e.length;for(let s=0;s{this.execute()})):Promise.resolve().then((()=>{this.execute()}))}execute(){if(!this.started)return;this.started=!1;const t=this.callback;this.callback=null,"function"==typeof t&&t.call(this)}cancel(){this.started=!1,this.callback=null}}const a=new WeakMap,c={isObject:n,merge:l,hasOwn:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},uid:function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:8;const e="0123456789abcdefghijklmnopqrstuvwxyz";let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";for(;t--;)i+=e[36*Math.random()|0];return i},isNum:function(t){if("number"!=typeof t||isNaN(t))return!1;return(e=t)!==Number.MAX_VALUE&&e!==Number.MIN_VALUE&&e!==Number.NEGATIVE_INFINITY&&e!==Number.POSITIVE_INFINITY;var e},toNum:function(t,e){return"number"!=typeof t&&(t=parseFloat(t)),isNaN(t)&&(t=0),e&&!Number.isInteger(t)&&(t=Math.round(t)),t},convertNum:function(t){if("string"==typeof t){if(/^[-+]?\d+(\.\d+)?$/gi.test(t))return parseFloat(t)}return t},clamp:function(t,e,i){return Math.max(Math.min(t,i),e)},per:function(t){return t=c.toNum(t),t=c.clamp(t,0,1)},replace:function(t,e){return t=`${t}`,e?t=t.replace(/\{([^}]+)\}/g,(function(t,i){return c.hasOwn(e,i)?e[i]:t})):t},isArray:function(t){return!!(t&&t instanceof Array)},toList:function(t){return t instanceof Array?t:void 0===t?[]:"string"==typeof t?[t]:t&&c.hasOwn(t,"length")?Array.from(t):[t]},isList:function(t){return!!(c.isArray(t)&&t.length>0)},inList:function(t,e){if(!c.isList(e))return!1;for(let i=0,o=e.length;i{if(!c.isList(t))return;let n=0;const s=t.length;for(;nt.startsWith(e))).forEach((e=>{t[e]=null}))},hasShiftKey:function(t){let e=!1;return t&&(e=t.shiftKey),e},isTouchDevice:function(){return"ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0},contains:function(t,e){if(!t||!e)return!1;if(t===e)return!0;if("function"==typeof t.contains)return t.contains(e);let i=e.parentNode;for(;i;){if(i===t)return!0;i=i.parentNode}return!1},isNarrowCharacter:function(t){const e=t.codePointAt(0);return e>=32&&e<=126||162===e||163===e||165===e||166===e||172===e||175===e||8361===e||e>=10214&&e<=10221||10629===e||10630===e||e>=65377&&e<=65470||e>=65474&&e<=65479||e>=65482&&e<=65487||e>=65490&&e<=65495||e>=65498&&e<=65500||e>=65512&&e<=65518},getCharLen:function(t){let e=0;if(!t)return e;for(const i of String(t))e+=c.isNarrowCharacter(i)?1:2;return e},pascalToKebabCase:function(t){return`${t}`.trim().replace(/([a-z])([A-Z])/g,"$1-$2").replace(/\W/g,(t=>/[À-ž]/.test(t)?t:"-")).replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-").toLowerCase()},classMap:function(t){if("string"==typeof t)return t.trim();if(Array.isArray(t)){let e=t.filter((t=>t));return e=e.map((t=>t&&"object"==typeof t?c.classMap(t):String(t).trim())),e=e.filter((t=>t)),e=Array.from(new Set(e)),e.join(" ")}if(t&&"object"==typeof t){const e=[];return Object.keys(t).forEach((i=>{t[i]&&e.push(i)})),e.join(" ")}return""},styleMap:function(t){if("string"==typeof t)return t.trim();if(Array.isArray(t)){let e=t.filter((t=>t));return e=e.map((t=>{const e=String(t).trim();return e?-1===e.indexOf(":")?"":e.endsWith(";")?e:`${e};`:""})),e=e.filter((t=>t)),e=Array.from(new Set(e)),e.join(" ")}if(t&&"object"==typeof t){const e=[];return Object.keys(t).forEach((i=>{const o=t[i];if(o||0===o){const t=String(o).trim();t&&e.push(`${c.pascalToKebabCase(i)}: ${t};`)}})),e.join(" ")}return""},getInstance:function(t){if(t){const e=document.getElementById(t);if(e)return a.get(e)}},setInstance:function(t,e){t&&a.set(t,e)},bindEvents:function(t,e){t&&(c.unbindEvents(t),Object.keys(t).forEach((i=>{const o=t[i];o.target=o.target||e,o.target.addEventListener(i,o.handler,o.options)})))},unbindEvents:function(t){t&&Object.keys(t).forEach((e=>{const i=t[e];i.target&&i.target.removeEventListener(e,i.handler,i.options)}))},preventDefault:function(t){t&&"function"==typeof t.preventDefault&&t.cancelable&&t.preventDefault()},debounce:function(t){let e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100;const o=function(){clearTimeout(e),e=setTimeout((()=>{t.apply(this,arguments)}),i)};return o.cancel=()=>{clearTimeout(e)},o},throttle:function(t){let e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100,o=0;const n=function(){const n=Date.now();if(n>o+i)return clearTimeout(e),o=n,void t.apply(this,arguments);clearTimeout(e),e=setTimeout((()=>{o=n,t.apply(this,arguments)}),i)};return n.cancel=()=>{clearTimeout(e),o=0},n},microtask:function(t){const e=new h,i=function(){e.start((()=>{t.apply(this,arguments)}))};return i.cancel=()=>{e.cancel()},i},nextTick:function(t){"function"==typeof window.queueMicrotask?window.queueMicrotask((()=>{t()})):Promise.resolve().then((()=>{t()}))},cancelAsync:function(t){t&&(Object.keys(t).filter((e=>e.startsWith("async")&&"function"==typeof t[e])).forEach((e=>{const i=t[e];"function"==typeof i.cancel&&(i.cancel(),t[e]=null)})),Object.keys(t).filter((t=>t.startsWith("timeout"))).forEach((e=>{clearTimeout(t[e])})))}},d=c,u={animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},g=function(t){return null!==t&&1===t.nodeType},f=function(t){let e=t.ownerDocument.defaultView;return e&&e.opener||(e=window),e.getComputedStyle(t)},p={},m=function(t,e){return null!=(i=t)&&i===i.window?t[`inner${e}`]:(function(t){return null!==t&&9===t.nodeType}(t)&&(t=t.body),t[`client${e}`]);var i},b=function(t){return this.list=[],t?this.create(t):this};function w(t){return new b(t)}b.prototype={constructor:b,Query:"Query",list:[],create:function(t){return t instanceof b?t:"string"==typeof t?this.createFromString(t):((t.nodeType||t===window)&&(this.list=[t]),this)},createFromString:function(t){if("<"===(t=t.trim())[0]&&">"===t[t.length-1]&&t.length>=3)this.parseHTML(t);else{const e=document.querySelectorAll(t);for(let t=0,i=e.length;t{this.css(e,t[e])}))}var i;return this.each((function(i){let o=e;"number"!=typeof o||u[t]||(o+="px"),i.style[t]=o})),this},attr:function(t,e){if(!t)return this;if(1===arguments.length){if("object"==typeof t)return Object.keys(t).forEach((e=>{this.attr(e,t[e])})),this;const e=this.get(0);return e?e.getAttribute(t):void 0}return this.each((function(i){i.setAttribute(t,e)})),this},removeAttr:function(t){return t?(this.each((function(e){e.hasAttribute(t)&&e.removeAttribute(t)})),this):this},removeClass:function(t){if(!arguments.length)return this.each((function(t){t.className=""})),this;if(!t||"string"!=typeof t)return this;const e=t.split(" ");return this.each((function(t){e.forEach((function(e){e&&t.classList.remove(e)}))})),this},addClass:function(t){if(!t||"string"!=typeof t)return this;const e=t.split(" ");return this.each((function(t){e.forEach((function(e){e&&t.classList.add(e)}))})),this},hasClass:function(t){if(!t||"string"!=typeof t)return!1;let e=!1;return this.each((function(i){if(i.classList.contains(t))return e=!0,!1})),e},show:function(){return this.each((function(t){if(!g(t))return;const e=function(t){if(!p[t]){const e=document.createElement(t);document.body.appendChild(e);const i=f(e).display;e.parentNode.removeChild(e),p[t]=i}return p[t]}(t.nodeName);t.style.display=e})),this},hide:function(){return this.each((function(t){if(!g(t))return;"none"!==t.style.display&&(t.style.display="none")})),this},click:function(){const t=this.get(0);return t&&"function"==typeof t.click&&t.click(),this},offset:function(){const t={left:0,top:0},e=this.get(0);if(e){const i=e.getBoundingClientRect();t.left=i.left+window.scrollX,t.top=i.top+window.scrollY}return t},clone:function(){const t=new b;return this.each((function(e){if(e&&e.cloneNode){const i=e.cloneNode(!0);t.add(i)}})),t},children:function(){const t=new b;return this.each((function(e){let i=e.firstChild;for(;i;)t.add(i),i=i.nextSibling})),t},parent:function(){const t=this.get(0);return t?new b(t.parentNode):new b},is:function(t){if(!t)return!1;const e=t.split(",");let i=!0;return this.each((function(t){if(!t.nodeName)return i=!1,!1;const o=t.nodeName.toLowerCase();return d.inList(o,e)?void 0:(i=!1,!1)})),i}},Object.defineProperty(b.prototype,"length",{get:function(){return this.list.length}});const v={createCache:function(){this.headerCache=new Map,this.bodyCache=new Map,this.dataCache=new WeakMap},setHeaderCache:function(t,e){this.headerCache.set(t,e)},getHeaderCache:function(t){return this.headerCache.get(t)},clearHeaderCache:function(){this.headerCache.clear()},setRowCache:function(t,e){this.bodyCache.set(t,{rowNodes:e,cellNodes:new Map})},getRowCache:function(t){return this.bodyCache.get(t)},deleteRowCache:function(t){const e=this.getRowNodesByIndex(t);e&&e.each((t=>{this.removeNode(t)})),this.bodyCache.delete(t)},deleteCellCache:function(t,e){t&&(this.removeNode(t.get(e)),t.delete(e))},getRowNodesByIndex:function(t){const e=this.getRowCache(t);if(e)return e.rowNodes},getCellNodeByIndex:function(t,e){const i=this.getRowCache(t);if(i)return i.cellNodes.get(e)},forEachBodyCache:function(t){this.bodyCache.forEach(((e,i)=>{t.call(this,i,e.rowNodes,e.cellNodes)}))},updateRowCacheTopOffset:function(){const t=this.frozenInfo.row;this.forEachBodyCache(((e,i,o)=>{if(!(e<=t)&&i){const t=this.getViewRowItem(e),o=this.getViewRowTop(t);i.css("top",o)}}))},setNodeDataCache:function(t,e){if(t)return this.dataCache.set(t,e)},getNodeDataCache:function(t){if(t)return this.dataCache.get(t)},removeCache:function(){this.headerCache=null,this.bodyCache=null,this.dataCache=null}},H=["onUpdated","onFirstUpdated","onHeaderUpdated","onSort","onColumnAdded","onColumnRemoved","onColumnWidthChanged","onRowAdded","onRowRemoved","onRowExpanded","onRowCollapsed","onRowSubsRequest","onRowDragged","onRowDropped","onRowMoved","onRowMouseEnter","onRowMouseLeave","onSelectChanged","onCellUpdated","onCellMouseEnter","onCellMouseLeave","onClick","onDblClick","onContextMenu","onMouseOver","onMouseOut","onTouchStart","onTouchMove","onTouchEnd","onScroll","onScrollStateChanged","onMouseWheel","onResize","onLayout","onKeyDown","onDestroy"],y={};H.forEach((t=>{y[t]=t}));const C=y,R={renderCells:function(t,e){t.forEach((t=>{this.drawRowCells(t,e)}))},getCellValue:function(t,e){return t[e.id]},renderCell:function(t,e,i){const o=this.getCellValue(t,e);let n=o;this.nullFormatter&&(n=this.nullFormatter.call(this,n,t,e,i));const s=t.tg_formatter||e.tg_formatter;"function"==typeof s&&(n=s.call(this,n,t,e,i)),this.renderNodeContent(i,n);const{highlightKey:r}=this.options.highlightKeywords;t[r+e.id]&&this.renderSettings.highlightCells.push(i),this.trigger(C.onCellUpdated,{value:o,rowItem:t,columnItem:e,node:i})},getPreRenderColumnList:function(t,e){const i=[];if(!e.length)return i;for(let o=0,n=e.length;o{this.createCellNode(t,e)}))},getCellClass:function(t,e){const i=e.tg_view_index,o=["tg-cell"];return o.push(`tg-c-${i}`),e.align&&o.push(`tg-align-${e.align}`),0===e.tg_list_index&&o.push("tg-list-first"),e.tg_list_last&&o.push("tg-list-last"),o.push(d.classMap(e.classMap)),o.push(d.classMap(t[`${e.id}ClassMap`])),d.classMap(o)},createCellNode:function(t,e){const i=this.getRowCache(t);if(!i)return;const o=this.getViewRowItem(t),n=this.getViewColumnItem(e);if(!o||!n)return;const s=document.createElement("div");s.setAttribute("column",e);const r=this.getCellClass(o,n);s.className=r;const l=d.styleMap(n.styleMap)+d.styleMap(o[`${n.id}StyleMap`]);l&&(s.style.cssText=l);const h=i.rowNodes,a=n.tg_frozen,c=this.getCellRowNode(h,a);this.appendNode(c,s),this.renderCell(o,n,s),i.cellNodes.set(e,s),this.setNodeDataCache(s,{row:t,rowItem:o,rowNode:c,column:e,columnItem:n,cellNode:s})},getCellRowNode:function(t,e){const i=t.get(0);if(this.frozenInfo.columns){const o=t.get(1);return this.frozenInfo.right?e?o:i:e?i:o}return i}},S={addColumn:function(t,e,i){let o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const n=this.getToBeAddedItemList(t);if(!n.length)return!1;let s;if(null!=e&&(s=this.getColumnItem(e),!s))return!1;const r=this.getToBeAddedParentSubs(s,this.columns),l=[this.getToBeAddedPositionIndex(i,r),0].concat(n);r.splice.apply(r,l),this.onNextUpdated((function(){this.trigger(C.onColumnAdded,n)}));const h={type:"columns"};return o&&(h.scrollColumn=n[n.length-1]),this.render(h),!0},deleteColumn:function(t){const e=this.toColumnItemList(t,(t=>!t.private));return!!e.length&&(this.removeColumnsHandler(e),this.onNextUpdated((function(){this.trigger(C.onColumnRemoved,e)})),this.render("columns"),!0)},removeColumnsHandler:function(t){const e=[].concat(t);e.sort((function(t,e){return e.tg_index-t.tg_index})),e.forEach((t=>{let e;if(t===this.sortColumn&&this.removeSortColumn(),t.tg_parent)e=t.tg_parent.subs,e.splice(t.tg_sub_index,1);else{e=this.columns;const i=e.findIndex((e=>e===t));-1!==i&&e.splice(i,1)}!e.length&&t.tg_parent&&(t.tg_parent.subs=null)}))}},T={setColumnWidth:function(t,e){return this.updateColumnWidth(t,e)?(this.resize(),this):this},updateColumnWidth:function(t,e){const i=this.getColumnItem(t);return!!i&&(!!d.isNum(e)&&(e=Math.round(e),e=Math.max(0,e),i.tg_width!==e&&(i.width=e,i.minWidth=Math.min(i.minWidth,e),i.maxWidth=Math.max(i.maxWidth,e),this.updateViewColumnWidth(i),!0)))},showColumn:function(t){return this.updateColumnsInvisible(this.toColumnItemList(t),!1)},hideColumn:function(t){return this.updateColumnsInvisible(this.toColumnItemList(t),!0)},updateColumnsInvisible:function(t,e){if(!t.length)return!1;const i=[];return t.forEach((t=>{t.invisible!==e&&(t.invisible=e,t.tg_invisible=e,i.push(t))})),!!i.length&&(this.render("columns"),!0)}},L={showColumnLine:function(t){t&&(this.$columnLineContainer.show(),this.renderColumnLine(t))},hideColumnLine:function(){this.previousColumnLineActive||this.$columnLineContainer.hide()},setColumnLineActive:function(t){t!==this.previousColumnLineActive&&(this.previousColumnLineActive=t,t?this.$columnLineItem.addClass("tg-active"):this.$columnLineItem.removeClass("tg-active"))},getColumnLineLeft:function(t){let e=t.tg_left;return t.tg_frozen||(e-=this.scrollLeft),this.frozenInfo.right&&(t.tg_frozen?e=t.tg_left+this.paneWidthL:e-=this.columnsWidthR),e},renderColumnLine:function(t){const e=this.getHeaderItemNode(t).offsetTop,i=t.tg_width,o=this.getColumnLineLeft(t);this.$columnLineItemL.css({top:e,left:o}),this.$columnLineItemR.css({top:e,left:o+i-1}),this.frozenInfo.right||(this.frozenInfo.columns&&!t.tg_frozen&&o{this.renderColumnLine(e.columnItem)})),this.resize()},columnWidthTouchStartHandler:function(t,e){d.preventDefault(e.e);const i=e.columnItem;this.showColumnLine(i),this.setColumnLineActive(!0),e.index=i.tg_index;const o=this.getColumnHeaderNode(i);e.width=o.clientWidth},columnWidthTouchMoveHandler:function(t,e){d.preventDefault(e.e);const i=e.columnItem;let o=e.width+e.offsetX;o=d.clamp(o,i.minWidth,i.maxWidth),i.tg_width!==o&&(i.width=o,this.updateViewColumnWidth(i),this.renderColumnLine(i))},columnWidthTouchEndHandler:function(t,e){d.preventDefault(e.e),this.setColumnLineActive(!1),this.hideColumnLine(),this.resize()}},I={getColumnItem:function(t){return d.isNum(t)?(t<0&&(t=this.columnsInfo.length+t),this.columnsInfo.indexCache[t]):t?d.isNum(t.tg_index)?t:this.getColumnItemById(t.id||t):void 0},getColumnItemById:function(t){return this.getColumnItemBy("id",t)},getColumnItemBy:function(t,e){if(void 0!==e)return this.columnsInfo.indexCache.find((i=>i[t]===e))},getColumnsLength:function(t){return t?this.columnsInfo.length:this.viewColumns.length},getViewColumnItem:function(t){return this.viewAllColumns[t]},isColumnSortable:function(t){return!!t&&(!t.tg_group&&(!(!t.name||!t.id)&&this.isSortable(t)))},isColumnResizable:function(t){return!!t&&(!t.tg_group&&(!d.hasOwn(t,"resizable")||Boolean(t.resizable)))},updateViewColumnWidth:function(t){return t.tg_width=t.width,this.updateColumnHeaderSize(t),this.updateTotalColumnsWidth(),this.updateHeaderLayerHeight(),this.cssRulesInvalid=!0,this.resizeBodyHandler(),this.trigger(C.onColumnWidthChanged,t),!0},updateTotalColumnsWidth:function(){this.blankColumn.tg_width=0;const t=this.viewColumns;let e=0,i=0;const o=this.frozenInfo.columns,n=t.length;let s=0;for(let r=0;r0&&(s+=l,o&&r>=o?i+=l:e+=l)}if(this.frozenInfo.right){const t=e;e=i,i=t}this.columnsWidthL=e,this.columnsWidthR=i,this.columnsWidth=e+i},updateColumnHeaderSize:function(t){this.updateColumnHeaderWidth(t),this.updateColumnHeaderHeight(t,!0),this.updateColumnGroupWidth(t)},updateColumnHeaderWidth:function(t){const e=this.getColumnHeaderNode(t);if(!e)return;const i=t.tg_width;this.isInvisible(t)||i<=0?e.style.display="none":(e.style.display="",e.style.width=`${i}px`)},updateColumnHeaderHeight:function(t,e){if(t.tg_height=0,t.tg_width<=0)return;if(this.isInvisible(t))return;e&&(t.tg_element_height=0);const i=t.tg_element_height;if(i)return void(t.tg_height=i);const o=this.getColumnHeaderHeight(t);t.tg_height=o,t.tg_element_height=o},getColumnHeaderHeight:function(t){const e=this.getColumnHeaderNode(t);return e?e.clientHeight:0},updateColumnGroupWidth:function(t){const e=t.tg_parent;if(!e)return;const i=this.getColumnGroupWidth(e);e.tg_width!==i&&(e.tg_width=i,this.updateColumnHeaderSize(e))},getColumnGroupWidth:function(t){if(this.isInvisible(t))return 0;let e=0;return t.subs&&t.subs.forEach((t=>{this.isInvisible(t)||d.isNum(t.tg_width)&&(e+=t.tg_width)})),e}},E={initTreeInfo:function(t,e){const i=[];let o=!1,n=0,s=0;const r=function(t,r,l){(t=>{t.invisible?t.tg_invisible=!0:t.tg_invisible&&(t.tg_invisible=!1)})(t),((t,i)=>{if(e>=0&&!t.tg_invisible)return t.tg_frozen=!0,void(e-=1);t.tg_frozen&&(t.tg_frozen=!1)})(t),(t=>{if(d.hasOwn(t,"subs")){if(Array.isArray(t.subs))return o=!0,t.tg_group=!0,void(t.tg_subs_length=t.subs.length);t.subs=null}t.tg_group&&(t.tg_group=!1)})(t),((t,e)=>{t.tg_parent=e;let i=0;e&&(i=e.tg_level+1,i>n&&(n=i)),t.tg_level=i})(t,l),t.tg_index=s,t.tg_sub_index=r,i.push(t),s+=1},l=function(t,e){let i=0;const o=t.length;for(;i{if(!this.isInvisible(e))return this.isRowSelectable(e)?t(e,i,o):void 0})),this},toRowItemList:function(t,e){let i=d.toList(t).map((t=>this.getRowItem(t))).filter((t=>t));return"function"==typeof e&&(i=i.filter(e)),i},toColumnItemList:function(t,e){let i=d.toList(t).map((t=>this.getColumnItem(t))).filter((t=>t));return"function"==typeof e&&(i=i.filter(e)),i},isRowLeaf:function(t){return!!t&&("blank"!==t.formatter&&(!t.tg_frozen&&!t.tg_group))},isRowSelectable:function(t){return!!t&&(d.hasOwn(t,"selectable")?Boolean(t.selectable):this.isRowLeaf(t))},isEmptyGroup:function(t){return!(!t||!t.tg_group||0!==t.tg_subs_length)},isInvisible:function(t){return!!t&&(!(!t.tg_filtered&&!t.tg_invisible)||!!this.isInvisible(t.tg_parent))},isSortable:function(t){return!!t&&(!d.hasOwn(t,"sortable")||Boolean(t.sortable))},isCollapsedChanged:function(t,e){return Boolean(t.collapsed)!==e},isSelectedChanged:function(t,e){return Boolean(t.selected)!==e}},x={updateCssRules:function(){this.cssRulesInvalid&&(this.cssRulesInvalid=!1,this.initCssRules(),this.updateColumnsCssRules(),this.updateHeadersCssRules(),this.updateStyleElement())},initCssRules:function(){this.removeCssRules(),this.cssList={},this.cssDisplayCache={};const t=this.getRowHeight(),e=this.createCssRule(".tg-row");e.height=`${t}px`,e["line-height"]=`${t}px`},resetCssDisplay:function(t){if(this.cssDisplayCache){t=t||"";for(const e in this.cssDisplayCache)if(d.hasOwn(this.cssDisplayCache,e)){this.cssDisplayCache[e].style.display=t}}},updateColumnsCssRules:function(){const t=this.viewColumns,e=this.frozenInfo.column,i={};let o=0;for(let n=0,s=t.length;n=0;i--){const e=this.headerLayerHeight[i],o=this.createCssRule(`.tg-h-${i}`);o.bottom=`${t}px`,o.height=`${e}px`,t+=e}this.getLayerCombinations(e).forEach((t=>{const e=this.createCssRule(`.tg-h-${t}`);let i=0;t.split("").forEach((t=>{i+=this.headerLayerHeight[t]||0})),e.height=`${i}px`}))},getLayerCombinations:function(t){let e="";for(;t>=0;)e+=t,t--;if(e.length<2)return[];const i=[],o=function(t,e){const n=t.length;let s=e+2;for(;s<=n;){const o=t.substring(e,s);i.push(o),s++}e=i){let t="Possible Event memory leak detected. ";return t+=`More than ${i} (max limit) listeners added. `,t+="Use setMaxListeners(n) to increase limit.",void console.warn(t,e)}t.events.push(e)},addEvents:function(t,e,i){e.forEach((function(e){const o=e.type;t[o]||(t[o]={events:[]});if("function"!=typeof e.handler)return;const n=t[o];_.addEvent(n,e,i)}))},removeEventByNamespace:function(t,e){Object.keys(t).forEach((function(i){const o=t[i],n=[];o.events.forEach((function(t){t&&t.namespace!==e&&n.push(t)})),o.events=n}))},removeEventByHandler:function(t,e,i){const o=t[e];if(!o)return;const n=[];o.events.forEach((function(t){t&&t.handler!==i&&n.push(t)})),o.events=n},removeEventByType:function(t,e){const i=t[e];i&&(i.events=[])},removeEvent:function(t,e){const i=e.type,o=e.namespace;if(!i&&o)return void _.removeEventByNamespace(t,o);const n=e.handler;"function"!=typeof n?_.removeEventByType(t,i):_.removeEventByHandler(t,i,n)},removeEvents:function(t,e){e.forEach((function(e){_.removeEvent(t,e)}))},removeAllEvents:function(t){Object.keys(t).forEach((function(e){_.removeEventByType(t,e)}))},sendEventList:function(t,e,i,o){const n=e.events;for(let e=0;e!t.onceCalled))},sendEvent:function(t,e,i,o){const n=e[i];if(!n)return;const s=new P({type:i,target:t,currentTarget:t,data:o});_.sendEventList(t,n,s,o)}},N=_;class k{maxListeners=10;setMaxListeners(t){this.maxListeners=Number(t)||10}getMaxListeners(){return this.maxListeners}getEventListeners(){return this.eventListeners||(this.eventListeners={}),this.eventListeners}delEventListeners(){this.eventListeners=null}bind(t,e,i){const o=N.getEventList(this,t,e,i);if(!o.length)return this;const n=this.getEventListeners();return N.addEvents(n,o,this.maxListeners),this}once(t,e){return this.bind(t,e,{once:!0})}unbind(t,e,i){const o=this.getEventListeners();if(!arguments.length)return N.removeAllEvents(o),this;const n=N.getEventList(this,t,e,i);return n.length?(N.removeEvents(o,n),this):this}trigger(t,e){const i=this.getEventListeners();return N.sendEvent(this,i,t,e),this}}const V={DRAG_START:"drag_start",DRAG_MOVE:"drag_move",DRAG_END:"drag_end"};class O extends k{static EVENT=V;generateOptions(t){return d.merge({type:"mouse",startX:0,startY:0,previousX:0,previousY:0,currentX:0,currentY:0,moveX:0,moveY:0,offsetX:0,offsetY:0,changed:!1},t)}start(t,e){t&&(this.unbindEvents(),this.bindEvents(),this.options=this.generateOptions(e),this.startHandler(t))}bindEvents(){this.windowEvents={mousemove:{handler:t=>{this.iframeHandler(t),this.mouseMoveHandler(t)},options:!0},mouseup:{handler:t=>{this.mouseUpHandler(t)},options:{once:!0}}},d.bindEvents(this.windowEvents,window)}unbindEvents(){d.unbindEvents(this.windowEvents),this.windowEvents=null,this.previousIframe&&(this.previousIframe.classList.remove("tg-pointer-events-none"),this.previousIframe=null)}iframeHandler(t){const e=t.target;"IFRAME"===e.nodeName&&e!==this.previousIframe&&(this.previousIframe&&this.previousIframe.classList.remove("tg-pointer-events-none"),e.classList.add("tg-pointer-events-none"),this.previousIframe=e)}startHandler(t){const e=this.options;e.e=t,e.startX=t.pageX,e.startY=t.pageY,e.currentX=e.startX,e.currentY=e.startY,this.hasMoved=!1}mouseMoveHandler(t){d.preventDefault(t);const e=this.options;e.e=t,e.previousX=e.currentX,e.previousY=e.currentY,e.currentX=t.pageX,e.currentY=t.pageY,e.moveX=e.currentX-e.previousX,e.moveY=e.currentY-e.previousY,e.offsetX=e.currentX-e.startX,e.offsetY=e.currentY-e.startY,e.changed=!(0===e.offsetX&&0===e.offsetY),this.hasMoved?this.trigger(V.DRAG_MOVE,e):(this.hasMoved=!0,this.trigger(V.DRAG_START,e))}mouseUpHandler(t){this.unbindEvents();const e=this.options;this.hasMoved&&(e.e=t,d.preventDefault(t),this.trigger(V.DRAG_END,e))}destroy(){this.unbindEvents(),this.unbind()}}const $={Linear:{None:function(t){return t}}},B={MOTION_START:"motion_start",MOTION_MOVE:"motion_move",MOTION_END:"motion_end",MOTION_STOP:"motion_stop"};class D extends k{static EVENT=B;constructor(t){super(),this.constructorOptions=t,this.stopped=!0}generateOptions(t){return d.merge({easing:null,duration:100,from:0,till:1,data:0},this.constructorOptions,t)}stop(){return this.stopped||(this.stopped=!0,this.cancelAnimationFrame(),this.trigger(B.MOTION_STOP,this.data)),this}start(t){return this.stop(),this.stopped=!1,this.options=this.generateOptions(t),this.initCalculation(),this.data=this.calculateHandler(0),this.trigger(B.MOTION_START,this.data),this.stopped||(this.time=Date.now(),this.requestAnimationFrame(this.moveHandler)),this}requestAnimationFrame(t){this.requestId=window.requestAnimationFrame((()=>{t.apply(this)}))}cancelAnimationFrame(){window.cancelAnimationFrame(this.requestId)}getEasing(t){return"function"!=typeof t&&(t=d.getValue($,t,$.Linear.None)),t}moveHandler(){const t=Date.now()-this.time,e=this.duration;if(t{o[n]=this.calculateNumber(t,e[n],i[n])})),o):(this.calculateKeys=[],Object.keys(e).forEach((n=>{const s=e[n],r=i[n];d.isNum(s)&&d.isNum(r)&&(o[n]=this.calculateNumber(t,s,r),this.calculateKeys.push(n))})),o)}calculateNumber(t,e,i){return(i-e)*t+e}calculateNone(t,e,i){return e}destroy(){this.stop(),this.unbind()}}const W={TOUCH_START:"touch_start",TOUCH_MOVE:"touch_move",TOUCH_END:"touch_end",TOUCH_INERTIA:"touch_inertia"};class A extends k{static EVENT=W;generateOptions(t){return d.merge({type:"touch",startX:0,startY:0,previousX:0,previousY:0,currentX:0,currentY:0,moveX:0,moveY:0,offsetX:0,offsetY:0,changed:!1,touchLength:0,direction:"",inertia:!1,inertiaTime:200},t)}start(t,e){t&&(this.unbindEvents(),this.bindEvents(),this.options=this.generateOptions(e),this.startHandler(t))}bindEvents(){this.touchEvents={touchmove:{handler:t=>{this.touchMoveHandler(t)},options:{passive:!1}},touchend:{handler:t=>{this.touchEndHandler(t)},options:{passive:!1,once:!0}},touchcancel:{handler:t=>{this.touchCancelHandler(t)},options:{passive:!1,once:!0}}},d.bindEvents(this.touchEvents,document.body)}unbindEvents(){this.motionStop(),d.unbindEvents(this.touchEvents),this.touchEvents=null}startHandler(t){this.trackingPoints=[];const e=t.touches,i=e[0];if(!i)return;const o=this.options;o.e=t,o.startX=i.clientX,o.startY=i.clientY,o.currentX=o.startX,o.currentY=o.startY,o.touchLength=e.length,this.addTrackingPoint(o),this.trigger(W.TOUCH_START,o)}touchMoveHandler(t){const e=t.touches,i=e[0];if(!i)return;const o=this.options;o.e=t,o.previousX=o.currentX,o.previousY=o.currentY,o.currentX=i.clientX,o.currentY=i.clientY,o.moveX=o.currentX-o.previousX,o.moveY=o.currentY-o.previousY,o.offsetX=o.currentX-o.startX,o.offsetY=o.currentY-o.startY,o.changed=!(0===o.offsetX&&0===o.offsetY),o.touchLength=e.length,o.direction=this.getDirection(o),this.addTrackingPoint(o),this.trigger(W.TOUCH_MOVE,o)}touchEndHandler(t){this.unbindEvents();const e=this.options;e.e=t,this.trigger(W.TOUCH_END,e);const i=t.changedTouches[0];if(!i)return;const o=t.touches;e.touchLength=o.length,e.touchLength>0||(e.currentX=i.clientX,e.currentY=i.clientY,this.addTrackingPoint(e),this.motionStart())}touchCancelHandler(t){this.unbindEvents(),this.trigger(W.TOUCH_END,this.options)}getMotionInfo(){const t=this.trackingPoints;if(t.length<2)return;if(this.filterTrackingPoints(t),t.length<2)return;const e=t[0],i=t[t.length-1],o=i.t-e.t;if(o<=0)return;let n=i.x-e.x,s=i.y-e.y;const r=Math.abs(n),l=Math.abs(s);r>l?s=0:n=0;return{offsetDistance:Math.max(r,l),offsetTime:o,offsetX:n,offsetY:s}}motionStart(){const t=this.options;if(!t.inertia)return;const e=this.getMotionInfo();if(!e)return;const i=500*e.offsetDistance/50,o=d.clamp(i,20,2e3),n={x:20*(e.offsetX/e.offsetTime),y:20*(e.offsetY/e.offsetTime)};this.motion=new D,this.motion.bind(D.EVENT.MOTION_MOVE,((e,i)=>{t.touchInertiaX=i.x,t.touchInertiaY=i.y,this.trigger(W.TOUCH_INERTIA,t)})),this.motion.start({duration:o,from:n,till:{x:0,y:0}})}motionStop(){this.motion&&(this.motion.destroy(),this.motion=null)}getDirection(t){const i=t.offsetX,o=t.offsetY,n=Math.abs(i),s=Math.abs(o);if(n0)return e.UP;if(o<0)return e.DOWN}if(n>s){if(i>0)return e.LEFT;if(i<0)return e.RIGHT}return""}filterTrackingPoints(t){t.reverse();const e=t.length,i=Date.now(),o=this.options.inertiaTime;for(let n=0;no){t.length=n;break}t.reverse()}addTrackingPoint(t){if(!t.inertia)return;const e=t.currentX,i=t.currentY,o=Date.now(),n=this.trackingPoints;n.push({x:e,y:i,t:o}),n.length>100&&this.filterTrackingPoints(n)}destroy(){this.unbindEvents(),this.unbind()}}const F={getAllEvents:function(){return[].concat(H)},bindEvents:function(){this.unbindEvents(),this.containerEvents={mousedown:{handler:t=>{this.containerMouseDownHandler(t)},options:!0},mousemove:{handler:t=>{this.containerMouseMoveHandler(t)},options:!0},mouseover:{handler:t=>{this.containerMouseOverOutHandler(t,!0)},options:!0},mouseout:{handler:t=>{this.containerMouseOverOutHandler(t,!1)},options:!0},mouseenter:{handler:t=>{this.containerMouseEnterLeaveHandler(t,!0)},options:!0},mouseleave:{handler:t=>{this.containerMouseEnterLeaveHandler(t,!1)},options:!0},touchstart:{handler:t=>{this.containerTouchStartHandler(t)},options:{passive:!1}},touchmove:{handler:t=>{this.containerTouchMoveHandler(t)},options:{passive:!1}},touchend:{handler:t=>{this.containerTouchEndHandler(t)},options:{passive:!1}},touchcancel:{handler:t=>{this.containerTouchCancelHandler(t)},options:{passive:!1}},wheel:{handler:t=>{this.containerWheelHandler(t)},options:{passive:!1}},click:{handler:t=>{this.containerClickHandler(t)},options:!0},dblclick:{handler:t=>{this.containerDblClickHandler(t)},options:!0},contextmenu:{handler:t=>{this.containerContextMenuHandler(t)},options:!0},selectstart:{handler:t=>{this.containerSelectStartHandler(t)},options:!0},keydown:{handler:t=>{this.containerKeyDownHandler(t)},options:!0}},d.bindEvents(this.containerEvents,this.container),this.columnWidthDrag=new O,this.columnWidthDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.columnWidthDragStartHandler(t,e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.columnWidthDragMoveHandler(t,e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.columnWidthDragEndHandler(t,e)})),this.columnWidthTouch=new A,this.columnWidthTouch.bind(A.EVENT.TOUCH_START,((t,e)=>{this.columnWidthTouchStartHandler(t,e)})).bind(A.EVENT.TOUCH_MOVE,((t,e)=>{this.columnWidthTouchMoveHandler(t,e)})).bind(A.EVENT.TOUCH_END,((t,e)=>{this.columnWidthTouchEndHandler(t,e)})),this.rowDrag=new O,this.rowDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.rowDragStartHandler(t,e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.rowDragMoveHandler(t,e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.rowDragEndHandler(t,e)})),this.rowTouch=new A,this.rowTouch.bind(A.EVENT.TOUCH_START,((t,e)=>{this.rowDragStartHandler(t,e)})).bind(A.EVENT.TOUCH_MOVE,((t,e)=>{this.rowDragMoveHandler(t,e)})).bind(A.EVENT.TOUCH_END,((t,e)=>{this.rowDragEndHandler(t,e)})),this.scrollTouch=new A,this.scrollTouch.bind(A.EVENT.TOUCH_START,((t,e)=>{this.scrollTouchStartHandler(t,e)})).bind(A.EVENT.TOUCH_MOVE,((t,e)=>{this.scrollTouchMoveHandler(t,e)})).bind(A.EVENT.TOUCH_END,((t,e)=>{this.scrollTouchEndHandler(t,e)})).bind(A.EVENT.TOUCH_INERTIA,((t,e)=>{this.scrollTouchInertiaHandler(t,e)}))},isDefaultPrevented:function(t){return!!t&&t.defaultPrevented},getEventClosestNode:function(t,e){if(t&&t!==this.container)return t.classList.contains(e)?t:this.getEventClosestNode(t.parentNode,e)},getEventClosestData:function(t){if(!t||t===this.container)return;const e=this.getNodeDataCache(t);return e||this.getEventClosestData(t.parentNode)},getEventData:function(t){const e=this.getEventClosestData(t.target);if(e)return e.e=t,e},getWheelDelta:function(t,e,i){let o=t.deltaX,n=t.deltaY;return d.isNum(o)||(o=d.toNum(t.wheelDeltaX)),d.isNum(n)||(n=d.toNum(t.wheelDeltaY||t.wheelDelta)),1===t.deltaMode?(n*=e,o*=e):2===t.deltaMode&&(n*=i,o*=i),{deltaX:o,deltaY:n}},columnResizingMouseDownHandler:function(t){const e=this.getEventData(t);e&&this.columnWidthDrag.start(t,{columnItem:e.columnItem})},columnResizingTouchStartHandler:function(t){const e=this.getEventData(t);e&&this.columnWidthTouch.start(t,{columnItem:e.columnItem})},columnResizingMouseEnterLeaveHandler:function(t,e){const i=this.getEventData(t);i&&(e?this.showColumnLine(i.columnItem):this.hideColumnLine())},rowDragMouseDownHandler:function(t){const e=this.getEventData(t);e&&this.rowDrag.start(t,{rowItem:e.rowItem})},rowDragTouchStartHandler:function(t){const e=this.getEventData(t);e&&(this.protectedItem=e,this.rowTouch.start(t,{rowItem:e.rowItem}))},scrollPaneTouchStartHandler:function(t){if(!this.hasHScroll&&!this.hasVScroll)return;const e=this.getEventData(t);this.protectedItem=e,this.scrollTouch.start(t,{inertia:!0})},sortHandler:function(t,e){const i=e.columnItem;if(!this.isColumnSortable(i))return;const o=this.getEventClosestNode(t.target,"tg-column-name"),n=this.getEventClosestNode(t.target,"tg-column-sort");(o||n)&&(this.trigger(C.onSort,e),this.isDefaultPrevented(t)||this.setSortColumn(i))},selectIconAllClickHandler:function(t){const e=w(t);let i=!1;(e.hasClass("tg-selected")||e.hasClass("tg-mixed"))&&(i=!0),i=!i,this.selectAll(i)},cellEnterLeaveHandler:function(t,e){const i=this.getEventData(t);i&&(e?this.trigger(C.onCellMouseEnter,i):this.trigger(C.onCellMouseLeave,i))},rowEnterLeaveHandler:function(t,e){const i=this.getEventData(t);if(i&&(e?this.trigger(C.onRowMouseEnter,i):this.trigger(C.onRowMouseLeave,i),!this.isDefaultPrevented(t)))return this.renderRowHover(i.rowItem,e),this},containerMouseDownHandler:function(t){if(this.getEventClosestNode(t.target,"tg-column-resizing"))this.columnResizingMouseDownHandler(t);else if(this.options.rowDragVisible){this.getEventClosestNode(t.target,"tg-row-drag-icon")&&this.rowDragMouseDownHandler(t)}},containerMouseMoveHandler:function(t){this.scrollbarFadeInOutHandler(t,!0)},containerMouseOverOutHandler:function(t,e){const i=this.getEventClosestNode(t.target,"tg-cell"),o=this.getEventClosestNode(t.target,"tg-header-item");if(i||o){const i=this.getEventData(t);if(!i)return;e?this.trigger(C.onMouseOver,i):this.trigger(C.onMouseOut,i)}},containerMouseEnterLeaveHandler:function(t,e){this.scrollbarFadeInOutHandler(t,e);if(w(t.target).hasClass("tg-column-resizing"))return void this.columnResizingMouseEnterLeaveHandler(t,e);if(w(t.target).hasClass("tg-cell"))return void this.cellEnterLeaveHandler(t,e);w(t.target).hasClass("tg-row")&&this.rowEnterLeaveHandler(t,e)},containerTouchStartHandler:function(t){this.scrollTouch.motionStop();if(this.getEventClosestNode(t.target,"tg-column-resizing"))return void this.columnResizingTouchStartHandler(t);if(this.options.rowDragVisible){if(this.getEventClosestNode(t.target,"tg-row-drag-icon"))return void this.rowDragTouchStartHandler(t)}const e=this.getEventData(t);e&&(this.trigger(C.onTouchStart,e),this.isDefaultPrevented(t))||this.scrollPaneTouchStartHandler(t)},containerTouchMoveHandler:function(t){const e=this.getEventData(t);e&&this.trigger(C.onTouchMove,e)},containerTouchEndHandler:function(t){const e=this.getEventData(t);e&&this.trigger(C.onTouchEnd,e)},containerTouchCancelHandler:function(t){this.trigger(C.onTouchEnd,{e:t})},containerWheelHandler:function(t){if(this.hasMask)return;const e=this.getRowHeight(),i=this.bodyHeight,o=this.getWheelDelta(t,e,i);if(this.trigger(C.onMouseWheel,{e:t,deltaX:o.deltaX,deltaY:o.deltaY,delta:o}),this.isDefaultPrevented(t))return;let n=!1;this.scrollPaneHidden&&(n=this.scrollPaneFrozen.setOffsetH(o.deltaX),o.deltaX=0);(this.scrollPane.mouseWheelHandler(o)||n)&&d.preventDefault(t)},containerClickHandler:function(t){if(this.getEventClosestNode(t.target,"tg-tree-icon-all"))return void this.toggleAllRows();const e=this.getEventClosestNode(t.target,"tg-select-icon-all");if(e)return void this.selectIconAllClickHandler(e);const i=this.getEventData(t);if(!i)return;if(this.getEventClosestNode(t.target,"tg-header-item")){if(this.trigger(C.onClick,i),this.isDefaultPrevented(t))return;return void this.sortHandler(t,i)}if(this.getEventClosestNode(t.target,"tg-tree-icon"))return void this.toggleRow(i.rowItem);this.getEventClosestNode(t.target,"tg-select-icon")?this.setRowSelected(i.rowItem,t):this.trigger(C.onClick,i)},containerDblClickHandler:function(t){const e=this.getEventData(t)||{e:t};this.trigger(C.onDblClick,e)},containerContextMenuHandler:function(t){const e=this.getEventData(t)||{e:t};this.trigger(C.onContextMenu,e)},containerSelectStartHandler:function(t){if(this.options.textSelectable)return;w(t.target).is("input,textarea,code")||d.preventDefault(t)},containerKeyDownHandler:function(t){if(this.hasMask)return;if(this.trigger(C.onKeyDown,{e:t}),this.isDefaultPrevented(t))return;const e=t.keyCode,i={9:this.keyTabHandler,13:this.keyEnterHandler,27:this.keyEscHandler,33:this.keyPageUpHandler,34:this.keyPageDownHandler,35:this.keyEndHandler,36:this.keyHomeHandler,37:this.keyLeftHandler,38:this.keyUpHandler,39:this.keyRightHandler,40:this.keyDownHandler}[e];if(!i)return;i.call(this,t)&&d.preventDefault(t)},unbindEvents:function(){d.unbindEvents(this.containerEvents),this.containerEvents=null,this.columnWidthDrag&&(this.columnWidthDrag.destroy(),this.columnWidthDrag=null),this.columnWidthTouch&&(this.columnWidthTouch.destroy(),this.columnWidthTouch=null),this.rowDrag&&(this.rowDrag.destroy(),this.rowDrag=null),this.rowTouch&&(this.rowTouch.destroy(),this.rowTouch=null),this.scrollTouch&&(this.scrollTouch.destroy(),this.scrollTouch=null),this.protectedItem=null}},G={exportData:function(t){const e=this.getData();return{columns:this.getTreeSnapshot(e.columns,t),rows:this.getTreeSnapshot(e.rows,t)}},isItemExportable:function(t){return!!t&&(!d.hasOwn(t,"exportable")||Boolean(t.exportable))},getTreeSnapshot:function(t,e){const i=(t,o)=>{d.isList(o)&&o.forEach((o=>{if(!this.isItemExportable(o))return;const n=this.getItemSnapshot(o,e),s=o.subs;Array.isArray(s)&&(n.subs=[],i(n.subs,s)),t.push(n)}))},o=[];return i(o,t),o},getItemSnapshot:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i={};return Object.keys(t).forEach((o=>{!0!==e[o]?!1!==e[o]&&"subs"!==o&&0!==o.indexOf("tg_")&&(i[o]=t[o]):i[o]=t[o]})),i}},j={flushRow:function(t){d.toList(t).forEach((t=>{this.deleteRowCache(t)}))},flushRowFrom:function(t){d.isNum(t)&&(0!==t?this.forEachBodyCache(((e,i,o)=>{e>=t&&this.deleteRowCache(e)})):this.flushBody())},flushBody:function(){this.forEachBodyCache(((t,e,i)=>{this.deleteRowCache(t)}))},flushSort:function(){this.frozenInfo.rows?this.flushRowFrom(this.frozenInfo.rows):this.flushBody()},flushColumn:function(t){const e=d.toList(t);this.forEachBodyCache(((t,i,o)=>{e.forEach((t=>{this.deleteCellCache(o,t)}))}))},flushColumnFrom:function(t){d.isNum(t)&&this.forEachBodyCache(((e,i,o)=>{o.forEach(((e,i)=>{i>=t&&this.deleteCellCache(o,i)}))}))},flushCell:function(t,e){const i=d.toList(t),o=d.toList(e);i.forEach((t=>{const e=this.getRowCache(t);if(!e)return;const i=e.cellNodes;o.forEach((t=>{this.deleteCellCache(i,t)}))}))},flushWithViewport:function(){const{rows:t,columns:e}=this.viewport;this.forEachBodyCache(((i,o,n)=>{t.includes(i)?n.forEach(((t,i)=>{e.includes(i)||this.deleteCellCache(n,i)})):this.deleteRowCache(i)}))}},U={"sort-h":'\n\n \n \n \n \n\n',"sort-v":'\n\n \n \n \n \n\n',checkbox:'\n\n \n \n \n\n',radio:'
    ',drag:'\n\n \n\n',tree:'\n\n \n \n\n'},X={icons:U,getIcon:function(t){let e=U[t];return e=String(e).trim(),e}},Y={header:function(t,e,i,o){return t},null:function(t,e,i,o){return e&&e.tg_group?t:null==t?"—":t},blank:function(t,e,i,o){return""},string:function(t,e,i,o){return t},number:function(t,e,i,o){return t},icon:function(t,e,i,o){return`${t}`},select:function(t,e,i,o){return this.isRowSelectable(e)?this.getSelectFormatterContent(e):""},rowDrag:function(t,e,i,o){return this.getRowDragFormatterContent(e)},rowNumber:function(t,e,i,o){return e.tg_row_number||""},tree:function(t,e,i,o){return this.getTreeFormatterContent(t,e)}},q={setFormatter:function(t,e){this.renderType="all";let i=t;if("string"==typeof t){if(this.formatters)return this.formatters[t]=e,this;i={},i[t]=e}return this.customFormatters=i,this},getFormatter:function(t){if(!t)return;const e=this.formatters[t];return"function"==typeof e?e.bind(this):void 0},getDefaultFormatter:function(t){return(Y[t]||Y.string).bind(this)},getSelectFormatterContent:function(t){let e="radio";this.options.selectMultiple&&(e="checkbox");const i=X.getIcon(e);return`
    ${i}
    `},getRowDragFormatterContent:function(t){if(t.tg_frozen)return"";return`
    ${X.getIcon("drag")}
    `},getTreeIndentWidth:function(t,i,o){if(!t)return 0;let n=5;return i||(n+=e.TREE_INDENT),n+=o*e.TREE_INDENT,n},getTreeFormatterContent:function(t,e){const i=this.rowsInfo.isTree,o=e.tg_group,n=this.isEmptyGroup(e);n&&(e.collapsed=!0);const s=e.collapsed,r=d.toNum(e.tg_level),l=this.getTreeIndentWidth(i,o,r),h=[];if(h.push(`
    `),o){const t={"tg-tree-icon":!0,"tg-tree-icon-collapsed":s,"tg-tree-icon-expanded":!s,"tg-tree-icon-empty":n},e=X.getIcon("tree"),i=`
    ${e}
    `;h.push(i)}return h.push(`
    ${t}
    `),h.push("
    "),h.join("")}},K={renderHeaderTables:function(){this.clearHeaderCache();const t=this.viewColumns,e=this.frozenInfo.columns;this.hasTreeColumn=!1,this.hasSortColumn=!1;let i=[],o=[];for(let n=0,s=t.length;n=e?o.push(s):i.push(s)}if(this.frozenInfo.right){const t=i;i=o,o=t}this.renderHeaderTable(i,this.$headerL),this.renderHeaderTable(o,this.$headerR)},renderHeaderTable:function(t,e){const i=document.createElement("div"),o=["tg-header-table"];this.hasSortColumn&&(o.push("tg-header-sortable"),o.push(`tg-header-sort-${this.options.sortIndicator}`)),i.className=d.classMap(o);const n=t.length;if(n){let e=t[n-1];e&&"tg-column-blank"===e.id&&(e=t[n-2]),t.forEach((t=>{this.renderHeaderItem(t,i,e)}))}e.append(i)},renderHeaderItem:function(t,e,i){const o=t.tg_view_index;if(this.getHeaderCache(o))return;const n=this.getHeaderItemClass(t,i),s=d.styleMap(t.headerStyleMap),r={column:o,class:n,data:t.id};s&&(r.style=s);const l=[this.createColumnHeader(t)];if(this.isColumnResizable(t)){const e=this.createColumnResizing(t);l.push(e)}const h=this.createElement("div",r,l);e.appendChild(h),this.setHeaderCache(o,h),this.setNodeDataCache(h,{rowItem:this.headerRowItem,column:o,columnItem:t,headerNode:h}),t.tg_parent&&this.renderHeaderItem(t.tg_parent,e)},createColumnHeader:function(t){const e={class:this.getHeaderClass(t),style:this.getHeaderStyle(t)},i=[this.createColumnName(t)];if(this.hasSortColumn&&!t.tg_group){const e=this.createColumnSort(t);i.push(e)}return this.createElement("div",e,i)},createColumnName:function(t){const e=["tg-column-name"];t.tg_group&&e.push("tg-header-group-name");const i={class:e.join(" ")};let o=t.name;const n=t.tg_headerFormatter;return"function"==typeof n&&(o=n.call(this,o,this.headerRowItem,t)),"tree"===t.formatter?o=this.createHeaderTreeName(o):t===this.selectColumn&&this.isSelectAllVisible()&&(o=this.createHeaderSelectName()),this.createElement("div",i,o)},createHeaderTreeName:function(t){this.hasTreeColumn=!0;const e=[];if(this.options.collapseAllVisible){const t=X.getIcon("tree"),i=this.createElement("div",{class:"tg-tree-icon tg-tree-icon-all"},t);e.push(i)}else{const t=this.createElement("div",{class:"tg-tree-icon"});e.push(t)}const i=this.createElement("div",{class:"tg-tree-name"},t);e.push(i);return this.createElement("div",{class:"tg-tree"},e)},createHeaderSelectName:function(){const t=X.getIcon("checkbox");return this.createElement("div",{class:"tg-select-icon-all tg-checkbox"},t)},createColumnSort:function(t){let e;return this.isColumnSortable(t)&&(e="h"===this.options.sortIndicator?this.createSortIndicatorH(t):this.createSortIndicatorV(t)),this.createElement("div",{class:"tg-column-sort"},e)},createSortIndicatorH:function(t){const e=X.getIcon("sort-h"),i=[this.createElement("div",{class:"tg-sort-indicator-line"}),this.createElement("div",{class:"tg-sort-indicator-icon"},e)];return this.createElement("div",{class:"tg-sort-indicator"},i)},createSortIndicatorV:function(t){const e=X.getIcon("sort-v"),i=[this.createElement("div",{class:"tg-sort-indicator-icon"},e)];return this.createElement("div",{class:"tg-sort-indicator"},i)},createColumnResizing:function(){return this.createElement("div",{class:"tg-column-resizing"})},getHeaderItemClass:function(t,e){const i=["tg-header-item"];return t.tg_group&&i.push("tg-header-group-item"),t===e&&i.push("tg-header-column-last"),i.push(`tg-c-${t.tg_view_index}`),i.push(`tg-h-${t.tg_layer}`),t.tg_combination&&i.push(`tg-h-${t.tg_combination}`),i.push(d.classMap(t.headerClassMap)),d.classMap(i)},getHeaderClass:function(t){const e=["tg-column-header"];return"tree"===t.formatter&&(e.push("tg-tree-header"),this.rowsInfo.isTree&&e.push("tg-tree-header-indent")),this.isColumnSortable(t)&&e.push(`tg-column-sortable tg-column-sort-${this.options.sortIndicator}`),t.align&&e.push(`tg-align-${t.align}`),e.join(" ")},getHeaderStyle:function(t){const e=[d.styleMap(t.headerStyleMap)],i=t.tg_width;return this.isInvisible(t)||i<=0?e.push("display:none;"):e.push(`width:${i}px;`),e.join("")}},J={renderHeader:function(){this.cssRulesInvalid=!0,this.$headerL.empty(),this.$headerR.empty(),this.resetCssDisplay(),this.renderHeaderTables(),this.renderHeaderSort(),this.headerCreated=!0,this.trigger(C.onHeaderUpdated,{node:this.$headerFrame.get(0)})},initHeaderLayerHeight:function(){this.updateScrollPaneHiddenState(),this.resetCssDisplay(),this.viewAllColumns.forEach((t=>{this.updateColumnHeaderHeight(t)})),this.resetCssDisplay("none"),this.updateHeaderLayerHeight()},updateHeaderLayerHeight:function(){const t={},e=this.columnsInfo.maxLevel;for(let i=0;i<=e;i++)t[i]=0;const i=[];this.viewAllColumns.forEach((function(e){if(e.tg_combination)i.push(e);else{const i=e.tg_height,o=e.tg_layer;t[o]=Math.max(t[o],i)}})),i.forEach((function(e){let i=e.tg_height;const o=e.tg_combination.split(""),n=o.pop();o.forEach((function(e){i-=t[e]||0})),t[n]=Math.max(t[n],i)}));const o=JSON.stringify(t);this.previousHeaderLayerHeight!==o&&(this.previousHeaderLayerHeight=o,this.headerLayerHeight=t,this.cssRulesInvalid=!0)}};var Q=i(915);const Z={create:function(t){this.id=d.uid(4,"tg-"),d.isObject(t)||(t={container:t}),this.constructorOptions=t,this.createCache(),this.createView(t.container)},createView:function(t){this.createHolder(t),this.$holder?(this.createGlobalStyle(),this.createContainer()):console.error("Grid requires a container")},createHolder:function(t){const e=w(t);if(!e.length)return;this.$holder=e,this.$holder.empty(),this.holder=this.$holder.get(0);const i=this.holder.getRootNode();this.shadowRoot=null,i&&i.host&&(this.shadowRoot=i)},createGlobalStyle:function(){const t=this.shadowRoot||document.head;if(t.querySelector(`style[context="${e.ID}"]`))return;const i=document.createElement("style");i.setAttribute("context",e.ID),i.innerHTML=Q.A.toString(),t.appendChild(i)},createContainer:function(){return this.$container=w('
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n').appendTo(this.$holder),this.$container.attr("id",this.id),this.$container.addClass(`${e.NS} ${this.id}`),this.container=this.$container.get(0),d.setInstance(this.container,this),this.$headerFrame=this.$container.find(".tg-header-frame"),this.$paneHL=this.$headerFrame.find(".tg-pane-header-left"),this.$paneHR=this.$headerFrame.find(".tg-pane-header-right"),this.$headerL=this.$paneHL.find(".tg-header-left"),this.$headerR=this.$paneHR.find(".tg-header-right"),this.$header=w().add(this.$headerL).add(this.$headerR),this.$bodyFrame=this.$container.find(".tg-body-frame"),this.$paneTL=this.$bodyFrame.find(".tg-pane-top-left"),this.$paneTR=this.$bodyFrame.find(".tg-pane-top-right"),this.$paneBL=this.$bodyFrame.find(".tg-pane-bottom-left"),this.$paneBR=this.$bodyFrame.find(".tg-pane-bottom-right"),this.$bodyTL=this.$paneTL.find(".tg-body-top-left"),this.$bodyTR=this.$paneTR.find(".tg-body-top-right"),this.$bodyBL=this.$paneBL.find(".tg-body-bottom-left"),this.$bodyBR=this.$paneBR.find(".tg-body-bottom-right"),this.$body=w().add(this.$bodyTL).add(this.$bodyTR).add(this.$bodyBL).add(this.$bodyBR),this.$columnLineContainer=this.$container.find(".tg-column-line"),this.$columnLineItem=this.$columnLineContainer.find(".tg-column-line-item"),this.$columnLineItemL=this.$columnLineContainer.find(".tg-column-line-l"),this.$columnLineItemR=this.$columnLineContainer.find(".tg-column-line-r"),this}},tt={initColumnsHandler:function(){this.columns=this.data.columns,this.columns.forEach(((t,e)=>{t&&"object"==typeof t||(this.columns[e]={})}));const t=this.getPrivateColumns();this.columnsInfo=this.initTreeInfo(t,this.frozenInfo.column);const e=[],i=[],o=(t,n)=>{if(!d.isList(t))return;let s,r=0;t.forEach((t=>{if(!this.isInvisible(t))if(t.tg_group){if(this.isEmptyGroup(t))return;i.push(t),o(t.subs,t)}else t.tg_list_index=r,r+=1,t.tg_list_last=!1,s=t,e.push(t)})),s&&(s.tg_list_last=!0)};o(t),e.forEach((t=>{this.initColumnItemHandler(t)})),i.forEach((t=>{this.initColumnGroupHandler(t)}));const n=[].concat(e).concat(i);this.initViewList(n,((t,e)=>{})),this.viewColumns=e,this.viewGroupColumns=i,this.viewAllColumns=n,this.initHeaderHandler(t),this.initSortColumn()},getPrivateColumns:function(){const t=this.options;this.selectColumn=t.selectColumn,this.rowDragColumn=t.rowDragColumn,this.rowNumberColumn=t.rowNumberColumn,this.blankColumn=t.blankColumn;let e=[];const i=()=>{t.selectVisible&&e.push(this.selectColumn),t.rowDragVisible&&e.push(this.rowDragColumn),t.rowNumberVisible&&(this.rowNumberColumn.width=t.rowNumberWidth,e.push(this.rowNumberColumn))};if(this.frozenInfo.right){const t=this.frozenInfo.column;this.columns.forEach(((o,n)=>{e.push(o),n===t&&i()}))}else i(),e=e.concat(this.columns);return e.push(this.blankColumn),e},setColumns:function(t){this.data.columns=d.toList(t),this.rerender()},getColumns:function(){return this.columns},getViewColumns:function(t){return t?this.viewAllColumns:this.viewColumns},initColumnItemHandler:function(t){this.initColumnProps(t),this.initColumnFormatter(t),this.initColumnWidth(t)},initColumnGroupHandler:function(t){this.initColumnFormatterByName(t,"headerFormatter","header")},initColumnProps:function(t){const e=this.options.columnTypes;if(!d.hasOwn(t,"type")){const i=e[t.id];"string"==typeof i&&(t.type=i)}let i=this.options.columnProps;const o=e[t.type];o&&"object"==typeof o&&(i=d.merge(i,o));for(const e in i)d.hasOwn(t,e)||(t[e]=i[e])},initColumnFormatter:function(t){this.initColumnFormatterByName(t,"headerFormatter","header");let e=t.type;const i=t.formatter;"string"==typeof i&&(e=i),this.initColumnFormatterByName(t,"formatter",e)},initColumnFormatterByName:function(t,e,i){let o=t[e];"function"!=typeof o?(o=this.getFormatter(i),t[`tg_${e}`]=o||this.getFormatter("string")):t[`tg_${e}`]=o.bind(this)},initColumnWidth:function(t){if(t!==this.blankColumn)return d.isNum(t.width)&&t.width>=0?(t.tg_width=t.width,t.minWidth=Math.min(t.minWidth,t.tg_width),void(t.maxWidth=Math.max(t.maxWidth,t.tg_width))):void this.initColumnWidthByName(t);t.tg_width=0},initColumnWidthByName:function(t){const e=this.getComputedColumnWidth(t);d.isNum(e)&&(t.tg_width=e)},getComputedColumnWidth:function(t){const e=t.name||"",i=d.getCharLen(e);let o=Math.round(10*i);return o>103&&(o=Math.max(103,Math.round(10*i/2)),o>133&&(o=Math.max(133,Math.round(10*i/3)),o>163&&(o=Math.max(163,Math.round(10*i/4))))),d.clamp(o,t.minWidth,t.maxWidth)},initSortColumn:function(){this.sortColumn=null;const t=this.options,e=t.sortField;if(!e)return;const i=this.getColumnItemById(e);return i&&this.isColumnSortable(i)?(d.hasOwn(i,"sortAsc")||(i.sortAsc=t.sortAsc),this.sortColumn=i,this):void 0}},et={initHeaderHandler:function(t){this.initHeaderRowItem(),this.viewGroupColumns.reverse(),this.initGroupColumnsWidth(),this.initGroupColumnsLayer(t)},initHeaderRowItem:function(){this.headerRowItem={tg_index:-1,tg_view_index:-1},this.viewAllColumns.forEach((t=>{d.hasOwn(t,"id")&&(this.headerRowItem[t.id]=t.name)}))},initGroupColumnsWidth:function(){this.viewGroupColumns.forEach((t=>{let e=0;t.subs.forEach((t=>{this.isInvisible(t)||(e+=t.tg_width)})),t.tg_width=e}))},initGroupColumnsLayer:function(t){const e=this.columnsInfo.maxLevel;this.viewColumns.forEach((function(t){t.tg_layer=e,t.tg_parent&&(t.tg_parent.tg_layer=e-1)})),this.viewGroupColumns.forEach((function(t){const e=t.tg_layer,i=t.tg_parent;if(i){let t=e-1;d.isNum(i.tg_layer)&&(t=Math.min(t,i.tg_layer)),i.tg_layer=t}})),this.initColumnRowspanHandler(t,0)},initColumnRowspanHandler:function(t,e){t.forEach((t=>{const i=this.initColumnCombinationHandler(t,e);t.tg_group&&this.initColumnRowspanHandler(t.subs,e+i)}))},initColumnCombinationHandler:function(t,e){const i=[],o=t.tg_layer;for(;e<=o;)i.push(e),e+=1;i.reverse();const n=i.length;let s="";return n>1&&(s=i.join("")),t.tg_combination=s,n}},it={},ot={name:"",minWidth:81,maxWidth:300},nt=function(t){return null==t},st=function(t,e){const i=nt(t),o=nt(e);return i&&o?0:i?1:o?-1:void 0},rt=function(t,e){return t.tg_index>e.tg_index?1:-1},lt=function(t,e){return rt(t,e)},ht=function(t,e){if("string"==typeof t&&"string"==typeof e){const i=t.toUpperCase(),o=e.toUpperCase();if(i!==o)return i>o?-1:1}return t>e?-1:1},at=function(t,e,i,o){return t?-1:e?1:ht(i,o)},ct=function(t,e){const i="number"==typeof t,o="number"==typeof e;return i&&o?t>e?-1:1:at(i,o,t,e)},dt=function(t,e){const i=new Date(t),o=new Date(e),n=d.isDate(i),s=d.isDate(o);if(n&&s){const t=i.getTime(),e=o.getTime();if(t===e)return;return t>e?-1:1}return at(n,s,t,e)},ut=function(t,e){const i="boolean"==typeof t,o="boolean"==typeof e;return i&&o?t>e?-1:1:at(i,o,t,e)},gt=function(t,e,i,o){const n=t[i.sortField],s=e[i.sortField],r=st(n,s);if("number"==typeof r)return 0===r?lt(t,e):i.sortBlankFactor*r;if(n!==s&&"function"==typeof o){const t=o(n,s);if(d.isNum(t))return i.sortFactor*t}return lt(t,e)},ft={blankValue:st,equal:lt,index:rt,value:gt,diffType:at,string:function(t,e,i){return gt(t,e,i,ht)},stringValue:ht,number:function(t,e,i){return gt(t,e,i,ct)},numberValue:ct,date:function(t,e,i){return gt(t,e,i,dt)},dateValue:dt,boolean:function(t,e,i){return gt(t,e,i,ut)},booleanValue:ut};const pt={initOptionsHandler:function(){return this.options=this.generateOptions(),this.initOptionsFormatters(),this.initOptionsSort(),this.initOptionsFrozen(),this.initOptionsScrollbar(),this.initOptionsContainer(),this.initBindWindowResize(),this.initBindContainerResize(),this},generateOptions(){const t={className:e.NS,theme:e.ID,headerVisible:!0,rowHeight:32,rowFilter:null,rowFilteredSort:null,rowNotFound:"",rowMoveCrossLevel:!0,rowCacheLength:0,rowProps:it,columnTypes:{tree:{type:"tree",formatter:"tree",width:230,minWidth:120,maxWidth:810},number:{type:"number",align:"right"},date:{type:"date",align:"right"},name:"tree"},columnCacheLength:0,columnProps:ot,collapseAllOnInit:null,collapseAllVisible:!0,selectAllOnInit:null,selectVisible:!1,selectAllVisible:!0,selectMultiple:!0,selectColumn:{private:!0,id:"tg-column-select",name:"",formatter:"select",headerClassMap:"tg-header-select",classMap:"tg-cell-select",width:36,align:"center",resizable:!1,sortable:!1,exportable:!1},rowDragCrossLevel:!0,rowDragVisible:!1,rowDragColumn:{private:!0,id:"tg-column-row-drag",name:"",formatter:"rowDrag",headerClassMap:"tg-header-row-drag",classMap:"tg-cell-row-drag",align:"center",width:36,resizable:!1,sortable:!1,exportable:!1},rowNumberWidth:36,rowNumberFilter:null,rowNumberVisible:!1,rowNumberColumn:{private:!0,id:"tg-column-row-number",name:"",formatter:"rowNumber",headerClassMap:"tg-header-row-number",classMap:"tg-cell-row-number",align:"center",maxWidth:100,sortable:!1,exportable:!1},blankColumn:{private:!0,id:"tg-column-blank",name:"",formatter:"blank",headerClassMap:"tg-header-blank",classMap:"tg-cell-blank",width:0,minWidth:0,maxWidth:4096,resizable:!1,sortable:!1,exportable:!1},sortField:"",sortAsc:!0,sortBlankValueBottom:!0,sortComparers:ft,sortOnInit:!1,sortIndicator:"h",highlightKeywords:{textKey:"tg_text_",textGenerator:null,highlightKey:"tg_highlight_",highlightPre:"",highlightPost:""},frozenRow:-1,frozenRowMax:10,frozenRowHoverable:!1,frozenBottom:!1,frozenColumn:-1,frozenColumnMax:10,frozenRight:!1,scrollbarSize:12,scrollbarSizeH:null,scrollbarSizeV:null,scrollbarRound:!1,scrollbarFade:!1,scrollbarFadeTimeout:1e3,scrollbarType:"auto",scrollPaneMinWidth:30,scrollPaneGradient:30,autoHeight:!1,textSelectable:!1,bindWindowResize:!1,bindContainerResize:!1},i=this.generateThemeOptions();return d.merge(t,i,this.constructorOptions,this.customOptions,this.dataOptions)},generateThemeOptions(){const t=this.pickOptions("theme").pop();if(t)return this.getThemeOptions(t)},pickOptions(t){return[this.constructorOptions,this.customOptions,this.dataOptions].map((e=>e&&e[t])).filter((t=>t))},initOptionsFormatters(){let t;const e=this.pickOptions("formatters");e.length&&(t=d.merge.apply(null,e)),this.formatters=d.merge(Y,t,this.customFormatters),this.nullFormatter=this.getFormatter("null")},initOptionsSort(){"v"!==this.options.sortIndicator&&(this.options.sortIndicator="h")},initOptionsFrozen:function(){const t=this.options;this.frozenInfo={column:-1,row:-1,columns:0,rows:0,bottom:Boolean(t.frozenBottom),right:Boolean(t.frozenRight)};let e=d.toNum(t.frozenColumn,!0);e=d.clamp(e,-1,t.frozenColumnMax),e>-1&&!this.frozenInfo.right&&(t.selectVisible&&(e+=1),t.rowDragVisible&&(e+=1),t.rowNumberVisible&&(e+=1)),this.frozenInfo.column=e,e>-1?this.frozenInfo.columns=e+1:(this.frozenInfo.columns=0,this.frozenInfo.right=!1);let i=d.toNum(t.frozenRow,!0);i=d.clamp(i,-1,t.frozenRowMax),this.frozenInfo.row=i,i>-1?this.frozenInfo.rows=i+1:(this.frozenInfo.rows=0,this.frozenInfo.bottom=!1)},initOptionsScrollbar:function(){const t=this.options;("auto"===t.scrollbarType&&d.isTouchDevice()||["touch","mobile"].includes(t.scrollbarType))&&(t.scrollbarFade=!0,t.scrollbarSize=6,t.scrollbarRound=!0);const e=d.toNum(t.scrollbarSize);this.scrollbarSizeH=e,d.isNum(t.scrollbarSizeH)&&(this.scrollbarSizeH=t.scrollbarSizeH),this.scrollbarSizeV=e,d.isNum(t.scrollbarSizeV)&&(this.scrollbarSizeV=t.scrollbarSizeV)},initOptionsContainer:function(){this.$container.attr("id",this.id);const t=this.options;this.$container.removeClass();const i=[e.NS,this.id,`tg-${t.theme}`,t.className];t.textSelectable||i.push("tg-text-unselectable"),d.isTouchDevice()&&i.push("tg-touch-device"),this.$container.addClass(d.classMap(i))}},mt={initBindWindowResize:function(){this.unbindWindowResize(),this.options.bindWindowResize&&(this.windowResizeEvents={resize:{handler:t=>{this.resize()}}},d.bindEvents(this.windowResizeEvents,window))},unbindWindowResize:function(){d.unbindEvents(this.windowResizeEvents)},initBindContainerResize:function(){if(this.unbindContainerResize(),!this.options.bindContainerResize||!this.holder)return;if("undefined"==typeof ResizeObserver)return;this.resizeObserver=new ResizeObserver((t=>{var e;(e=this.holder,Boolean(e.offsetWidth||e.offsetHeight||e.getClientRects().length))&&this.resize()})),this.resizeObserver.observe(this.holder)},unbindContainerResize:function(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}},bt={initRowsHandler:function(){this.rows=this.data.rows,this.rowsInfo=this.initTreeInfo(this.rows,this.frozenInfo.row)},getRows:function(){return this.rows},getViewRows:function(){return this.viewRows},createViewRows:function(){this.initRowFilterHandler();const t=[],e=this.getRowNumberFilter();let i=1;const o=(t,o)=>{if(e.call(this,t,o))return t.tg_row_number=i,void(i+=1);t.tg_row_number=""},n=(e,i,s)=>{if(!d.isList(e))return;let r,l=0;e.forEach((e=>{if(this.isInvisible(e))return;e.tg_list_index=l,l+=1,e.tg_list_last=!1,r=e,this.gridRowItemHandler(e),o(e,l),s||t.push(e);const i=s||e.tg_group&&e.collapsed;n(e.subs,e,i)})),r&&(r.tg_list_last=!0)};n(this.rows);let s,r=0;return this.initViewList(t,((t,e)=>{t.tg_top=r,this.initRowHeight(t),r+=this.getRowHeight(t),t.tg_group_line=!1,t.collapsed&&(t.tg_group_line=!0),s&&(t.tg_group||t.tg_level{const i=this.getRowItem(t);if(!i)return;const s=o[e]||n;i.height=s,delete i.tg_height,this.initRowHeight(i),this.flushRowFrom(i.tg_view_index)})),this.render("rows"),this},initRowFilterHandler:function(){const t=this.options.rowFilter;if("function"!=typeof t)return;if(this.forEachRow(((e,i,o)=>{if(e.tg_invisible)return;const n=!t.call(this,e,i,o);if(e.tg_filtered=n,!n){let t=e;for(;t.tg_parent;)t.tg_parent.tg_filtered=!1,t=t.tg_parent}})),this.sortColumn)return;let e=this.options.rowFilteredSort;if("function"==typeof e&&(e=e.call(this)),!e)return;"string"==typeof e&&(e={sortField:e,sortAsc:this.options.sortAsc});const i=e.sortField||e.id;i&&this.sortRows(i,e)},highlightKeywordsFilter:function(t,e,i){const{textKey:o,textGenerator:n,highlightKey:s}=this.options.highlightKeywords;if(e.forEach((e=>{t[`${s}${e}`]=null})),!i)return!0;const r=`${i}`.trim().toLowerCase().split(/\s+/g).filter((t=>t));if(!r.length)return!0;let l=!1;const h=(e,i)=>(/<\/?[a-z][\s\S]*>/i.test(e)&&(e=((e,i)=>{const n=`${o}${i}`,s=t[n];if(s)return s;const r=document.createElement("div");r.innerHTML=e;const l=r.innerText;return t[n]=l,l})(e,i)),(t=>{const e=t.toLowerCase();let i=0;for(const t of r){const o=e.indexOf(t,i);if(-1===o)return;i=o+t.length}return!0})(e));let a=function(t,e){return t[e]};return"function"==typeof n&&(a=n),e.forEach((e=>{const i=a(t,e);if(null==i)return;const o=`${i}`.trim();if(!o)return;const n=h(o,e);n&&(t[`${s}${e}`]=n,l=!0,this.highlightKeywords=r)})),l},highlightKeywordsHandler:function(){const{highlightCells:t}=this.renderSettings;if(!t.length)return;const e=this.highlightKeywords;e&&d.nextTick((()=>{t.forEach((t=>{const i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT),o=[];let n=i.nextNode();for(;n;)o.push(n),n=i.nextNode();o.length&&this.highlightTextNodes(o,e)}))}))},highlightTextNodes:function(t,e){const{highlightPre:i,highlightPost:o}=this.options.highlightKeywords;let n=0;const s=()=>(n>=e.length&&(n=0),e[n++]);let r=s();t.forEach((t=>{const e=t.textContent,n=e.toLowerCase(),l=[];let h=0;const a=e.length;let c=!1;for(;h{if(e.selected){if(t)return void(e.selected=!1);t=e}}))}const t=this.options.selectAllOnInit;!0!==t?!1===t&&this.updateAllRowsSelected(!1):this.updateAllRowsSelected(!0)},updateAllRowsSelected:function(t){this.forEachSelectableRow((e=>{e.selected=t}))},initCollapseAllOnInitHandler:function(){const t=this.options.collapseAllOnInit;!0!==t?!1===t&&this.updateAllRowsCollapsed(!1):this.updateAllRowsCollapsed(!0)},getToBeAddedItemList:function(t){const e=[];return d.toList(t).forEach((t=>{t&&"object"==typeof t?e.push(t):void 0!==t&&e.push({name:t})})),e},getToBeAddedParentSubs:function(t,e){return t?(t.subs||(t.subs=[]),t.subs):e},getToBeAddedPositionIndex:function(t,e){const i=e.length;return d.isNum(t)&&t>=0&&t<=i?Math.round(t):i},generateDataSnapshot:function(t){if(!t||"object"!=typeof t)return t;const e=this.cleanTreeList(t.rows),i=this.cleanTreeList(t.columns);return this.convertNumberType(e,i),t.rows=e,t.columns=i,t},cleanTreeList:function(t){if(!d.isList(t))return[];const e=(t,i)=>{i.forEach((i=>{if(!i||"object"!=typeof i)return void t.push({});const o=this.getItemSnapshot(i),n=i.subs;Array.isArray(n)&&(o.subs=[],e(o.subs,n)),t.push(o)}))},i=[];return e(i,t),i},convertNumberType:function(t,e){const i=[];d.forEachTree(e,(function(t){"number"===t.type&&t.id&&i.push(t.id)})),i.length&&d.forEachTree(t,(function(t){i.forEach((function(e){t[e]=d.convertNum(t[e])}))}))}},vt={setDefaultLoading:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return;const i=t.style;e.size&&(i.width=e.size,i.height=e.size),e.color&&(i.color=e.color),e.size||e.color||t.removeAttribute("style"),e.fast?t.classList.add("tg-loading-fast"):t.classList.remove("tg-loading-fast")},getDefaultLoading:function(t){return this.setDefaultLoading(this.$defaultLoading,t),this.$defaultLoading},getLoadingHolder:function(){return this.$container?this.$container.find(".tg-loading"):w()},setLoading:function(t){if(!this.$container)return this;this.$defaultLoading||(this.$defaultLoading=this.$container.find(".tg-loading-default").get(0));const e=this.getLoadingHolder().get(0);return"function"==typeof t&&(t=t.call(this,e)),d.isObject(t)&&(t=this.getDefaultLoading(t)),t||(t=this.getDefaultLoading()),this.renderNodeContent(e,t),this},showLoading:function(){return this.getLoadingHolder().show(),this},hideLoading:function(){return this.getLoadingHolder().hide(),this}},Ht={showMask:function(t){if(!this.hasMask||t){const e=this.$container.find(".tg-mask"),i=e.get(0);if(t&&i){const e=d.styleMap(t);e&&(i.style.cssText=e)}e.show(),this.hasMask=!0}return this},hideMask:function(){return this.hasMask&&(this.$container.find(".tg-mask").hide(),this.hasMask=!1),this}},yt={renderNodeContent:function(t,e){if(t){if(e&&e.nodeType)return this.emptyNode(t),void t.appendChild(e);if(Array.isArray(e))return this.emptyNode(t),void e.forEach((e=>{e&&e.nodeType&&t.appendChild(e)}));void 0===e&&(e=""),t.innerHTML=e}},emptyNode:function(t){if(t)for(;t.firstChild;)t.removeChild(t.firstChild)},removeNode:function(t){t&&t.parentNode&&t.parentNode.removeChild(t)},appendNode:function(t,e){t&&e&&t.appendChild(e)},createElement:function(t,e,i){const o=document.createElement(t);e&&Object.keys(e).forEach((function(t){const i=e[t];void 0!==i&&o.setAttribute(t,i)})),d.isArray(i)||(i=[i]);let n="";return i.forEach((function(t){t&&t.nodeType?o.appendChild(t):void 0!==t&&(n+=t)})),n&&(o.innerHTML=n),o},find:function(t,e){return w(e||this.$container).find(t)},getRowNodes:function(t){const e=this.getRowItem(t);if(e)return this.getRowNodesByIndex(e.tg_view_index)},getCellNode:function(t,e){const i=this.getRowItem(t);if(!i)return;const o=this.getColumnItem(e);return o?this.getCellNodeByIndex(i.tg_view_index,o.tg_view_index):void 0},getHeaderItemNode:function(t){const e=this.getColumnItem(t);if(e)return this.getHeaderCache(e.tg_view_index)},getColumnHeaderNode:function(t){const e=this.getHeaderItemNode(t);if(e)return e.querySelector(".tg-column-header")}},Ct={render:function(){this.asyncRender||(this.asyncRender=d.microtask(this.renderSync)),this.asyncRender.apply(this,arguments)},renderSync:function(){this.renderStartedTimestamp=Date.now();const t=this.generateRenderSettings.apply(this,arguments);return this.renderSettings=t,"all"===t.type?(this.flushBody(),this.initHandler(),this.renderHeader(),this.updateViewRowsAndSize(),this.renderBody(),this):"columns"===t.type?(this.flushBody(),this.initColumnsHandler(),this.renderHeader(),this.updateViewRowsAndSize(),this.renderBody(),this):"rows"===t.type?(this.updateViewRowsAndSize(),this.renderBody(),this):"resize"===t.type?(this.resizeHandler(),this.renderBody(),this):(this.renderBody(),this)},generateRenderSettings:function(t){const e={type:this.renderType,scrollLeft:null,scrollTop:null,scrollColumn:null,scrollRow:null,highlightCells:[]};return"string"==typeof t?e.type=t:t&&Object.assign(e,t),this.headerCreated||(e.type="all"),e},renderBody:function(){this.scrollOnInit(),this.scrollTopOffset=this.scrollPane.getScrollTopOffset();const t=this.getViewport();return this.viewport=t,this.flushWithViewport(),this.previousScrollTopOffset!==this.scrollTopOffset&&(this.previousScrollTopOffset=this.scrollTopOffset,this.updateRowCacheTopOffset()),this.renderRows(t.rows),this.renderCells(t.rows,t.columns),this.renderUpdatedTimestamp=Date.now(),this.renderDuration=this.renderUpdatedTimestamp-this.renderStartedTimestamp,this.trigger(C.onUpdated,t),this.firstUpdated||(this.firstUpdated=!0,this.trigger(C.onFirstUpdated,t)),this.layoutEventHandler(),this.resizeEventHandler(),this.highlightKeywordsHandler(),this.renderSettings=null,this.renderType=null,this},rerender:function(){return this.render("all"),this}},Rt={resize:function(){return this.asyncResize||(this.asyncResize=d.throttle(this.resizeSync,100)),this.asyncResize.apply(this,arguments),this},resizeSync:function(){return this.headerCreated?(this.resizeHolderHandler.apply(this,arguments),this.firstUpdated&&this.isHolderInvisible()||this.render("resize"),this):this},resizeHolderHandler(t,e){if(0!==arguments.length)return 1===arguments.length?t&&"object"==typeof t?void this.$holder.css(t):void this.$holder.css({width:t}):void this.$holder.css({width:t,height:e})},isHolderInvisible(){const t=this.$holder.width(),e=this.$holder.height();return!t||!e},resizeHandler:function(){this.containerWidth=this.$container.width(),this.containerHeight=this.$container.height(),this.headerWidth=this.containerWidth,this.bodyWidth=this.containerWidth,this.updateTotalColumnsWidth(),this.resizeHeaderHandler(),this.resizeBodyHandler()},layoutEventHandler:function(){const t=this.previousLayout||{},e={headerWidth:this.headerWidth,headerHeight:this.headerHeight,bodyWidth:this.bodyWidth,bodyHeight:this.bodyHeight};Object.values(e).join("")!==Object.values(t).join("")&&(this.previousLayout=e,this.trigger(C.onLayout,d.merge({previous:t},e)))},resizeEventHandler:function(){const t=this.previousSize||{},e={width:this.containerWidth,height:this.containerHeight};Object.values(e).join("")!==Object.values(t).join("")&&(this.previousSize=e,this.trigger(C.onResize,d.merge({previous:t},e)))},resizeHeaderHandler:function(){this.initHeaderLayerHeight();const t=this.options;t.autoHeight&&this.viewRows.length>5e3&&(t.autoHeight=!1),this.headerHeight=0,t.headerVisible&&(this.containerHeight>0||t.autoHeight)&&this.updateHeaderTableHeight(),this.$headerFrame.css({width:this.headerWidth,height:this.headerHeight})},updateHeaderTableHeight:function(){let t=0;Object.keys(this.headerLayerHeight).forEach((e=>{t+=this.headerLayerHeight[e]}));const e=this.$headerL.find(".tg-header-table"),i=this.$headerR.find(".tg-header-table");e.css({height:t}),i.css({height:t}),this.headerHeight=t},resizeBodyHandler:function(){this.updateScrollState(),this.bodyHeight=this.containerHeight-this.headerHeight,this.$bodyFrame.css({width:this.bodyWidth,height:this.bodyHeight}),this.updatePaneWidth(),this.updatePaneHeight(),this.updateCanvasWidth(),this.updateCanvasHeight(),this.updateScrollPane(),this.updateCssRules()},updatePaneWidth:function(){let t=this.bodyWidth,e=0;if(this.frozenInfo.columns){const i=this.getScrollbarWidth();this.frozenInfo.right?(e=this.columnsWidthR+i,t=this.bodyWidth-e):(t=this.columnsWidthL,e=this.bodyWidth-t),this.scrollPaneHidden&&(this.frozenInfo.right?(t<=0&&(t=0),e=Math.max(0,this.bodyWidth-t)):(e3&&void 0!==arguments[3])||arguments[3];const n=this.getToBeAddedItemList(t);if(!n.length)return!1;let s;if(null!=e&&(s=this.getRowItem(e),!s))return!1;const r=this.getToBeAddedParentSubs(s,this.rows),l=this.getToBeAddedPositionIndex(i,r),h=[l,0].concat(n);r.splice.apply(r,h),this.initRowsHandler(),s?(s.collapsed=!1,this.flushRowFrom(s.tg_view_index+l)):this.flushRowFrom(l),this.onNextUpdated((function(){this.trigger(C.onRowAdded,n)}));const a={type:"rows"};return o&&(a.scrollRow=n[n.length-1]),this.render(a),!0},deleteRow:function(t){const e=d.toList(t),i=[];if(e.forEach((t=>{const e=this.getRowItem(t);e&&i.push(e)})),!i.length)return!1;const o=this.removeRowsHandler(i);this.initRowsHandler();const n=this.getRemovedMinIndex(o);return this.flushRowFrom(n),this.onNextUpdated((function(){this.trigger(C.onRowRemoved,i)})),this.render("rows"),!0},getRemovedMinIndex:function(t){let e=0;const i=t[t.length-1];if(this.isInvisible(i))return e;e=i.tg_view_index,e>0&&(e-=1);let o=i.tg_parent;for(;o;)o.collapsed&&(e=o.tg_view_index),o=o.tg_parent;return e},removeRowsHandler:function(t){const e=[].concat(t);e.sort((function(t,e){return e.tg_index-t.tg_index}));const i=[];return e.forEach((t=>{this.getRowParentSubs(t).splice(t.tg_sub_index,1),i.push(t)})),i}},Tt={renderCollapseAllState:function(){this.hasTreeColumn&&(this.asyncRenderCollapseAllState||(this.asyncRenderCollapseAllState=d.microtask(this.renderCollapseAllStateSync)),this.asyncRenderCollapseAllState.apply(this,arguments))},renderCollapseAllStateSync:function(){const t=this.$header.find(".tg-tree-header");this.rowsInfo.isTree?t.addClass("tg-tree-header-indent"):t.removeClass("tg-tree-header-indent"),this.renderCollapseAllIcon()},checkCollapseAllState:function(t){if(t!==this.allRowsCollapsed){if(t){let t=0;const e=this.rows.length;for(;t{if(e.tg_group&&e.tg_subs_length&&e.collapsed)return t=!0,!1})),t)return}this.allRowsCollapsed=t,this.renderCollapseAllIcon()}},expandAllRows:function(){return this.renderAllRowsCollapsed(!1)},collapseAllRows:function(){return this.renderAllRowsCollapsed(!0)},toggleAllRows:function(){return this.allRowsCollapsed?this.expandAllRows():this.collapseAllRows()},renderAllRowsCollapsed:function(t){const e=this.updateAllRowsCollapsed(t);return e.length?(this.flushBody(),this.onNextUpdated((()=>{this.renderCollapseAllIcon(),t?this.trigger(C.onRowCollapsed,e):this.trigger(C.onRowExpanded,e)})),this.render("rows"),this):this},updateAllRowsCollapsed:function(t){this.allRowsCollapsed=t;const e=[];return this.forEachRow((i=>{i.subs&&i.tg_subs_length&&this.isCollapsedChanged(i,t)&&(i.collapsed=t,e.push(i))})),e},expandRow:function(t){const e=this.getRowItem(t);return e?this.isEmptyGroup(e)?(this.trigger(C.onRowSubsRequest,e),this):this.isCollapsedChanged(e,!1)?(e.collapsed=!1,this.flushRowFrom(e.tg_view_index),this.renderCollapseIcon(e),this.onNextUpdated((()=>{this.checkCollapseAllState(!1),this.trigger(C.onRowExpanded,e)})),this.render("rows"),this):this:this},collapseRow:function(t){const e=this.getRowItem(t);return e&&e.subs&&e.tg_subs_length&&this.isCollapsedChanged(e,!0)?(e.collapsed=!0,this.flushRowFrom(e.tg_view_index),this.renderCollapseIcon(e),this.onNextUpdated((()=>{this.checkCollapseAllState(!0),this.trigger(C.onRowCollapsed,e)})),this.render("rows"),this):this},toggleRow:function(t){const e=this.getRowItem(t);return e?(e.collapsed?this.expandRow(e):this.collapseRow(e),this):this},expandRowLevel:function(t){t=d.toNum(t,!0);const e=[],i=[];return this.forEachRow((o=>{o.subs&&o.tg_subs_length&&(o.tg_level<=t?this.isCollapsedChanged(o,!1)&&(o.collapsed=!1,i.push(o)):this.isCollapsedChanged(o,!0)&&(o.collapsed=!0,e.push(o)))})),e.length||i.length?(this.flushBody(),this.onNextUpdated((()=>{e.length&&this.trigger(C.onRowCollapsed,e),i.length&&this.trigger(C.onRowExpanded,i)})),this.render("rows"),this):this},renderCollapseAllIcon:function(){if(!this.options.collapseAllVisible||!this.hasTreeColumn)return;const t=this.$header.find(".tg-tree-icon-all");this.renderTreeIcon(t,this.allRowsCollapsed)},renderCollapseIcon:function(t){if(!this.headerCreated)return;const e=this.getRowNodesByIndex(t.tg_view_index);if(!e)return;const i=e.find(".tg-tree-icon");this.renderTreeIcon(i,t.collapsed)},renderTreeIcon:function(t,e){t&&(e?t.removeClass("tg-tree-icon-expanded").addClass("tg-tree-icon-collapsed"):t.removeClass("tg-tree-icon-collapsed").addClass("tg-tree-icon-expanded"))}},Lt={rowDragStartHandler:function(t,e){this.removeSortColumn();const i=e.rowItem;if(!i)return;const o=this.getRowNodesByIndex(i.tg_view_index);o&&(e.dragCloneNodes=this.getRowDragCloneNodes(o),e.dropPlaceholder=this.getRowDropPlaceholder(o),e.dragStartTop=this.getRowTop(i),e.dragRowHeight=this.getRowHeight(i),e.dragStartScrollTop=this.scrollTop,e.dragMaxScrollTop=this.scrollPane.getMaxScrollTop(),this.trigger(C.onRowDragged,{e:t,rowItem:i}),this.isDefaultPrevented(t)||("touch"===e.type&&d.preventDefault(e.e),this.setRowState(i,"dragging"),this.rowDropListHandler(e),this.updateDragCloneRowPosition(e)))},rowDragMoveHandler:function(t,e){"touch"===e.type&&d.preventDefault(e.e),this.updateDragCloneRowPosition(e),this.updateDragPlaceholderPosition(e),this.rowDragAutoScrollHandler(e)},rowDragEndHandler:function(t,e){"touch"===e.type&&(this.protectedItem=null,d.preventDefault(e.e)),this.autoScrollStop(),this.setRowState(e.rowItem,"dragging",!1),e.dragCloneNodes&&(e.dragCloneNodes.remove(),e.dragCloneNodes=null),e.dropPlaceholder&&(e.dropPlaceholder.remove(),e.dropPlaceholder=null),e.changed&&this.rowDropHandler(e)},updateDragCloneRowPosition:function(t){const e=this.scrollTop-t.dragStartScrollTop,i=t.dragStartTop+t.offsetY+e,o=i-this.scrollTopOffset;t.dragCloneNodes&&t.dragCloneNodes.css("top",o).show(),t.dragCurrentPosition=i+.5*t.dragRowHeight},getRowDragCloneNodes:function(t){const e=w();return t.each((function(t){const i=w(t),o=i.clone();o.appendTo(i.parent()),e.add(o)})),e.addClass("tg-clone").hide(),e},getRowDropPlaceholder:function(t){const e=w();return t.each((function(t){const i=w(t),o=w("
    ").addClass("tg-row-placeholder").hide(),n=i.parent();n.find(".tg-row-placeholder").remove(),o.appendTo(n),e.add(o)})),e},updateDragPlaceholderPosition:function(t){this.rowDropItemHandler(t);const e=t.dropItem;if(!e)return;let i=t.dropPosition-1;t.dropBottom?e.tg_view_last&&(i=t.dropPosition-2):e.tg_view_index-this.frozenInfo.rows==0&&(i=t.dropPosition);const o=i-this.scrollTopOffset;t.dropPlaceholder&&t.dropPlaceholder.css("top",o).show()},rowDragAutoScrollHandler:function(t){const e=t.dragCurrentPosition,i=this.scrollTop,o=this.bodyHeight-this.frozenRowsHeight,n=i+o,s=this.options.rowHeight,r=Math.min(3*s,.5*o);if(!(rn-r){const i=e-(n-r),o=this.getAutoScrollOffset(i,r);this.autoScrollStart(o,t)}else this.autoScrollStop()},getAutoScrollOffset:function(t,e){return Math.floor(t/e*20)},autoScrollStop:function(){this.autoScrollMotion&&(this.autoScrollMotion.destroy(),this.autoScrollMotion=null)},autoScrollStart:function(t,e){this.autoScrollStop();const i=e.dragMaxScrollTop;this.autoScrollMotion=new D,this.autoScrollMotion.bind(D.EVENT.MOTION_MOVE,(()=>{const o=d.clamp(this.scrollTop+t,0,i);o!==this.scrollTop?(this.setScrollTop(o),this.updateDragCloneRowPosition(e),this.updateDragPlaceholderPosition(e)):this.autoScrollStop()})),this.autoScrollMotion.once(D.EVENT.MOTION_END,(()=>{this.autoScrollStart(t,e)})),this.autoScrollMotion.start({duration:200})},rowDropListHandler:function(t){const e=this.getRowDropList(t);if(!d.isList(e))return;const i=t.rowItem,o=e.filter((t=>{if(t===i)return!1;if(t.tg_frozen)return!1;let e=t.tg_parent;for(;e;){if(e===i)return!1;e=e.tg_parent}return!0}));if(!d.isList(o))return;const n=[];o.forEach((t=>{const e=this.getRowTop(t),i=this.getRowHeight(t);n.push({rowItem:t,position:e}),n.push({rowItem:t,position:e+i-1,dropBottom:!0})})),t.dropList=n},getRowDropList:function(t){const e=this.options.rowDragCrossLevel;return e?"function"==typeof e?e.call(this,t):this.viewRows:this.getRowParentSubs(t.rowItem)},rowDropItemHandler:function(t){const e=t.dropList;if(!e)return;const i=t.dragCurrentPosition;let o=Number.MAX_VALUE;for(let n=0,s=e.length;no)break;o=r,t.dropItem=s.rowItem,t.dropBottom=s.dropBottom,t.dropPosition=s.position}},rowDragDropPositionHandler:function(t,e,i){const o=this.getRowParentSubs(t),n=t.tg_sub_index;let s,r;return this.isDropIntoGroupFirstChild(e,i)?(s=e.subs,r=0):(s=this.getRowParentSubs(e),r=e.tg_sub_index,o===s&&n{this.trigger(C.onRowDropped,n)})),this.render({type:"rows",scrollRow:i})}},It={getMoveFocusRow:function(t,e){let i=t[0];return e>0&&(i=t[t.length-1]),i},getMoveLengthInList:function(t,e){let i=0;return t.forEach((t=>{this.getRowParentSubs(t)===e&&(i+=1)})),i},getMoveInfo:function(t,e,i){const o=this.getRowParentSubs(i);let n=i.tg_sub_index+e;const s=i.tg_parent;if(s&&this.options.rowMoveCrossLevel){const e=0,i=s.tg_subs_length-1;if(ni){const e=n-i;return this.getMoveInfo(t,e,s)}}if(e>0){n-=this.getMoveLengthInList(t,o)-1}return n=d.clamp(n,0,o.length),{list:o,index:n}},moveRowsHandler:function(t,e){(t=this.removeRowsHandler(t)).reverse();const i=this.getMoveFocusRow(t,e),o=this.getMoveInfo(t,e,i),n=[o.index,0].concat(t);return o.list.splice.apply(o.list,n),this.initRowsHandler(),this.onNextUpdated((function(){this.scrollRowIntoView(i),this.trigger(C.onRowMoved,t)})),this.removeSortColumn(),this.update(),!0},moveRows:function(t,e){t=d.toList(t);const i=[];return t.forEach((t=>{const e=this.getRowItem(t);e&&i.push(e)})),!!i.length&&(!(i.length>=this.getRowsLength())&&(0!==(e=d.toNum(e,!0))&&this.moveRowsHandler(i,e)))},moveRowsUp:function(t){return this.moveRows(t,-1)},moveRowsDown:function(t){return this.moveRows(t,1)},moveRowsToTop:function(t){return this.moveRows(t,-this.getRowsLength(!0))},moveRowsToBottom:function(t){return this.moveRows(t,this.getRowsLength(!0))},moveSelectedRowsUp:function(){return this.moveRows(this.getSelectedRows(),-1)},moveSelectedRowsDown:function(){return this.moveRows(this.getSelectedRows(),1)},moveSelectedRowsToTop:function(){return this.moveRows(this.getSelectedRows(),-this.getRowsLength(!0))},moveSelectedRowsToBottom:function(){return this.moveRows(this.getSelectedRows(),this.getRowsLength(!0))}},Et={getSelectedRow:function(){let t=null;return this.forEachSelectableRow((function(e){if(e.selected)return t=e,!1})),t},getSelectedRows:function(){const t=[];return this.forEachSelectableRow((function(e){e.selected&&t.push(e)})),t.length>1&&t.sort((function(t,e){const i=t.tg_selected_index,o=e.tg_selected_index;return i>o?1:i0&&void 0!==arguments[0])||arguments[0];if(t=Boolean(t),this.globalSelectedIndex=0,t&&!this.options.selectMultiple)return this;const e=this.getAllSelectedChangedList(t);return e.length?(this.updateRowsSelectedState(e),this):this},setRowSelected:function(){return(this.options.selectMultiple?this.setRowMultipleSelected:this.setRowSingleSelected).apply(this,arguments)},setRowSingleSelected:function(t){const e=this.getRowItem(t);if(!e)return this;if(!this.isRowSelectable(e))return this;if(e.selected)return this;const i=[],o=this.getSelectedRow();return o&&o.selected&&i.push(o),e.selected||i.push(e),i.length?(this.updateRowsSelectedState(i),this):this},setRowMultipleSelected:function(t,e){if(0===arguments.length)return this;if(1===arguments.length&&!1===arguments[0])return this.selectAll(!1);const i=this.toRowItemList(t,(t=>this.isRowSelectable(t)));return i.length?!1===e?(this.setRowListUnselected(i),this):d.hasShiftKey(e)&&1===i.length?(this.setRowBetweenListSelected(i[0]),this):(this.updateRowsSelectedState(i),this):this},setRowListUnselected:function(t){const e=this.getSelectedChangedList(t,!1);e.length&&this.updateRowsSelectedState(e)},setRowBetweenListSelected:function(t){const e=this.previousSelectedRow;if(e&&e!==t){const i=this.getBetweenSelectedChangedList(e,t);if(!i.length)return;this.updateRowsSelectedState(i,!0)}else this.updateRowsSelectedState([t])},getAllSelectedChangedList:function(t){const e=[];return this.forEachSelectableRow((i=>{this.isSelectedChanged(i,t)&&e.push(i)})),e},getSelectedChangedList:function(t,e){const i=[];return t.forEach((t=>{this.isSelectedChanged(t,e)&&i.push(t)})),i},getBetweenSelectedChangedList:function(t,e){const i=t.tg_index,o=e.tg_index,n=[];if(i=o;)n.push(t),t--}return this.toRowItemList(n,(t=>this.isRowSelectable(t)&&!t.selected))},updateRowsSelectedState:function(t,e){let i;t.forEach((t=>{const e=!t.selected;t.selected=e,e&&(t.tg_selected_index=this.globalSelectedIndex++,i=t),this.renderRowSelectedState(t)})),e||(this.previousSelectedRow=i),this.renderSelectAllState(),this.onNextUpdated((()=>{this.trigger(C.onSelectChanged,t)})),this.render()},renderRowSelectedState:function(t){const e=t.tg_view_index;this.viewport.rows.includes(e)&&(this.renderRowState(t,"selected"),this.flushCell(e,this.selectColumn.tg_view_index))},renderSelectAllState:function(){this.isSelectAllVisible()&&(this.asyncRenderSelectAllState||(this.asyncRenderSelectAllState=d.microtask(this.renderSelectAllStateSync)),this.asyncRenderSelectAllState.apply(this,arguments))},renderSelectAllStateSync:function(){const t=this.getSelectAllState();if(t===this.previousSelectAllState)return;this.previousSelectAllState=t;const e=this.selectColumn,i=w(this.getColumnHeaderNode(e)).find(".tg-select-icon-all");i.length&&(i.removeClass("tg-selected tg-mixed"),t&&i.addClass(`tg-${t}`))},getSelectAllState:function(){let t=0;this.forEachSelectableRow((e=>{t+=1}));const e=this.getSelectedRows().length;let i="mixed";return 0===e?(i="",this.previousSelectedRow=null):e===t&&(i="selected"),i},isSelectAllVisible:function(){const t=this.options;return!!(t.selectVisible&&t.selectAllVisible&&t.selectMultiple)}},xt={setRowHover:function(t,e){const i=this.getRowItem(t);return i?(this.renderRowHover(i,e),this):this},renderRowHover:function(t,e){if(this.previousHover&&(this.previousHover.removeClass("tg-hover"),this.previousHover=null),!e)return this;if(t.tg_frozen&&!this.options.frozenRowHoverable)return this;const i=t.tg_view_index;return this.previousHover=this.$body.find(`.tg-row[row='${i}']`).addClass("tg-hover"),this},setRowState:function(t,e){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const o=this.getRowItem(t);return o?(o.tg_state_names||(o.tg_state_names=new Set),o.tg_state_names.add(e),o[e]=i,this.renderRowState(o,e),this):this},renderRowState:function(t,e){const i=this.getRowNodesByIndex(t.tg_view_index);if(i){const o=`tg-${e}`;t[e]?i.addClass(o):i.removeClass(o)}}},zt={getRowItem:function(t){return d.isNum(t)?(t<0&&(t=this.rowsInfo.length+t),this.rowsInfo.indexCache[t]):t?d.isNum(t.tg_index)?t:this.getRowItemById(t.id||t):void 0},getRowItemById:function(t){return this.getRowItemBy("id",t)},getRowItemBy:function(t,e){if(void 0!==e)return this.rowsInfo.indexCache.find((i=>i[t]===e))},getRowsLength:function(t){return t?this.rowsInfo.length:this.viewRows.length},getViewRowItem:function(t){return this.viewRows[t]},getPreRenderRowInfo:function(t){const e={rows:[],rowNotFound:!1,benchmark:0};if(!t.length)return 0===this.getRowsLength()&&(e.rowNotFound=!0),e;const i=[],o=this.frozenInfo.row;return t.forEach((t=>{this.getRowCache(t)?t>o&&i.push(t):e.rows.push(t)})),i.length&&(e.benchmark=Math.min.apply(Math,i)),e.rows.sort((function(t,i){return t{this.renderRowNodes(t,e.benchmark)}))},createRowNode:function(t,e,i,o,n,s){const r=document.createElement("div");return r.setAttribute("row",t),r.className=i,o&&(r.style.cssText=o),r.style.top=`${n}px`,s!==this.options.rowHeight&&(r.style.height=`${s}px`,r.style.lineHeight=`${s}px`),this.setNodeDataCache(r,{row:t,rowItem:e,rowNode:r}),r},appendRowNode:function(t,e,i,o){ithis.frozenInfo.row))return e;e-=this.frozenRowsHeight}return e-=this.scrollTopOffset,e},getRowTop:function(t){let e=t.tg_top;return t.tg_frozen||(e-=this.frozenRowsHeight),e},getRowVPos:function(t){const e=this.frozenInfo.bottom,i=this.frozenInfo.row;let o="top";return this.frozenInfo.rows&&(t<=i?e&&(o="bottom"):e||(o="bottom")),o},getRowCanvas:function(t,e){return"top"===t?"left"===e?this.$bodyTL:this.$bodyTR:"left"===e?this.$bodyBL:this.$bodyBR}},Mt={CHANGE:"change"},Pt={h:{type:"h",className:"tg-scrollbar-h",offset:"left",size:"width",page:"pageX",axis:"x",offsetName:"offsetX"},v:{type:"v",className:"tg-scrollbar-v",offset:"top",size:"height",page:"pageY",axis:"y",offsetName:"offsetY"}};class _t extends k{static EVENT=Mt;static H="h";static V="v";type="h";settings={};size=0;viewSize=0;bodySize=0;trackSize=0;position=0;scale=0;thumbPosition=0;thumbScale=0;constructor(t,e){super(),this.settings=Pt[t]||Pt.h,this.type=this.settings.type,this.id=d.uid(4,`tg-scrollbar-${this.type}-`),this.$holder=w(e),this.$holder.find(`.${this.settings.className}`).remove(),this.options=this.generateOptions()}generateOptions(t){return d.merge({size:15,round:!1,blank:!1,motionDuration:200},t)}updateOptions(t){this.options=this.generateOptions(t);let e=this.options.size;d.isNum(e)||(e=d.toNum(e)),e=Math.round(e),e=Math.max(e,0),e=Math.min(e,30),this.size=e}create(){this.$container=w('
    ').appendTo(this.$holder),this.$container.attr("id",this.id),this.$container.addClass(d.classMap(["tg-scrollbar",this.settings.className,{"tg-scrollbar-round":this.options.round}])),this.$track=this.$container.find(".tg-scrollbar-track"),this.$thumb=this.$container.find(".tg-scrollbar-thumb"),this.thumbDrag=new O,this.thumbDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.thumbDragStart(e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.thumbDragMove(e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.thumbDragEnd(e)}));const t=this.$container.get(0);return this.scrollEvents={mousedown:{handler:e=>{e.target.classList.contains("tg-scrollbar-thumb")?this.thumbMouseDownHandler(e):(this.trackEvents={mouseup:{handler:t=>{this.trackMouseupHandler(t)},options:{once:!0}}},d.bindEvents(this.trackEvents,t),this.trackMousedownHandler(e))},options:!0},selectstart:{handler:t=>{d.preventDefault(t)},options:!0}},d.bindEvents(this.scrollEvents,t),this}getBlank(){return this.options.blank}getSize(){return this.size}getViewSize(){return this.viewSize}getBodySize(){return this.bodySize}getTrackMouseDirection(){let t=1;return this.trackMousePosition0){const i=this.getMaxThumbPosition();t=Math.round(i*this.position/e),t=d.clamp(t,0,i)}return this.setThumbPosition(t),this}trackMousedownHandler(t){return this.motionStop(),this.trackMousePosition=this.getTrackMousePos(t),this.motionStart(),this}trackMouseupHandler(t){return d.unbindEvents(this.trackEvents),this.motionStop(),this.motionStarted||(this.trackMousePosition=this.getTrackMousePos(t),this.trackScrollHandler(),this.triggerEvent()),this}trackScrollHandler(){const t=Math.max(0,this.viewSize-20)*this.getTrackMouseDirection();return this.setOffset(t),this}motionStop(){return this.motion&&(this.motion.destroy(),this.motion=null),this}motionStart(){const t=this.position,e=Math.round(this.trackMousePosition/this.viewSize*this.getMaxPosition());return this.motionStarted=!1,this.motion=new D,this.motion.bind(D.EVENT.MOTION_START,((t,e)=>{this.motionStarted=!0})),this.motion.bind(D.EVENT.MOTION_MOVE,((t,e)=>{this.motionUpdateHandler(t,e)})),this.motion.start({duration:this.options.motionDuration,from:t,till:e}),this}motionUpdateHandler(t,e){e!==this.position&&(this.setPosition(e),this.triggerEvent())}thumbMouseDownHandler(t){this.$thumb.addClass("tg-scrollbar-thumb-hold"),this.thumbDrag.start(t,{target:this.$thumb})}thumbDragStart(t){this.motionStop(),t.thumbPositionStart=this.thumbPosition}thumbDragMove(t){let e=t.thumbPositionStart+t[this.settings.offsetName];const i=this.getMaxThumbPosition();e=d.clamp(e,0,i),this.setThumbPosition(e);let o=0;i>0&&(o=d.per(e/i)*this.getMaxPosition(),o=Math.round(o)),this.position=o,this.triggerEvent()}thumbDragEnd(t){this.$thumb&&this.$thumb.removeClass("tg-scrollbar-thumb-hold")}triggerEvent(){this.trigger(Mt.CHANGE,this.position)}getPosition(){return this.position}setPosition(t){t=d.toNum(t,!0);const e=this.getMaxPosition();t=d.clamp(t,0,e),this.position=t,this.updateThumbPosition()}getMaxPosition(){return this.bodySize-this.viewSize}updatePosition(){const t=this.getMaxPosition(),e=d.clamp(this.position,0,t);this.position=e}setOffset(t){t=d.toNum(t);const e=this.position+t;return this.setPosition(e),this}getScale(){return this.scale}setScale(t){return t=d.per(t),this.scale=t,this.scaleChangeHandler(),this}scaleChangeHandler(){let t=Math.round(this.viewSize*this.scale);if(t=Math.max(t,Math.round(1.5*this.options.size)),t=Math.min(t,this.viewSize-1),this.thumbSize=t,this.$thumb){const t={};"h"===this.type?(t.height=this.size,t.width=this.thumbSize):(t.width=this.size,t.height=this.thumbSize),this.$thumb.css(t)}}updateTrackSize(){const t={};return"h"===this.type?(t.width=this.trackSize,t.height=this.size):(t.height=this.trackSize,t.width=this.size),this.$container.css(t),this}updateThumbSize(){let t=0;return this.bodySize&&(t=this.trackSize/this.bodySize),this.setScale(t),this}parseSize(t){return t=d.toNum(t),t=Math.round(t),t=Math.max(t,0)}updateSize(t,e,i){t=this.parseSize(t),this.viewSize=t,e=this.parseSize(e),this.bodySize=e,i=d.isNum(i)?this.parseSize(i):t,this.trackSize=i,this.previousFadeIn=null}fade(t){return!(!this.$container||!this.size)&&(this.previousFadeIn!==t&&(this.previousFadeIn=t,t?this.$container.hasClass("tg-fade-out")&&this.$container.removeClass("tg-fade-out").addClass("tg-fade-in"):this.$container.removeClass("tg-fade-in").addClass("tg-fade-out"),!0))}show(){if(this.updatePosition(),!this.getBlank())return!this.$container&&this.size>0&&this.create(),this.$container?(this.updateTrackSize(),this.updateThumbSize(),this):this;this.remove()}hide(){return this.updatePosition(),this.remove(),this}remove(){if(this.motionStop(),d.unbindEvents(this.scrollEvents),d.unbindEvents(this.trackEvents),this.thumbDrag&&(this.thumbDrag.destroy(),this.thumbDrag=null),!this.$container)return this;this.$thumb=null,this.$track=null,this.$container.remove(),this.$container=null}destroy(){return this.remove(),this}}const Nt={CHANGE:"change"};class kt extends k{static EVENT=Nt;visible=!0;constructor(t,e){super(),this.id=d.uid(4,`tg-scroll-pane-${e}-`),this.gradientInfo=[],this.$container=w(t).attr("id",this.id),this.$container.addClass("tg-scroll-pane"),this.$scrollView=this.$container.find(".tg-scroll-view"),this.$scrollBody=this.$scrollView.find(".tg-scroll-body"),this.scrollbarH=new _t(_t.H,this.$container),this.scrollbarH.bind(_t.EVENT.CHANGE,((t,e)=>{this.scrollHChangeHandler()})),this.scrollbarV=new _t(_t.V,this.$container),this.scrollbarV.bind(_t.EVENT.CHANGE,((t,e)=>{this.scrollVChangeHandler()})),this.options=this.generateOptions()}generateOptions(t){return d.merge({scrollbarH:{},scrollbarV:{},scrollbarFade:!1,scrollSizeOnKeyPress:20,gradient:30},t)}show(){return this.$container.show(),this.visible=!0,this}hide(){return this.$container.hide(),this.visible=!1,this}width(){return this.scrollPaneW}height(){return this.scrollPaneH}render(t){return this.visible?(this.options=this.generateOptions(t),this.update(),this):this}update(){this.scrollPaneW=this.options.scrollPaneW,this.scrollPaneH=this.options.scrollPaneH,this.scrollBodyW=this.options.scrollBodyW,this.scrollBodyH=this.options.scrollBodyH,this.updateScrollbar()}setGroupH(t){this.groupH=d.toList(t)}setGroupV(t){this.groupV=d.toList(t)}updateGroupH(){if(!d.isList(this.groupH))return this;const t=this.scrollbarH.getPosition();return this.groupH.forEach((function(e){e&&e.updateScrollHFromGroup(t)})),this}updateGroupV(){if(!d.isList(this.groupV))return this;const t=this.scrollbarV.getPosition();return this.groupV.forEach((function(e){e&&e.updateScrollVFromGroup(t)})),this}updateGroupList(){this.updateGroupH(),this.updateGroupV()}updateScrollHFromGroup(t){this.scrollbarH.getPosition()!==t&&(this.scrollbarH.setPosition(t),this.updateScrollLeft(),this.triggerEvent())}updateScrollVFromGroup(t){this.scrollbarV.getPosition()!==t&&(this.scrollbarV.setPosition(t),this.updateScrollTop(),this.triggerEvent())}setPosition(t,e){return this.scrollbarH.setPosition(t),this.scrollbarV.setPosition(e),this.updateScrollLeft(),this.updateScrollTop(),this.updateGroupList(),this}updateScrollbar(){this.scrollbarH.updateOptions(this.options.scrollbarH),this.scrollbarV.updateOptions(this.options.scrollbarV),this.updateScrollState(),this.updateScrollView(),this.updateScrollTrack(),this.scrollbarH.updateSize(this.scrollViewW,this.scrollBodyW,this.scrollTrackW),this.scrollbarV.updateSize(this.scrollViewH,this.scrollBodyH,this.scrollTrackH),this.hasScrollH?(this.scrollbarH.show(),this.scrollbarH.setPosition(this.scrollbarH.getPosition())):this.scrollbarH.hide(),this.hasScrollV?(this.scrollbarV.show(),this.scrollbarV.setPosition(this.scrollbarV.getPosition())):this.scrollbarV.hide(),this.updateScrollLeft(),this.updateScrollTop(),this.updateGroupList()}updateScrollState(){const t=this.scrollbarH.getSize(),e=this.scrollbarV.getSize(),i=this.scrollbarH.getBlank(),o=this.scrollbarV.getBlank(),n=this.options.scrollbarFade;let s=!1,r=0;(function(){(this.scrollPaneWe&&t.push("left"),ie&&t.push("top"),o{const i=`tg-gradient-${e}`;t.includes(e)?this.$container.addClass(i):this.$container.removeClass(i)})))}getScrollLeft(){return this.scrollbarH.getPosition()}getScrollTop(){return this.scrollbarV.getPosition()}getMaxScrollLeft(){return this.scrollbarH.getMaxPosition()}getMaxScrollTop(){return this.scrollbarV.getMaxPosition()}getScrollTopOffset(){const t=this.getScrollTop();return t-t%1e4}triggerEvent(){this.trigger(Nt.CHANGE,{scrollLeft:this.getScrollLeft(),scrollTop:this.getScrollTop()})}scrollHChangeHandler(){this.updateScrollLeft(),this.updateGroupList(),this.triggerEvent()}scrollVChangeHandler(){this.updateScrollTop(),this.updateGroupList(),this.triggerEvent()}setOffsetH(t){const e=this.getScrollLeft();this.scrollbarH.setOffset(t);return this.getScrollLeft()!==e&&(this.updateScrollLeft(),this.updateGroupList(),this.triggerEvent(),!0)}setOffsetV(t){const e=this.getScrollTop();this.scrollbarV.setOffset(t);return this.getScrollTop()!==e&&(this.updateScrollTop(),this.updateGroupList(),this.triggerEvent(),!0)}mouseWheelHandler(t){const e=t.deltaX,i=t.deltaY,o=Math.abs(e);if(o>Math.abs(i)){if(this.hasScrollH)return this.setOffsetH(e)}else{if(this.hasScrollV)return this.setOffsetV(i);if(this.hasScrollH&&!o)return this.setOffsetH(i)}return!1}keyPageUpHandler(t){return this.setOffsetV(-this.scrollViewH)}keyPageDownHandler(t){return this.setOffsetV(this.scrollViewH)}keyEndHandler(t){return this.setOffsetV(this.scrollBodyH)}keyHomeHandler(t){return this.setOffsetV(-this.scrollBodyH)}keyLeftHandler(t){return this.setOffsetH(-this.options.scrollSizeOnKeyPress)}keyUpHandler(t){return this.setOffsetV(-this.options.scrollSizeOnKeyPress)}keyRightHandler(t){return this.setOffsetH(this.options.scrollSizeOnKeyPress)}keyDownHandler(t){return this.setOffsetV(this.options.scrollSizeOnKeyPress)}destroy(){return this.visible=!1,this.groupH=null,this.groupV=null,this.scrollbarV&&(this.scrollbarV.destroy(),this.scrollbarV=null),this.scrollbarH&&(this.scrollbarH.destroy(),this.scrollbarH=null),this.$container=null,this.$scrollView=null,this.$scrollBody=null,this}}const Vt={initScrollPane:function(){this.initFrozenStyle(),this.createScrollPane()},initFrozenStyle:function(){const t={HL:{container:this.$paneHL,cls:[]},HR:{container:this.$paneHR,cls:[]},TL:{container:this.$paneTL,cls:[]},TR:{container:this.$paneTR,cls:[]},BL:{container:this.$paneBL,cls:[]},BR:{container:this.$paneBR,cls:[]}},e="tg-frozen-h";this.frozenInfo.rows&&(this.frozenInfo.bottom?(t.BL.cls.push(e),t.BR.cls.push(e)):(t.TL.cls.push(e),t.TR.cls.push(e)));const i="tg-frozen-v",o="tg-frozen-line-v";this.frozenInfo.columns&&(this.frozenInfo.right?(t.HR.cls.push(i),t.TR.cls.push(i),t.BR.cls.push(i)):(t.HL.cls.push(i),t.TL.cls.push(i),t.BL.cls.push(i)),t.HL.cls.push(o),t.TL.cls.push(o),t.BL.cls.push(o));const n="tg-frozen",s=[n,e,i,o].join(" ");Object.keys(t).forEach((function(e){const i=t[e],o=i.container;o.removeClass(s);const r=i.cls;if(!r.length)return;const l=[n].concat(r).join(" ");o.addClass(l)}))},createScrollPane:function(){this.removeScrollPane(),this.scrollPaneMap={HL:new kt(this.$paneHL,"header-left"),HR:new kt(this.$paneHR,"header-right"),TL:new kt(this.$paneTL,"top-left"),TR:new kt(this.$paneTR,"top-right"),BL:new kt(this.$paneBL,"bottom-left"),BR:new kt(this.$paneBR,"bottom-right")},this.scrollPaneMap.BR.setGroupH([this.scrollPaneMap.HR,this.scrollPaneMap.TR]),this.scrollPaneMap.TR.setGroupH([this.scrollPaneMap.HR,this.scrollPaneMap.BR]),this.scrollPaneMap.BL.setGroupH([this.scrollPaneMap.HL,this.scrollPaneMap.TL]),this.scrollPaneMap.TL.setGroupH([this.scrollPaneMap.HL,this.scrollPaneMap.BL]),this.scrollPaneMap.BR.setGroupV(this.scrollPaneMap.BL),this.scrollPaneMap.BL.setGroupV(this.scrollPaneMap.BR),this.scrollPaneMap.TR.setGroupV(this.scrollPaneMap.TL),this.scrollPaneMap.TL.setGroupV(this.scrollPaneMap.TR),this.initActiveScrollPane(),this.initPaneVisibility()},initActiveScrollPane:function(){const t=this.getScrollPaneVP(),e=this.getScrollPaneHP(),i=`${t}${e}`;this.scrollPane=this.scrollPaneMap[i],this.scrollPane.bind(kt.EVENT.CHANGE,((t,e)=>{this.scrollPaneChangeHandler(t,e)}));let o={L:"L",R:"L"};this.frozenInfo.columns&&this.frozenInfo.right&&(o={L:"R",R:"L"});const n=`${t}${o[e]}`;this.scrollPaneFrozen=this.scrollPaneMap[n]},getScrollPaneVP:function(){return this.frozenInfo.rows&&!this.frozenInfo.bottom?"B":"T"},getScrollPaneHP:function(){return this.frozenInfo.columns&&!this.frozenInfo.right?"R":"L"},initPaneVisibility:function(){this.scrollPaneMap.HL.show(),this.scrollPaneMap.TL.show(),this.frozenInfo.columns?(this.scrollPaneMap.HR.show(),this.scrollPaneMap.TR.show(),this.frozenInfo.rows?(this.scrollPaneMap.BL.show(),this.scrollPaneMap.BR.show()):(this.scrollPaneMap.BL.hide(),this.scrollPaneMap.BR.hide())):(this.scrollPaneMap.HR.hide(),this.scrollPaneMap.TR.hide(),this.scrollPaneMap.BR.hide(),this.frozenInfo.rows?this.scrollPaneMap.BL.show():this.scrollPaneMap.BL.hide())},scrollPaneChangeHandler:function(t,e){this.hideColumnLine(),this.scrollLeft=e.scrollLeft,this.scrollTop=e.scrollTop,this.scrollRenderHandler()},scrollbarFadeInOutHandler:function(t,e){this.options.scrollbarFade&&(e?this.updateScrollPaneFade(!0):this.options.scrollbarFadeTimeout||this.updateScrollPaneFade(!1))},updateScrollPaneFade:function(t){if(!this.options.scrollbarFade)return;this.updateScrollPaneFadeSync(t);const e=this.options.scrollbarFadeTimeout;e&&(clearTimeout(this.timeout_fade),this.timeout_fade=setTimeout((()=>{this.updateScrollPaneFadeSync(!1)}),e))},updateScrollPaneFadeSync:function(t){if(this.previousScrollbarFadeIn===t)return;this.previousScrollbarFadeIn=t;const e=[];Object.keys(this.scrollPaneMap).forEach((t=>{const i=this.scrollPaneMap[t];i.hasScrollbar()&&e.push(i)})),e.length&&e.forEach((function(e){e.fade(t)}))},updateScrollPane:function(){const t=this.getScrollbarOptions();this.scrollPaneMap.HL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.headerHeight,scrollBodyW:this.bodyWidthL,scrollBodyH:this.headerHeight,scrollbarV:t.HLV,scrollbarH:t.HLH})),this.scrollPaneMap.HR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.headerHeight,scrollBodyW:this.bodyWidthR,scrollBodyH:this.headerHeight,scrollbarV:t.HRV,scrollbarH:t.HRH})),this.scrollPaneMap.TL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.paneHeightT,scrollBodyW:this.bodyWidthL,scrollBodyH:this.bodyHeightT,scrollbarV:t.TLV,scrollbarH:t.TLH})),this.scrollPaneMap.TR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.paneHeightT,scrollBodyW:this.bodyWidthR,scrollBodyH:this.bodyHeightT,scrollbarV:t.TRV,scrollbarH:t.TRH})),this.scrollPaneMap.BL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.paneHeightB,scrollBodyW:this.bodyWidthL,scrollBodyH:this.bodyHeightB,scrollbarV:t.BLV,scrollbarH:t.BLH})),this.scrollPaneMap.BR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.paneHeightB,scrollBodyW:this.bodyWidthR,scrollBodyH:this.bodyHeightB,scrollbarV:t.BRV,scrollbarH:t.BRH})),this.scrollLeft=this.getScrollLeft(),this.scrollTop=this.getScrollTop(),this.updateScrollPaneFade(Boolean(this.options.scrollbarFadeTimeout))},getScrollPaneOptions:function(t){const e=this.options;return t.scrollbarFade=e.scrollbarFade,t.gradient=d.clamp(d.toNum(e.scrollPaneGradient,!0),0,100),t},getScrollbarOptions:function(){const t=this.options.scrollbarRound,e={};return["HLH","HLV","HRH","HRV","TLH","TLV","TRH","TRV","BLH","BLV","BRH","BRV"].forEach((function(i){e[i]={size:0,round:t,blank:!1}})),this.scrollbarOptionsHandler(e),this.scrollbarFadeHandler(e),e},scrollbarOptionsHandler:function(t){const e=this.scrollbarSizeH,i=this.scrollbarSizeV;this.scrollbarHeaderHandler(t,e,i),this.frozenInfo.columns?this.frozenInfo.rows?this.scrollbarC1R1Handler(t,e,i):this.scrollbarC1R0Handler(t,e,i):this.frozenInfo.rows?this.scrollbarC0R1Handler(t,e,i):this.scrollbarC0R0Handler(t,e,i)},scrollbarFadeHandler:function(t){if(this.options.scrollbarFade)for(const e in t)if(d.hasOwn(t,e)){const i=t[e];i.size>0&&i.blank&&(i.blank=!1,i.size=0)}},scrollbarHeaderHandler:function(t,e,i){this.hasVScroll&&(this.frozenInfo.columns?(t.HRV.size=i,t.HRV.blank=1):(t.HLV.size=i,t.HLV.blank=1))},scrollbarC0R0Handler:function(t,e,i){t.TLH.size=e,t.TLV.size=i},scrollbarC0R1Handler:function(t,e,i){this.frozenInfo.bottom?this.scrollbarC0R1B1Handler(t,e,i):this.scrollbarC0R1B0Handler(t,e,i)},scrollbarC0R1B1Handler:function(t,e,i){t.BLH.size=e,t.TLV.size=i,this.hasVScroll&&(t.BLV.size=i,t.BLV.blank=1)},scrollbarC0R1B0Handler:function(t,e,i){t.BLH.size=e,t.BLV.size=i,this.hasVScroll&&(t.TLV.size=i,t.TLV.blank=1)},scrollbarC1R0Handler:function(t,e,i){this.frozenInfo.right?this.scrollbarC1R0R1Handler(t,e,i):this.scrollbarC1R0R0Handler(t,e,i)},scrollbarC1R0R1Handler:function(t,e,i){this.hasHScroll&&(t.TLH.size=e,this.scrollPaneHidden?(t.TRH.size=e,t.TLH.blank=!0):(t.TRH.size=e,t.TRH.blank=!0)),t.TRV.size=i},scrollbarC1R0R0Handler:function(t,e,i){this.hasHScroll&&(t.TRH.size=e,this.scrollPaneHidden?(t.TLH.size=e,t.TRH.blank=!0):(t.TLH.size=e,t.TLH.blank=!0)),t.TRV.size=i},scrollbarC1R1Handler:function(t,e,i){this.frozenInfo.right?this.frozenInfo.bottom?this.scrollbarC1R1R1B1Handler(t,e,i):this.scrollbarC1R1R1B0Handler(t,e,i):this.frozenInfo.bottom?this.scrollbarC1R1R0B1Handler(t,e,i):this.scrollbarC1R1R0B0Handler(t,e,i)},scrollbarC1R1R1B1Handler:function(t,e,i){this.hasHScroll&&(t.BLH.size=e,this.scrollPaneHidden&&(t.BRH.size=e,t.BLH.blank=!0)),t.TRV.size=i,this.hasVScroll&&(t.BRV.size=i,t.BRV.blank=1)},scrollbarC1R1R1B0Handler:function(t,e,i){this.hasHScroll&&(t.BLH.size=e,this.scrollPaneHidden?(t.BRH.size=e,t.BLH.blank=!0):(t.BRH.size=e,t.BRH.blank=!0)),t.BRV.size=i,this.hasVScroll&&(t.TRV.size=i,t.TRV.blank=1)},scrollbarC1R1R0B1Handler:function(t,e,i){this.hasHScroll&&(t.BRH.size=e,this.scrollPaneHidden&&(t.BLH.size=e,t.BRH.blank=!0)),t.TRV.size=i,this.hasVScroll&&(t.BRV.size=i,t.BRV.blank=1)},scrollbarC1R1R0B0Handler:function(t,e,i){this.hasHScroll&&(t.BRH.size=e,this.scrollPaneHidden?(t.BLH.size=e,t.BRH.blank=!0):(t.BLH.size=e,t.BLH.blank=!0)),t.BRV.size=i,this.hasVScroll&&(t.TRV.size=i,t.TRV.blank=1)},removeScrollPane:function(){clearTimeout(this.timeout_fade),this.previousScrollbarFadeIn=null,this.scrollPaneMap&&(Object.keys(this.scrollPaneMap).forEach((t=>{const e=this.scrollPaneMap[t];e&&e.destroy()})),this.scrollPaneMap=null,this.scrollPane=null,this.scrollPaneFrozen=null)}},Ot={updateScrollState:function(){this.updateGlobalScrollInfo(),this.updateHScrollState(),this.updateVScrollState(),this.updateBlankColumnWidth(),this.scrollStateChanged=!1,this.previousHasHScroll===this.hasHScroll&&this.previousHasVScroll===this.hasVScroll||(this.scrollStateChanged=!0,this.previousHasHScroll=this.hasHScroll,this.previousHasVScroll=this.hasVScroll,this.trigger(C.onScrollStateChanged,{hasHScroll:this.hasHScroll,hasVScroll:this.hasVScroll}))},updateGlobalScrollInfo:function(){this.totalRowsLength=this.getRowsLength(),this.totalRowsHeight=this.getRowsHeight(),this.frozenRowsHeight=this.getFrozenRowsHeight(),this.scrollRowsHeight=this.totalRowsHeight-this.frozenRowsHeight,this.totalRowsHeight=Math.max(this.totalRowsHeight,1),this.scrollRowsHeight=Math.max(this.scrollRowsHeight,1),this.flushRowFrom(this.totalRowsLength)},updateHScrollState:function(){if(this.hasHScroll=!0,this.updateScrollPaneHiddenState(),this.updateHScrollByScrollPaneHidden(),this.scrollPaneHidden)return;this.containerWidth-this.columnsWidth>=0&&(this.hasHScroll=!1)},getScrollPaneCurrentWidth:function(){return this.frozenInfo.right?this.bodyWidth-this.columnsWidthR:this.bodyWidth-this.columnsWidthL},updateHScrollByScrollPaneHidden:function(){if(this.scrollPaneHidden){this.hasHScroll=!1;this.getScrollPaneCurrentWidth()=this.totalRowsHeight&&(this.hasVScroll=!1)}},updateBlankColumnWidth:function(){let t=this.containerWidth-this.columnsWidth;!this.hasVScroll||this.hasHScroll||this.options.scrollbarFade||(t-=this.scrollbarSizeV),this.scrollPaneHidden&&(t=0),this.hasHScroll||(t>=0?(this.frozenInfo.columns?this.columnsWidthR+=t:this.columnsWidthL+=t,this.blankColumn.tg_width=t):this.hasHScroll=!0)}},$t={scrollToRow:function(t){const e=this.getRowItem(t);return this.scrollToItem(e,null),this},scrollToColumn:function(t){const e=this.getColumnItem(t);return this.scrollToItem(null,e),this},scrollToCell:function(t,e){const i=this.getRowItem(t),o=this.getColumnItem(e);return this.scrollToItem(i,o),this},scrollToFirstRow:function(){return this.setScrollTop(0),this},scrollToLastRow:function(){const t=this.getViewRows(),e=t[t.length-1],i=this.getScrollRowPosition(e);if(d.isNum(i))return this.setScrollTop(i),this},scrollToFirstColumn:function(){return this.setScrollLeft(0),this},scrollToLastColumn:function(t){const e=this.getViewColumns();let i=e[e.length-2];t&&(i=e[e.length-1]);const o=this.getScrollColumnPosition(i);if(d.isNum(o))return this.setScrollLeft(o),this},scrollRowIntoView:function(t){const e=this.getRowItem(t);return this.scrollItemIntoView(e,null),this},scrollColumnIntoView:function(t){const e=this.getColumnItem(t);return this.scrollItemIntoView(null,e),this},scrollCellIntoView:function(t,e){const i=this.getRowItem(t),o=this.getColumnItem(e);return this.scrollItemIntoView(i,o),this},setScroll:function(t,e){return t===this.scrollLeft&&e===this.scrollTop||(this.scrollLeft=t,this.scrollTop=e,this.scrollHandler()),this},setScrollLeft:function(t){return t===this.scrollLeft||(this.scrollLeft=t,this.scrollHandler()),this},setScrollTop:function(t){return t===this.scrollTop||(this.scrollTop=t,this.scrollHandler()),this},getScrollRowPosition:function(t){if(!t)return;let e=t.tg_view_index;return e-=this.frozenInfo.rows,e>=0?this.getRowTop(t):void 0},getScrollColumnPosition:function(t){if(!t)return;let e=t.tg_left;return this.frozenInfo.columns&&(e-=this.bodyWidthL),e>=0?e:void 0},scrollToItem:function(t,e){return this.scrollToChanged=!1,this.scrollToRowHandler(t),this.scrollToColumnHandler(e),this.scrollToChanged?(this.scrollHandler(),this):this},scrollToRowHandler:function(t){if(!t)return;const e=this.getScrollRowPosition(t);d.isNum(e)&&e!==this.scrollTop&&(this.scrollTop=e,this.scrollToChanged=!0)},scrollToColumnHandler:function(t){if(!t)return;const e=this.getScrollColumnPosition(t);d.isNum(e)&&e!==this.scrollLeft&&(this.scrollLeft=e,this.scrollToChanged=!0)},scrollItemIntoView:function(t,e){return this.scrollIntoViewChanged=!1,this.scrollRowIntoViewHandler(t),this.scrollColumnIntoViewHandler(e),this.scrollIntoViewChanged?(this.scrollHandler(),this):this},scrollRowIntoViewHandler:function(t){if(!t)return;const e=this.getScrollRowPosition(t);if(!d.isNum(e))return;if(ethis.scrollTop+o){const t=e-(o-i);this.scrollTop=t,this.scrollIntoViewChanged=!0}},scrollColumnIntoViewHandler:function(t){if(!t)return;const e=this.getScrollColumnPosition(t);if(!d.isNum(e))return;if(ethis.scrollLeft+o){const t=e-(o-i);this.scrollLeft=t,this.scrollIntoViewChanged=!0}},scrollOnInit:function(){const{scrollLeft:t,scrollTop:e,scrollColumn:i,scrollRow:o}=this.renderSettings;this.scrollIntoViewChanged=!1,Number.isInteger(t)&&t!==this.scrollLeft&&(this.scrollLeft=t,this.scrollIntoViewChanged=!0),Number.isInteger(e)&&e!==this.scrollTop&&(this.scrollTop=e,this.scrollIntoViewChanged=!0),i&&this.scrollColumnIntoViewHandler(i),o&&this.scrollRowIntoViewHandler(o),this.scrollIntoViewChanged&&this.scrollPane.setPosition(this.scrollLeft,this.scrollTop)},scrollHandler:function(){this.scrollPane.setPosition(this.scrollLeft,this.scrollTop),this.scrollRenderHandler()},scrollRenderHandler:function(){this.previousScrollLeft===this.scrollLeft&&this.previousScrollTop===this.scrollTop||(this.previousScrollLeft=this.scrollLeft,this.previousScrollTop=this.scrollTop,this.onNextUpdated((()=>{this.updateScrollPaneFade(!0),this.trigger(C.onScroll,{scrollLeft:this.scrollLeft,scrollTop:this.scrollTop})})),this.render())},scrollTouchStartHandler:function(t,e){this.hideColumnLine(),this.scrollTouchLeft=this.getScrollLeft(),this.scrollTouchTop=this.getScrollTop(),this.scrollMaxTouchLeft=this.getMaxScrollLeft(),this.scrollMaxTouchTop=this.getMaxScrollTop()},getTouchOrientation:function(t){return t.orientation?t.orientation:[e.LEFT,e.RIGHT].includes(t.direction)?(t.orientation||(t.orientation="Y"),t.orientation):[e.UP,e.DOWN].includes(t.direction)?(t.orientation||(t.orientation="X"),t.orientation):void 0},scrollTouchMoveHandler:function(t,e){if(e.touchLength>1)return;let i=e.offsetX,o=e.offsetY;const n=this.getTouchOrientation(e);"X"===n?i=0:"Y"===n&&(o=0);let s=this.scrollTouchLeft-i,r=this.scrollTouchTop-o;s=d.clamp(s,0,this.scrollMaxTouchLeft),r=d.clamp(r,0,this.scrollMaxTouchTop);let l=!1;this.scrollPaneHidden&&(l=this.scrollPaneFrozen.setOffsetH(-e.moveX),s=0);const h=this.getScrollLeft(),a=this.getScrollTop();(s!==h||r!==a||l)&&(d.preventDefault(e.e),this.setScroll(s,r))},scrollTouchEndHandler:function(){this.protectedItem=null},scrollTouchInertiaHandler:function(t,e){const i=this.getScrollLeft(),o=this.getScrollTop(),n=i-e.touchInertiaX,s=o-e.touchInertiaY;this.setScroll(n,s)},getScrollViewWidth:function(){let t=this.getScrollPaneWidth();return this.frozenInfo.right||(t-=this.getScrollbarWidth()),t},getScrollViewHeight:function(){let t=this.getScrollPaneHeight();return this.frozenInfo.bottom||(t-=this.getScrollbarHeight()),t},getScrollPaneWidth:function(){return this.scrollPane.width()},getScrollPaneHeight:function(){return this.scrollPane.height()},getScrollbarWidth:function(){return this.hasVScroll&&!this.options.scrollbarFade?this.scrollbarSizeV:0},getScrollbarHeight:function(){return this.hasHScroll&&!this.options.scrollbarFade?this.scrollbarSizeH:0},getScrollLeft:function(){return this.scrollPane.getScrollLeft()},getScrollTop:function(){return this.scrollPane.getScrollTop()},getMaxScrollLeft:function(){return this.scrollPane.getMaxScrollLeft()},getMaxScrollTop:function(){return this.scrollPane.getMaxScrollTop()}};class Bt{constructor(t){this.options=this.generateOptions(t)}generateOptions(t){return d.merge({ignore:null,sortField:"",sortFactor:1,sortBlankFactor:1,sortComparer:null},t)}sortList(t){if(!d.isList(t)||1===t.length)return!1;this.ignoreExcludeHandler(t);const e=this.comparerHandler(t);return this.ignoreIncludeHandler(t),e}getDefaultComparer(t){return(ft[t]||ft.string).bind(this)}comparerHandler(t){const e=this.options,i=e.sortField,o=e.sortFactor,n=e.sortBlankFactor,s=e.sortComparer;return"function"==typeof s&&(t.sort(((t,e)=>s.call(this,t,e,{sortField:i,sortFactor:o,sortBlankFactor:n}))),!0)}ignoreExcludeHandler(t){const e=this.options.ignore;this.ignoreListTop=[],this.ignoreListBottom=[];const i=[];for(let o=0,n=t.length;o{t.unshift(e.item)})),this.ignoreListBottom.forEach((e=>{t.push(e.item)}))}}const Dt={removeSortColumn:function(){return this.sortColumn=null,this.$header&&this.$header.find(".tg-column-sorted").removeClass("tg-column-sorted"),this},setSortColumn:function(t){if(!(t=this.getColumnItem(t)))return;if(!this.isColumnSortable(t))return;t===this.sortColumn?t.sortAsc=!t.sortAsc:d.hasOwn(t,"sortAsc")||(t.sortAsc=this.options.sortAsc),this.sortColumn=t;if(this.getRowsLength()-this.frozenInfo.rows<2)return;if(!this.headerCreated)return;this.updateRowsSort()&&(this.renderHeaderSort(),this.flushSort(),this.render("rows"))},renderHeaderSort:function(){const t=this.sortColumn;if(!t)return this;if(!this.isColumnSortable(t))return this;this.$header.find(".tg-column-sorted").removeClass("tg-column-sorted");const e=t.tg_view_index,i=this.$header.find(`.tg-header-item[column='${e}']`).find(".tg-column-header").addClass("tg-column-sorted");return t.sortAsc?i.removeClass("tg-sort-desc").addClass("tg-sort-asc"):i.removeClass("tg-sort-asc").addClass("tg-sort-desc"),this},getSortComparer:function(t){const e=t.comparer;if("function"==typeof e)return e;const i=this.options.sortComparers,o=i[e||t.type];return"function"==typeof o?o:i.string},updateRowsSort:function(){const t=this.sortColumn;if(!t)return!1;const e=t.id;return!!e&&this.sortRows(e,t)},sortRows:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=e.sortAsc?-1:1,o=this.options.sortBlankValueBottom?1:i,n=this.getSortComparer(e);let s=!1;const r=new Bt({ignore:function(t){return t.tg_frozen?{item:t,top:!0}:t.sortFixed?{item:t,top:"top"===t.sortFixed}:void 0},sortField:t,sortFactor:i,sortBlankFactor:o,sortComparer:n}),l=function(t){r.sortList(t)&&(s=!0),t.forEach((function(t,e){t.tg_sub_index=e,t.subs&&l(t.subs)}))};return l(this.rows),s&&this.initRowsHandler(),s}},Wt={default:{},lightblue:{rowHeight:35,scrollbarSize:10,scrollbarRound:!0},dark:{}},At={getAllThemes:function(){return Object.keys(Wt)},getThemeOptions:function(t){return Wt[t]}},Ft={update:function(){return this.flushBody(),this.render("rows"),this},updateRow:function(t,e){const i=this.getRowItem(t);if(!i)return this;if(e&&"object"==typeof e){const t=this.getItemSnapshot(e);Object.keys(t).forEach((function(e){i[e]=t[e]}))}return this.flushRow(i.tg_view_index),this.render("rows"),this},updateCell:function(t,e,i){const o=this.getRowItem(t);if(!o)return this;const n=this.getColumnItem(e);return n?(arguments.length>2&&(o[n.id]=i),this.flushCell(o.tg_view_index,n.tg_view_index),this.render("rows"),this):this},onNextUpdated:function(t){return"function"!=typeof t||this.once(C.onUpdated,t),this}},Gt={getViewport:function(){this.scrollLeft=this.getScrollLeft(),this.scrollTop=this.getScrollTop();return{rows:this.getViewportRows(),columns:this.getViewportColumns()}},getViewportRows:function(){const t=[],e=this.viewRows,i=e.length;if(!i)return t;let o=this.options.rowCacheLength;o=d.clamp(d.toNum(o,!0),0,i);const n=this.frozenInfo.rows;if(n){let e=0;for(;e1;){const n=Math.floor(.5*(e+i)),s=t[n],r=this.getRowTop(s),l=this.getRowHeight(s);if(or+l))return n;e=n}}const n=t[i];return o=e)return[];const i=[],o=this.frozenInfo.columns,n=this.viewColumns;for(let s=o,r=n.length;s0;){const n=t[0]-1;n>o&&t.unshift(n);const s=t[t.length-1]+1;si)&&!(n0&&(e.rows.length=o),i=t.options}return this.data=e,this.dataOptions=i,this}setDataSnapshot(t){return this.setData(this.generateDataSnapshot(t)),this}getData(){return this.data}toString(){return"[object Grid]"}}var Ut;Ut=jt.prototype,[v,R,S,T,L,I,E,x,z,F,G,j,q,K,J,Z,tt,et,pt,mt,bt,wt,vt,Ht,{keyTabHandler:function(t){},keyEnterHandler:function(t){},keyEscHandler:function(t){},keyPageUpHandler:function(t){return this.scrollPane.keyPageUpHandler(t)},keyPageDownHandler:function(t){return this.scrollPane.keyPageDownHandler(t)},keyEndHandler:function(t){return this.scrollPane.keyEndHandler(t)},keyHomeHandler:function(t){return this.scrollPane.keyHomeHandler(t)},keyLeftHandler:function(t){return this.scrollPaneHidden?this.scrollPaneFrozen.keyLeftHandler(t):this.scrollPane.keyLeftHandler(t)},keyUpHandler:function(t){return this.scrollPane.keyUpHandler(t)},keyRightHandler:function(t){return this.scrollPaneHidden?this.scrollPaneFrozen.keyRightHandler(t):this.scrollPane.keyRightHandler(t)},keyDownHandler:function(t){return this.scrollPane.keyDownHandler(t)}},yt,Ct,Rt,St,Tt,{showRow:function(t){return this.updateRowsInvisible(this.toRowItemList(t),!1)},hideRow:function(t){return this.updateRowsInvisible(this.toRowItemList(t),!0)},updateRowsInvisible:function(t,e){if(!t.length)return!1;const i=[];return t.forEach((t=>{t.invisible!==e&&(t.invisible=e,t.tg_invisible=e,i.push(t))})),!!i.length&&(this.update(),!0)}},Lt,It,Et,xt,zt,Vt,Ot,$t,Dt,At,Ft,Gt].forEach((t=>{for(const e in t){if(d.hasOwn(Ut,e))throw new Error(`ERROR: extends with an existing key: "${e}"`);Ut[e]=t[e]}}));const Xt=jt,Yt=e.VERSION,qt=e.TIMESTAMP,Kt={VERSION:Yt,TIMESTAMP:qt,Grid:Xt,$:w,CONST:e,EventBase:k,Icon:X,Motion:D,ScrollPane:kt,Util:d}})();var n=o.$,s=o.MP,r=o._d,l=o.xA,h=o.In,a=o.T8,c=o.Gr,d=o.ht,u=o.J0,g=o.xv,f=o.Ay;export{n as $,s as CONST,r as EventBase,l as Grid,h as Icon,a as Motion,c as ScrollPane,d as TIMESTAMP,u as Util,g as VERSION,f as default}; \ No newline at end of file diff --git a/misc/custom-nodes.jpg b/misc/custom-nodes.jpg index 10482f1b..74c2a8bf 100644 Binary files a/misc/custom-nodes.jpg and b/misc/custom-nodes.jpg differ diff --git a/misc/main.png b/misc/main.png deleted file mode 100644 index 910da417..00000000 Binary files a/misc/main.png and /dev/null differ diff --git a/misc/menu.jpg b/misc/menu.jpg index bf98d421..c83540a9 100644 Binary files a/misc/menu.jpg and b/misc/menu.jpg differ diff --git a/misc/missing-list.jpg b/misc/missing-list.jpg new file mode 100644 index 00000000..ead97637 Binary files /dev/null and b/misc/missing-list.jpg differ diff --git a/misc/missing-list.png b/misc/missing-list.png deleted file mode 100644 index f1cc4fd2..00000000 Binary files a/misc/missing-list.png and /dev/null differ diff --git a/misc/missing-menu.jpg b/misc/missing-menu.jpg new file mode 100644 index 00000000..455ea6fc Binary files /dev/null and b/misc/missing-menu.jpg differ diff --git a/misc/missing-menu.png b/misc/missing-menu.png deleted file mode 100644 index 5e74744b..00000000 Binary files a/misc/missing-menu.png and /dev/null differ diff --git a/misc/share-setting.jpg b/misc/share-setting.jpg index 0ceacf2c..631794a3 100644 Binary files a/misc/share-setting.jpg and b/misc/share-setting.jpg differ diff --git a/model-list.json b/model-list.json index 1f587fc2..6e6ce504 100644 --- a/model-list.json +++ b/model-list.json @@ -120,6 +120,16 @@ "filename": "8x_NMKD-Superscale_150000_G.pth", "url": "https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/8x_NMKD-Superscale_150000_G.pth" }, + { + "name": "8x_NMKD-Faces_160000_G", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "8x_NMKD-Faces_160000_G upscaler model", + "reference": "https://huggingface.co/gemasai/8x_NMKD-Faces_160000_G/tree/main", + "filename": "8x_NMKD-Faces_160000_G.pth", + "url": "https://huggingface.co/gemasai/8x_NMKD-Faces_160000_G/resolve/main/8x_NMKD-Faces_160000_G.pth" + }, { "name": "LDSR(Latent Diffusion Super Resolution)", "type": "upscale", @@ -2781,7 +2791,7 @@ "url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model_twins.safetensors" }, { - "name": "xinsir/CControlnet-Scribble-Sdxl-1.0-Anime", + "name": "xinsir/Controlnet-Scribble-Sdxl-1.0-Anime", "type": "controlnet", "base": "SDXL", "save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0-anime", @@ -2800,6 +2810,108 @@ "reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned", "filename": "tooncrafter_512_interp-fp16.safetensors", "url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/tooncrafter_512_interp-fp16.safetensors" + }, + + { + "name": "CN-anytest_v4-marged.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[2.5GB] AnyTest Controlnet. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged.safetensors" + }, + { + "name": "CN-anytest_v4-marged_am_dim256.safetensors (dim256/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Animagine. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_am_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim256.safetensors" + }, + { + "name": "CN-anytest_v4-marged_am_dim128.safetensors (dim128/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Animagine. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_am_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim128.safetensors" + }, + { + "name": "CN-anytest_v4-marged_pn_dim256.safetensors (dim256/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Pony. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_pn_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim256.safetensors" + }, + { + "name": "CN-anytest_v4-marged_pn_dim128.safetensors (dim128/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Pony. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_pn_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim128.safetensors" + }, + + { + "name": "CN-anytest_v3-50000_fp16.safetensors (fp16)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[2.5GB] AnyTest Controlnet. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_fp16.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_fp16.safetensors" + }, + { + "name": "CN-anytest_v3-50000_am_dim256.safetensors (dim256/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Animagine. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_am_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim256.safetensors" + }, + { + "name": "CN-anytest_v3-50000_am_dim128.safetensors (dim128/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Animagine. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_am_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim128.safetensors" + }, + { + "name": "CN-anytest_v3-50000_pn_dim256.safetensors (dim256/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Pony. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_pn_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim256.safetensors" + }, + { + "name": "CN-anytest_v3-50000_pn_dim128.safetensors (dim128/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Pony. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_pn_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim128.safetensors" } ] } diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index 9a881711..e035cb15 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -9,6 +9,246 @@ "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": "baicai99", + "title": "ComfyUI-FrameSkipping", + "id": "frame-skipping", + "reference": "https://github.com/baicai99/ComfyUI-FrameSkipping", + "files": [ + "https://github.com/baicai99/ComfyUI-FrameSkipping" + ], + "install_type": "git-clone", + "description": "This plugin can precisely control the rendering between frames, completing the synthesis of multiple frames in a single load. My homepage includes my attached workflow." + }, + { + "author": "ejektaflex", + "title": "ComfyUI - Ty", + "id": "ty-nodes", + "reference": "https://github.com/ejektaflex/ComfyUI-Ty", + "files": [ + "https://github.com/ejektaflex/ComfyUI-Ty" + ], + "install_type": "git-clone", + "description": "Nodes:Lora Block Weight Regex Loader" + }, + { + "author": "jtydhr88", + "title": "ComfyUI-Unique3D", + "id": "unique3d", + "reference": "https://github.com/jtydhr88/ComfyUI-Unique3D", + "files": [ + "https://github.com/jtydhr88/ComfyUI-Unique3D" + ], + "install_type": "git-clone", + "description": "ComfyUI Unique3D is custom nodes that running [a/AiuniAI/Unique3D](https://github.com/AiuniAI/Unique3D) into ComfyUI." + }, + { + "author": "kycg", + "title": "comfyui-Kwtoolset", + "id": "kwtoolset", + "reference": "https://github.com/kycg/comfyui-Kwtoolset", + "files": [ + "https://github.com/kycg/comfyui-Kwtoolset" + ], + "install_type": "git-clone", + "description": "Nodes:KwtoolsetLoraLoaderwithpreview, KwtoolsetCheckpointLoaderwithpreview, KwtoolsetLoadCheckpointsBatch, KwtoolsetGrowMaskPlus, KwtoolsetGetHipMask, KwtoolsetGetHipMasktest, KwtoolsetGetImageSize, KWPositiveString, KWNagetiveString, KWanywhereString, KwtoolsetChangeOpenpose, ..." + }, + { + "author": "mashb1t", + "title": "ComfyUI mashb1t nodes", + "id": "mashb1t", + "reference": "https://github.com/mashb1t/comfyui-nodes-mashb1t", + "files": [ + "https://github.com/mashb1t/comfyui-nodes-mashb1t" + ], + "install_type": "git-clone", + "description": "This Python script is an optional add-on to the Comfy UI stable diffusion client." + }, + { + "author": "immersiveexperience", + "title": "ie-comfyui-color-nodes", + "reference": "https://github.com/immersiveexperience/ie-comfyui-color-nodes", + "files": [ + "https://github.com/immersiveexperience/ie-comfyui-color-nodes" + ], + "install_type": "git-clone", + "description": "Custom ComfyUI nodes for simple color correction." + }, + { + "author": "LZpenguin", + "title": "ComfyUI-Text", + "id": "comfy-text", + "reference": "https://github.com/LZpenguin/ComfyUI-Text", + "files": [ + "https://github.com/LZpenguin/ComfyUI-Text" + ], + "install_type": "git-clone", + "description": "Nodes:Add_text_by_mask.[w/This custom node cannot be installed simultaneously as it has the same repository name as MarkoCa1/ComfyUI-Text.]" + }, + { + "author": "yushan777", + "title": "Y7 Nodes for ComfyUI", + "id": "y7nodes", + "reference": "https://github.com/yushan777/ComfyUI-Y7Nodes", + "files": [ + "https://github.com/yushan777/ComfyUI-Y7Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Count_Tokens_(Y7)" + }, + { + "author": "norgeous", + "title": "UI Builder [WIP]", + "id": "norgeous", + "reference": "https://github.com/norgeous/ComfyUI-UI-Builder", + "files": [ + "https://github.com/norgeous/ComfyUI-UI-Builder" + ], + "install_type": "git-clone", + "description": "Alternative configurable React UI overlay for Comfy UI." + }, + { + "author": "Shinsplat", + "title": "ComfyUI-Shinsplat [UNSAFE]", + "id": "shinsplat", + "reference": "https://github.com/Shinsplat/ComfyUI-Shinsplat", + "files": [ + "https://github.com/Shinsplat/ComfyUI-Shinsplat" + ], + "install_type": "git-clone", + "description": "Nodes: Clip Text Encode (Shinsplat), Clip Text Encode SDXL (Shinsplat), Lora Loader (Shinsplat).\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]" + }, + { + "author": "NitramDom", + "title": "ComfyUI_FacialFlip", + "id": "facialflip", + "reference": "https://github.com/NitramDom/ComfyUI_FacialFlip", + "files": [ + "https://github.com/NitramDom/ComfyUI_FacialFlip" + ], + "install_type": "git-clone", + "description": "Nodes:Swapper" + }, + { + "author": "hy134300", + "title": "comfyui-hydit", + "reference": "https://github.com/hy134300/comfyui-hydit", + "files": [ + "https://github.com/hy134300/comfyui-hydit" + ], + "install_type": "git-clone", + "description": "This repository contains a customized node and workflow designed specifically for HunYuan DIT. The official tests conducted on DDPM, DDIM, and DPMMS have consistently yielded results that align with those obtained through the Diffusers library. However, it's important to note that we cannot assure the consistency of results from other ComfyUI native samplers with the Diffusers inference. We cordially invite users to explore our workflow and are open to receiving any inquiries or suggestions you may have." + }, + { + "author": "corbin-hayden13", + "title": "ComfyUI-Better-Dimensions", + "id": "better-dim", + "reference": "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions", + "files": [ + "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions" + ], + "install_type": "git-clone", + "description": "Nodes:BetterImageDimensions, SDXLDimensions, PureRatio" + }, + { + "author": "endman100", + "title": "ComfyUI Nodes: SaveConditioning and LoadConditioning", + "id": "save-load-conditioning", + "reference": "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition", + "files": [ + "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition" + ], + "install_type": "git-clone", + "description": "The SaveConditioning node is designed to save conditioning data to binary files. This is useful for storing and reusing conditioning information across different sessions or applications.\n[w/This node can only handle very limited conditioning at the text prompt level.]" + }, + { + "author": "marduk191", + "title": "comfyui-marnodes", + "id": "marnodes", + "reference": "https://github.com/marduk191/comfyui-marnodes", + "files": [ + "https://github.com/marduk191/comfyui-marnodes" + ], + "install_type": "git-clone", + "description": "Nodes:marduk191_workflow_settings" + }, + { + "author": "kijai", + "title": "ComfyUI-CV-VAE", + "id": "cv-vae", + "reference": "https://github.com/kijai/ComfyUI-CV-VAE", + "files": [ + "https://github.com/kijai/ComfyUI-CV-VAE" + ], + "install_type": "git-clone", + "description": "Nodes:CV_VAE_Load, CV_VAE_Encode, CV_VAE_Decode" + }, + { + "author": "GentlemanHu", + "title": "ComfyUI Notifier", + "id": "notifier", + "reference": "https://github.com/GentlemanHu/ComfyUI-Notifier", + "files": [ + "https://github.com/GentlemanHu/ComfyUI-Notifier" + ], + "install_type": "git-clone", + "description": "Nodes:GentlemanHu_Notifier" + }, + { + "author": "jimmm-ai", + "title": "TimeUi a ComfyUI Timeline Node System [WIP]", + "id": "timeline", + "reference": "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node", + "files": [ + "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node" + ], + "install_type": "git-clone", + "description": "I've been working on the UX/UI of a timeline custom node system for ComfyUI over the past two weeks. The goal is to create a timeline similar to video/animation editing tools, without relying on traditional timeframe code. You can effortlessly add, delete, or rearrange rows, providing a streamlined user experience." + }, + { + "author": "udi0510", + "title": "comfyui-slicer", + "id": "slicer", + "reference": "https://github.com/udi0510/comfyui-slicer", + "files": [ + "https://github.com/udi0510/comfyui-slicer" + ], + "install_type": "git-clone", + "description": "Nodes:SlicerNode" + }, + { + "author": "jh-leon-kim", + "title": "ComfyUI-JHK-utils", + "id": "jhk", + "reference": "https://github.com/jh-leon-kim/ComfyUI-JHK-utils", + "files": [ + "https://github.com/jh-leon-kim/ComfyUI-JHK-utils" + ], + "install_type": "git-clone", + "description": "Nodes:JHK_Utils_LoadEmbed, JHK_Utils_string_merge, JHK_Utils_ImageRemoveBackground" + }, + { + "author": "StartHua", + "title": "Comfyui_CXH_CRM", + "id": "cxh-crm", + "reference": "https://github.com/StartHua/Comfyui_CXH_CRM", + "files": [ + "https://github.com/StartHua/Comfyui_CXH_CRM" + ], + "install_type": "git-clone", + "description": "Nodes:CRM" + }, + { + "author": "comfypod", + "title": "ComfyUI-Comflow", + "id": "comflow", + "reference": "https://github.com/comfypod/ComfyUI-Comflow", + "files": [ + "https://github.com/comfypod/ComfyUI-Comflow" + ], + "install_type": "git-clone", + "description": "ComfyUI-Comflow." + }, { "author": "AI2lab", "title": "comfyUI-tool-2lab", @@ -78,13 +318,12 @@ { "author": "brycegoh", "title": "brycegoh/comfyui-custom-nodes", - "id": "brycegoh", "reference": "https://github.com/brycegoh/comfyui-custom-nodes", "files": [ "https://github.com/brycegoh/comfyui-custom-nodes" ], "install_type": "git-clone", - "description": "Nodes:MaskAreaComparisonSegment, FillMaskedArea, OCRAndMask" + "description": "Nodes:MaskAreaComparisonSegment, FillMaskedArea, OCRAndMask, CombineTwoImageIntoOne" }, { "author": "LykosAI", @@ -330,16 +569,6 @@ "install_type": "git-clone", "description": "This extension provides [a/DiffBIR](https://github.com/XPixelGroup/DiffBIR) feature." }, - { - "author": "runtime44", - "title": "Runtime44 ComfyUI Nodes", - "reference": "https://github.com/runtime44/comfyui_r44_nodes", - "files": [ - "https://github.com/runtime44/comfyui_r44_nodes" - ], - "install_type": "git-clone", - "description": "Nodes: Runtime44Upscaler, Runtime44ColorMatch, Runtime44DynamicKSampler, Runtime44ImageOverlay, Runtime44ImageResizer, Runtime44ImageToNoise, Runtime44MaskSampler, Runtime44TiledMaskSampler, Runtime44IterativeUpscaleFactor, Runtime44ImageEnhance" - }, { "author": "ericbeyer", "title": "guidance_interval", @@ -1120,16 +1349,6 @@ "install_type": "git-clone", "description": "After discovering @storyicon implementation here of Segment Anything, I realized its potential as a powerful tool for ComfyUI if implemented correctly. I delved into the SAM and Dino models. The following is my own adaptation of sam_hq for ComfyUI." }, - { - "author": "phineas-pta", - "title": "comfy-trt-test [WIP]", - "reference": "https://github.com/phineas-pta/comfy-trt-test", - "files": [ - "https://github.com/phineas-pta/comfy-trt-test" - ], - "install_type": "git-clone", - "description": "Test project for ComfyUI TensorRT Support.\nNOT WORKING YET.\nnot automatic yet, do not use ComfyUI-Manager to install !!!.\nnot beginner-friendly yet, still intended to technical users\nNOTE: The reason for registration in the Manager is for guidance, and for detailed installation instructions, please visit the repository." - }, { "author": "Brandelan", "title": "ComfyUI_bd_customNodes", diff --git a/node_db/dev/extension-node-map.json b/node_db/dev/extension-node-map.json index 806c009a..1e17ad98 100644 --- a/node_db/dev/extension-node-map.json +++ b/node_db/dev/extension-node-map.json @@ -504,8 +504,13 @@ ], "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": [ [ + "Color Match", "Custom Shader", "Folder Queue Manager", + "Image Blend by Mask (Batch)", + "Image Noise Generator", + "Perlin Noise Generator", + "Random Image Generator", "Spring Mesh", "Video Queue Manager" ], @@ -539,9 +544,25 @@ "title_aux": "ComfyUI-MS-Nodes [WIP]" } ], + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": [ + [ + "CombinedDiffusersSD15Loader", + "CombinedDiffusersSDXLLoader", + "SD15CLIPLoader", + "SD15UNETLoader", + "SD15VAELoader", + "SDXLCLIPLoader", + "SDXLUNETLoader", + "SDXLVAELoader" + ], + { + "title_aux": "ComfyUI-DiffusersLoader" + } + ], "https://github.com/SeedV/ComfyUI-SeedV-Nodes": [ [ "CheckpointLoaderSimpleShared //SeedV", + "ControlNetLoaderAdvancedShared", "LoraLoader //SeedV", "Script" ], @@ -549,6 +570,14 @@ "title_aux": "ComfyUI-SeedV-Nodes [UNSAFE]" } ], + "https://github.com/StartHua/Comfyui_CXH_CRM": [ + [ + "CRM" + ], + { + "title_aux": "Comfyui_CXH_CRM" + } + ], "https://github.com/TSFSean/ComfyUI-TSFNodes": [ [ "GyroOSC" @@ -712,8 +741,21 @@ "title_aux": "comfyui-cleaner" } ], + "https://github.com/bruce007lee/comfyui-tiny-utils": [ + [ + "CropImageByMask", + "FaceAlign", + "FaceAlignImageProcess", + "FaceAlignMaskProcess", + "ImageFillColorByMask" + ], + { + "title_aux": "comfyui-tiny-utils" + } + ], "https://github.com/brycegoh/comfyui-custom-nodes": [ [ + "CombineTwoImageIntoOne", "FillMaskedArea", "MaskAreaComparisonSegment", "OCRAndMask" @@ -955,51 +997,38 @@ "title_aux": "ComfyUI" } ], - "https://github.com/dezi-ai/ComfyUI-AnimateLCM": [ + "https://github.com/comfypod/ComfyUI-Comflow": [ [ - "ADE_AdjustPEFullStretch", - "ADE_AdjustPEManual", - "ADE_AdjustPESweetspotStretch", - "ADE_AnimateDiffCombine", - "ADE_AnimateDiffKeyframe", - "ADE_AnimateDiffLoRALoader", - "ADE_AnimateDiffLoaderGen1", - "ADE_AnimateDiffLoaderV1Advanced", - "ADE_AnimateDiffLoaderWithContext", - "ADE_AnimateDiffModelSettings", - "ADE_AnimateDiffModelSettingsAdvancedAttnStrengths", - "ADE_AnimateDiffModelSettingsSimple", - "ADE_AnimateDiffModelSettings_Release", - "ADE_AnimateDiffSamplingSettings", - "ADE_AnimateDiffSettings", - "ADE_AnimateDiffUniformContextOptions", - "ADE_AnimateDiffUnload", - "ADE_ApplyAnimateDiffModel", - "ADE_ApplyAnimateDiffModelSimple", - "ADE_BatchedContextOptions", - "ADE_EmptyLatentImageLarge", - "ADE_IterationOptsDefault", - "ADE_IterationOptsFreeInit", - "ADE_LoadAnimateDiffModel", - "ADE_LoopedUniformContextOptions", - "ADE_LoopedUniformViewOptions", - "ADE_MaskedLoadLora", - "ADE_MultivalDynamic", - "ADE_MultivalScaledMask", - "ADE_NoiseLayerAdd", - "ADE_NoiseLayerAddWeighted", - "ADE_NoiseLayerReplace", - "ADE_StandardStaticContextOptions", - "ADE_StandardStaticViewOptions", - "ADE_StandardUniformContextOptions", - "ADE_StandardUniformViewOptions", - "ADE_UseEvolvedSampling", - "ADE_ViewsOnlyContextOptions", - "AnimateDiffLoaderV1", - "CheckpointLoaderSimpleWithNoiseSelect" + "ComflowInputBoolean", + "ComflowInputCheckpoint", + "ComflowInputImage", + "ComflowInputImageAlpha", + "ComflowInputImageBatch", + "ComflowInputLora", + "ComflowInputNumber", + "ComflowInputNumberInt", + "ComflowInputNumberSlider", + "ComflowInputText", + "ComflowInputVid", + "ComflowInputVideo", + "ComflowWebsocketImageInput", + "ComflowWebsocketImageOutput" ], { - "title_aux": "ComfyUI Animate LCM" + "description": "", + "nickname": "Comflow", + "title": "comflow", + "title_aux": "ComfyUI-Comflow" + } + ], + "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions": [ + [ + "BetterImageDimensions", + "PureRatio", + "SDXLDimensions" + ], + { + "title_aux": "ComfyUI-Better-Dimensions" } ], "https://github.com/dfl/comfyui-stylegan": [ @@ -1089,6 +1118,15 @@ "title_aux": "ComfyUI-Ty" } ], + "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition": [ + [ + "LoadContditioning", + "SaveConditioning" + ], + { + "title_aux": "ComfyUI Nodes: SaveConditioning and LoadConditioning" + } + ], "https://github.com/ericbeyer/guidance_interval": [ [ "Guidance Interval" @@ -1190,6 +1228,27 @@ "title_aux": "comfy-magick [WIP]" } ], + "https://github.com/huchenlei/ComfyUI_densediffusion": [ + [ + "DenseDiffusionAddCondNode", + "DenseDiffusionApplyNode" + ], + { + "title_aux": "ComfyUI DenseDiffusion [WIP]" + } + ], + "https://github.com/huchenlei/ComfyUI_omost": [ + [ + "OmostLLMChatNode", + "OmostLLMLoaderNode", + "OmostLayoutCondNode", + "OmostLoadCanvasConditioningNode", + "OmostRenderCanvasConditioningNode" + ], + { + "title_aux": "ComfyUI_omost [WIP]" + } + ], "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": [ [ "EasyBgRemover", @@ -1241,12 +1300,23 @@ "https://github.com/immersiveexperience/ie-comfyui-color-nodes": [ [ "Average Color", - "Complementary Color" + "Complementary Color", + "Hex to Color Name" ], { "title_aux": "ie-comfyui-color-nodes" } ], + "https://github.com/jh-leon-kim/ComfyUI-JHK-utils": [ + [ + "JHK_Utils_ImageRemoveBackground", + "JHK_Utils_LoadEmbed", + "JHK_Utils_string_merge" + ], + { + "title_aux": "ComfyUI-JHK-utils" + } + ], "https://github.com/jn-jairo/jn_node_suite_comfyui": [ [ "JN_AreaInfo", @@ -1391,6 +1461,16 @@ "title_aux": "ComfyUI_Usability (WIP)" } ], + "https://github.com/kijai/ComfyUI-CV-VAE": [ + [ + "CV_VAE_Decode", + "CV_VAE_Encode", + "CV_VAE_Load" + ], + { + "title_aux": "ComfyUI-CV-VAE" + } + ], "https://github.com/kijai/ComfyUI-DeepSeek-VL": [ [ "deepseek_vl_inference", @@ -1462,6 +1542,18 @@ "title_aux": "ComfyUI-BuildPath" } ], + "https://github.com/marduk191/comfyui-marnodes": [ + [ + "marduk191_workflow_settings" + ], + { + "author": "\u02f6marduk191", + "description": "A node to set workflow settings.", + "nickname": "marduk191 workflow settings", + "title": "marduk191 workflow settings", + "title_aux": "comfyui-marnodes" + } + ], "https://github.com/mut-ex/comfyui-gligengui-node": [ [ "GLIGEN_GUI" @@ -1533,18 +1625,19 @@ "title_aux": "Kosmos2_BBox_Cutter Models" } ], - "https://github.com/phineas-pta/comfy-trt-test": [ + "https://github.com/pamparamm/ComfyUI-ppm": [ [ - "TRT_Lora_Loader", - "TRT_Torch_Compile", - "TRT_Unet_Loader" + "CLIPMicroConditioning", + "CLIPNegPip", + "CLIPSetLastLayerFloat", + "CLIPTextEncodeBREAK", + "EmptyLatentImageAR", + "RandomPromptGenerator", + "StableCascade_AutoCompLatent", + "TokenCounter" ], { - "author": "PTA", - "description": "attempt to use TensorRT with ComfyUI, not yet compatible with ComfyUI-Manager, see README for instructions", - "nickname": "comfy trt test", - "title": "TensorRT with ComfyUI (work-in-progress)", - "title_aux": "comfy-trt-test [WIP]" + "title_aux": "ComfyUI-ppm" } ], "https://github.com/poisenbery/NudeNet-Detector-Provider": [ @@ -1717,6 +1810,14 @@ "title_aux": "ComfyUI-TDNodes [WIP]" } ], + "https://github.com/udi0510/comfyui-slicer": [ + [ + "SlicerNode" + ], + { + "title_aux": "comfyui-slicer" + } + ], "https://github.com/umisetokikaze/comfyui_mergekit": [ [ "DefineSaveName", diff --git a/node_db/dev/github-stats.json b/node_db/dev/github-stats.json index b1e1f438..c61cdb65 100644 --- a/node_db/dev/github-stats.json +++ b/node_db/dev/github-stats.json @@ -7,13 +7,17 @@ "stars": 13, "last_update": "2024-03-08 10:11:44" }, + "https://github.com/AI2lab/comfyUI-tool-2lab": { + "stars": 3, + "last_update": "2024-06-06 02:53:28" + }, "https://github.com/AIGODLIKE/ComfyUI-Studio": { - "stars": 196, - "last_update": "2024-05-30 02:14:11" + "stars": 198, + "last_update": "2024-06-05 00:52:46" }, "https://github.com/ALatentPlace/ComfyUI_yanc": { - "stars": 12, - "last_update": "2024-05-27 12:39:32" + "stars": 13, + "last_update": "2024-06-05 05:07:37" }, "https://github.com/BadCafeCode/execution-inversion-demo-comfyui": { "stars": 3, @@ -44,20 +48,24 @@ "last_update": "2024-05-11 13:33:24" }, "https://github.com/ExponentialML/ComfyUI_LiveDirector": { - "stars": 33, + "stars": 34, "last_update": "2024-04-09 19:01:49" }, "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": { "stars": 13, "last_update": "2024-03-10 01:04:02" }, + "https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD": { + "stars": 0, + "last_update": "2024-06-02 06:13:42" + }, "https://github.com/GentlemanHu/ComfyUI-Notifier": { "stars": 3, - "last_update": "2024-05-20 15:25:17" + "last_update": "2024-06-04 10:05:38" }, "https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector": { "stars": 9, - "last_update": "2024-05-28 23:31:22" + "last_update": "2024-06-06 13:14:10" }, "https://github.com/GrindHouse66/ComfyUI-GH_Tools": { "stars": 0, @@ -88,7 +96,7 @@ "last_update": "2024-02-04 21:15:22" }, "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes": { - "stars": 12, + "stars": 14, "last_update": "2024-04-05 05:11:51" }, "https://github.com/MrAdamBlack/CheckProgress": { @@ -109,7 +117,7 @@ }, "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": { "stars": 0, - "last_update": "2024-06-01 09:08:26" + "last_update": "2024-06-01 21:27:18" }, "https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": { "stars": 18, @@ -119,16 +127,24 @@ "stars": 2, "last_update": "2024-02-22 08:34:44" }, + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": { + "stars": 2, + "last_update": "2024-06-06 01:36:46" + }, "https://github.com/SeedV/ComfyUI-SeedV-Nodes": { "stars": 1, - "last_update": "2024-05-21 06:39:00" + "last_update": "2024-06-05 10:01:47" + }, + "https://github.com/StartHua/Comfyui_CXH_CRM": { + "stars": 16, + "last_update": "2024-06-06 14:15:14" }, "https://github.com/TSFSean/ComfyUI-TSFNodes": { "stars": 3, "last_update": "2024-05-18 00:59:06" }, "https://github.com/TemryL/ComfyUI-IDM-VTON": { - "stars": 138, + "stars": 162, "last_update": "2024-05-30 12:21:57" }, "https://github.com/Video3DGenResearch/comfyui-batch-input-node": { @@ -144,15 +160,15 @@ "last_update": "2024-04-16 21:53:02" }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": { - "stars": 41, + "stars": 42, "last_update": "2024-05-22 14:30:05" }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO": { - "stars": 175, + "stars": 180, "last_update": "2024-05-22 13:38:23" }, "https://github.com/alt-key-project/comfyui-dream-video-batches": { - "stars": 48, + "stars": 49, "last_update": "2024-05-22 20:52:05" }, "https://github.com/beyastard/ComfyUI_BeySoft": { @@ -165,7 +181,7 @@ }, "https://github.com/blepping/comfyui_overly_complicated_sampling": { "stars": 5, - "last_update": "2024-05-31 20:01:41" + "last_update": "2024-06-01 20:54:03" }, "https://github.com/blib-la/ComfyUI-Captain-Extensions": { "stars": 0, @@ -175,16 +191,20 @@ "stars": 3, "last_update": "2024-04-20 15:36:03" }, + "https://github.com/bruce007lee/comfyui-tiny-utils": { + "stars": 0, + "last_update": "2024-06-05 10:38:57" + }, "https://github.com/brycegoh/comfyui-custom-nodes": { "stars": 0, - "last_update": "2024-06-01 04:34:06" + "last_update": "2024-06-05 09:30:06" }, "https://github.com/chaojie/ComfyUI-DynamiCrafter": { - "stars": 102, + "stars": 105, "last_update": "2024-03-16 19:08:28" }, "https://github.com/chaojie/ComfyUI-mobvoi-openapi": { - "stars": 0, + "stars": 1, "last_update": "2024-05-29 09:02:52" }, "https://github.com/christian-byrne/infinite-zoom-parallax-nodes": { @@ -192,15 +212,23 @@ "last_update": "2024-05-27 01:51:24" }, "https://github.com/christian-byrne/python-interpreter-node": { - "stars": 16, + "stars": 18, "last_update": "2024-06-01 06:00:47" }, "https://github.com/comfyanonymous/ComfyUI": { - "stars": 36385, - "last_update": "2024-06-01 04:09:34" + "stars": 36931, + "last_update": "2024-06-06 03:31:08" + }, + "https://github.com/comfypod/ComfyUI-Comflow": { + "stars": 0, + "last_update": "2024-06-03 15:12:25" + }, + "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions": { + "stars": 0, + "last_update": "2024-06-06 14:25:31" }, "https://github.com/cubiq/Comfy_Dungeon": { - "stars": 162, + "stars": 164, "last_update": "2024-04-26 11:00:58" }, "https://github.com/dezi-ai/ComfyUI-AnimateLCM": { @@ -220,13 +248,17 @@ "last_update": "2024-01-06 19:07:45" }, "https://github.com/eigenpunk/ComfyUI-audio": { - "stars": 56, + "stars": 58, "last_update": "2024-03-03 21:14:14" }, "https://github.com/ejektaflex/ComfyUI-Ty": { "stars": 0, "last_update": "2024-05-15 21:34:21" }, + "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition": { + "stars": 0, + "last_update": "2024-06-06 06:07:49" + }, "https://github.com/ericbeyer/guidance_interval": { "stars": 2, "last_update": "2024-04-16 03:24:01" @@ -237,7 +269,7 @@ }, "https://github.com/flyingdogsoftware/gyre_for_comfyui": { "stars": 0, - "last_update": "2024-05-31 22:27:12" + "last_update": "2024-06-03 21:04:43" }, "https://github.com/foglerek/comfyui-cem-tools": { "stars": 1, @@ -245,11 +277,11 @@ }, "https://github.com/gameltb/ComfyUI_paper_playground": { "stars": 8, - "last_update": "2024-05-28 13:18:26" + "last_update": "2024-06-05 07:13:23" }, "https://github.com/gameltb/ComfyUI_stable_fast": { - "stars": 181, - "last_update": "2024-04-01 13:30:57" + "stars": 182, + "last_update": "2024-06-06 12:43:16" }, "https://github.com/gameltb/io_comfyui": { "stars": 3, @@ -267,6 +299,14 @@ "stars": 4, "last_update": "2024-03-11 06:40:54" }, + "https://github.com/huchenlei/ComfyUI_densediffusion": { + "stars": 22, + "last_update": "2024-06-06 03:11:23" + }, + "https://github.com/huchenlei/ComfyUI_omost": { + "stars": 187, + "last_update": "2024-06-05 18:48:11" + }, "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": { "stars": 2, "last_update": "2024-02-27 08:22:49" @@ -281,14 +321,22 @@ }, "https://github.com/immersiveexperience/ie-comfyui-color-nodes": { "stars": 0, - "last_update": "2024-05-27 09:42:17" + "last_update": "2024-06-06 14:27:54" + }, + "https://github.com/jh-leon-kim/ComfyUI-JHK-utils": { + "stars": 0, + "last_update": "2024-06-04 08:57:52" + }, + "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node": { + "stars": 164, + "last_update": "2024-06-05 07:55:40" }, "https://github.com/jn-jairo/jn_node_suite_comfyui": { "stars": 5, - "last_update": "2024-01-11 20:39:36" + "last_update": "2024-06-02 01:11:02" }, "https://github.com/jtscmw01/ComfyUI-DiffBIR": { - "stars": 52, + "stars": 55, "last_update": "2024-05-21 05:28:34" }, "https://github.com/kadirnar/ComfyUI-Adapter": { @@ -303,8 +351,12 @@ "stars": 0, "last_update": "2024-02-05 14:49:45" }, + "https://github.com/kijai/ComfyUI-CV-VAE": { + "stars": 8, + "last_update": "2024-06-03 21:46:49" + }, "https://github.com/kijai/ComfyUI-DeepSeek-VL": { - "stars": 20, + "stars": 19, "last_update": "2024-05-21 16:43:40" }, "https://github.com/laksjdjf/ssd-1b-comfyui": { @@ -320,15 +372,19 @@ "last_update": "2024-05-07 08:40:56" }, "https://github.com/ltdrdata/ComfyUI-Workflow-Component": { - "stars": 189, + "stars": 190, "last_update": "2024-04-26 01:39:09" }, "https://github.com/marcueberall/ComfyUI-BuildPath": { "stars": 0, "last_update": "2024-02-06 07:57:33" }, + "https://github.com/marduk191/comfyui-marnodes": { + "stars": 0, + "last_update": "2024-06-05 05:37:57" + }, "https://github.com/mut-ex/comfyui-gligengui-node": { - "stars": 27, + "stars": 28, "last_update": "2024-02-28 02:46:05" }, "https://github.com/nat-chan/comfyui-eval": { @@ -355,9 +411,13 @@ "stars": 13, "last_update": "2024-05-03 10:52:29" }, + "https://github.com/pamparamm/ComfyUI-ppm": { + "stars": 1, + "last_update": "2024-06-02 14:18:07" + }, "https://github.com/phineas-pta/comfy-trt-test": { "stars": 83, - "last_update": "2024-03-10 21:17:56" + "last_update": "2024-06-04 21:09:17" }, "https://github.com/poisenbery/NudeNet-Detector-Provider": { "stars": 1, @@ -372,7 +432,7 @@ "last_update": "2023-11-15 22:00:49" }, "https://github.com/runtime44/comfyui_r44_nodes": { - "stars": 21, + "stars": 22, "last_update": "2024-05-23 01:18:22" }, "https://github.com/sangeet/comfyui-testui": { @@ -380,7 +440,7 @@ "last_update": "2024-05-15 00:55:17" }, "https://github.com/sdfxai/SDFXBridgeForComfyUI": { - "stars": 2, + "stars": 3, "last_update": "2024-04-12 14:09:45" }, "https://github.com/shadowcz007/ComfyUI-PuLID-Test": { @@ -404,7 +464,7 @@ "last_update": "2024-04-27 13:25:08" }, "https://github.com/sofakid/dandy": { - "stars": 25, + "stars": 27, "last_update": "2024-05-27 21:46:18" }, "https://github.com/stavsap/ComfyUI-React-SDK": { @@ -432,13 +492,17 @@ "last_update": "2024-03-05 13:31:31" }, "https://github.com/tracerstar/comfyui-p5js-node": { - "stars": 15, + "stars": 23, "last_update": "2024-05-30 18:33:55" }, "https://github.com/tuckerdarby/ComfyUI-TDNodes": { "stars": 3, "last_update": "2024-02-19 17:00:55" }, + "https://github.com/udi0510/comfyui-slicer": { + "stars": 0, + "last_update": "2024-06-04 08:30:38" + }, "https://github.com/umisetokikaze/comfyui_mergekit": { "stars": 0, "last_update": "2024-04-28 07:21:00" @@ -454,5 +518,9 @@ "https://github.com/wormley/comfyui-wormley-nodes": { "stars": 0, "last_update": "2023-11-12 19:05:11" + }, + "https://github.com/zmwv823/ComfyUI-AnyText": { + "stars": 11, + "last_update": "2024-06-06 14:21:08" } } \ No newline at end of file diff --git a/node_db/legacy/custom-node-list.json b/node_db/legacy/custom-node-list.json index 36a2d930..84569d6b 100644 --- a/node_db/legacy/custom-node-list.json +++ b/node_db/legacy/custom-node-list.json @@ -10,6 +10,38 @@ }, + { + "author": "MackinationsAi", + "title": "ComfyUi_Stuctured-Outputs [REMOVED]", + "id": "struct-output", + "reference": "https://github.com/MackinationsAi/ComfyUi_Stuctured-Outputs", + "files": [ + "https://github.com/MackinationsAi/ComfyUi_Stuctured-Outputs" + ], + "install_type": "git-clone", + "description": "This repository contains a custom node for ComfyUI that allows users to save generative image outputs with custom filenames and folder structures. The filenames are padded to four digits, and the positive and negative prompts are embedded in the image metadata." + }, + { + "author": "laksjdjf", + "title": "attention-couple-ComfyUI [DEPRECATED]", + "id": "attention-couple", + "reference": "https://github.com/laksjdjf/attention-couple-ComfyUI", + "files": [ + "https://github.com/laksjdjf/attention-couple-ComfyUI" + ], + "install_type": "git-clone", + "description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet.\nNOTE: This has been integrated with cgem156-ComfyUI." + }, + { + "author": "phineas-pta", + "title": "comfy-trt-test [DEPRECATED]", + "reference": "https://github.com/phineas-pta/comfy-trt-test", + "files": [ + "https://github.com/phineas-pta/comfy-trt-test" + ], + "install_type": "git-clone", + "description": "Test project for ComfyUI TensorRT Support.\nNOT WORKING YET.\nnot automatic yet, do not use ComfyUI-Manager to install !!!.\nnot beginner-friendly yet, still intended to technical users\nNOTE: The reason for registration in the Manager is for guidance, and for detailed installation instructions, please visit the repository.\nNOTE: Use 'TensorRT Node for ComfyUI' instead of this." + }, { "author": "dezi-ai", "title": "ComfyUI Animate LCM [NOT MAINTAINED]", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 38e61f21..0ac912aa 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -11,6 +11,480 @@ + + + + { + "author": "ljleb", + "title": "Mecha Merge Node Pack", + "id": "mecha", + "reference": "https://github.com/ljleb/comfy-mecha", + "files": [ + "https://github.com/ljleb/comfy-mecha" + ], + "install_type": "git-clone", + "description": "Model merging node pack with a focus on low memory footprint." + }, + { + "author": "Michael Standen", + "title": "Ollama Prompt Encode", + "id": "ollamapromptencode", + "reference": "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode", + "files": [ + "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode" + ], + "install_type": "git-clone", + "description": "A prompt generator and CLIP encoder using AI provided by Ollama." + }, + { + "author": "smthemex", + "title": "ComfyUI_Pops", + "id": "pops", + "reference": "https://github.com/smthemex/ComfyUI_Pops", + "files": [ + "https://github.com/smthemex/ComfyUI_Pops" + ], + "install_type": "git-clone", + "description": "You can use [a/Popspaper](https://popspaper.github.io/pOps/) method in comfyUI" + }, + { + "author": "Late Night Labs", + "title": "LNL Frame Selector", + "id": "lnlframeselector", + "reference": "https://github.com/latenightlabs/ComfyUI-LNL", + "files": [ + "https://github.com/latenightlabs/ComfyUI-LNL" + ], + "install_type": "git-clone", + "description": "Frame Selector & Sequence Selection Node for ComfyUI." + }, + { + "author": "shobhitic", + "title": "PlusMinusTextClip - Single node for Positive and Negative Prompts", + "id": "plusminustextclip", + "reference": "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip", + "files": [ + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip" + ], + "install_type": "git-clone", + "description": "This adds a node that has both the positive and negative prompts as input in one node. You can just add one node and be done with both Positive and Negative prompts, in place of adding two different nodes for them." + }, + { + "author": "huchenlei", + "title": "ComfyUI_omost", + "id": "omost", + "reference": "https://github.com/huchenlei/ComfyUI_omost", + "files": [ + "https://github.com/huchenlei/ComfyUI_omost" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/Omost](https://github.com/lllyasviel/Omost), and everything about regional prompt.\nNOTE: You need to install ComfyUI_densediffusion to use this node." + }, + { + "author": "huchenlei", + "title": "ComfyUI DenseDiffusion", + "id": "densediffusion", + "reference": "https://github.com/huchenlei/ComfyUI_densediffusion", + "files": [ + "https://github.com/huchenlei/ComfyUI_densediffusion" + ], + "install_type": "git-clone", + "description": "[a/DenseDiffusion](https://github.com/naver-ai/DenseDiffusion) custom node for ComfyUI." + }, + + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Qwen-2", + "id": "qwen-2", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2" + ], + "install_type": "git-clone", + "description": "Using Qwen-2 in ComfyUI" + }, + { + "author": "BenNarum", + "title": "SigmaWaveFormNodes", + "id": "sigmawaveform", + "reference": "https://github.com/BenNarum/SigmaWaveFormNode", + "files": [ + "https://github.com/BenNarum/SigmaWaveFormNode" + ], + "install_type": "git-clone", + "description": "A set of tools for generating and altering sigmas in ComfyUI." + }, + { + "author": "alessandrozonta", + "title": "OpenPose Node", + "id": "openpose-alessandrozonta", + "reference": "https://github.com/alessandrozonta/ComfyUI-OpenPose", + "files": [ + "https://github.com/alessandrozonta/ComfyUI-OpenPose" + ], + "install_type": "git-clone", + "description": "This extension contains a custom node for ComfyUI. The node, called 'Bounding Box Crop', is designed to compute the top-left coordinates of a cropped bounding box based on input coordinates and dimensions of the final cropped image. It does so computing the center of the cropping area and then computing where the top-left coordinates would be." + }, + { + "author": "GavChap", + "title": "ComfyUI-SD3LatentSelectRes", + "id": "sd3latent-select-res", + "reference": "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes", + "files": [ + "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes" + ], + "install_type": "git-clone", + "description": "You'll get a new node called SD3 Latent Select Resolution, you can pick the x and y sizes from a list." + }, + { + "author": "Jin Liu", + "title": "ComfyUI-LJNodes", + "id": "ComfyUI-LJNodes", + "reference": "https://github.com/coolzilj/ComfyUI-LJNodes", + "files": [ + "https://github.com/coolzilj/ComfyUI-LJNodes" + ], + "install_type": "git-clone", + "description": "A variety of custom nodes to enhance ComfyUI for a buttery smooth experience." + }, + { + "author": "marduk191", + "title": "marduk191 workflow settings", + "id": "marnodes", + "reference": "https://github.com/marduk191/comfyui-marnodes", + "files": [ + "https://github.com/marduk191/comfyui-marnodes" + ], + "install_type": "git-clone", + "description": "A node to set workflow settings." + }, + { + "author": "denfrost", + "title": "Den_ComfyUI_Workflows", + "id": "den", + "reference": "https://github.com/denfrost/Den_ComfyUI_Workflow", + "files": [ + "https://github.com/denfrost/Den_ComfyUI_Workflow" + ], + "install_type": "git-clone", + "description": "Custom nodes make easy Advanced Workflows. Focus on Image/Video and ControlNet efficiency and performances. Manipulation of Latent Space, Automatic pipeline with a bit efforts." + }, + { + "author": "seghier", + "title": "ComfyUI_LibreTranslate", + "reference": "https://github.com/seghier/ComfyUI_LibreTranslate", + "files": [ + "https://github.com/seghier/ComfyUI_LibreTranslate/raw/main/translate_node.py" + ], + "install_type": "copy", + "description": "Use LibreTranslation in ComfyUI [a/https://github.com/LibreTranslate/LibreTranslate](https://github.com/LibreTranslate/LibreTranslate)" + }, + { + "author": "Limbicnation", + "title": "ComfyUIDepthEstimation", + "reference": "https://github.com/Limbicnation/ComfyUIDepthEstimation", + "files": [ + "https://github.com/Limbicnation/ComfyUIDepthEstimation/raw/main/depth_estimation_node.py" + ], + "pip": ["transformers"], + "install_type": "copy", + "description": "A custom depth estimation node for ComfyUI using transformer models. It integrates depth estimation with automatic gamma correction, contrast adjustment, and edge detection, based on the [a/TransformDepth](https://github.com/Limbicnation/TransformDepth) repository." + }, + { + "author": "shadowcz007", + "title": "comfyui-sound-lab", + "id": "soundlab", + "reference": "https://github.com/shadowcz007/comfyui-sound-lab", + "files": [ + "https://github.com/shadowcz007/comfyui-sound-lab" + ], + "install_type": "git-clone", + "description": "Nodes:Music Gen, Audio Play, Stable Audio" + }, + { + "author": "DannyStone1999", + "title": "ComfyUI-Depth2Mask", + "reference": "https://github.com/DannyStone1999/ComfyUI-Depth2Mask", + "files": [ + "https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py" + ], + "install_type": "copy", + "description": "Nodes:Depth2Mask" + }, + { + "author": "smthemex", + "title": "ComfyUI_StableAudio_Open", + "id": "stable-audio-open-1.0", + "reference": "https://github.com/smthemex/ComfyUI_StableAudio_Open", + "files": [ + "https://github.com/smthemex/ComfyUI_StableAudio_Open" + ], + "install_type": "git-clone", + "description": "You can use stable-audio-open-1.0 in comfyUI" + }, + { + "author": "nuanarchy", + "title": "ComfyUI-NuA-FlashFace", + "id": "nua-flashface", + "reference": "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace", + "files": [ + "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/FlashFace: Human Image Personalization with High-fidelity Identity Preservation](https://github.com/ali-vilab/FlashFace)\nNOTE: You need to downalod models manually." + }, + { + "author": "FrankChieng", + "title": "ComfyUI_llm_easyanimiate", + "id": "llm-easyanimate", + "nodename_pattern": "^FrankChiengEasyAnimate", + "reference": "https://github.com/frankchieng/ComfyUI_llm_easyanimiate", + "files": [ + "https://github.com/frankchieng/ComfyUI_llm_easyanimiate" + ], + "install_type": "git-clone", + "description": "implementation easyanimate with llama3-8b-6bit instruction LLM generation prompt help" + }, + { + "author": "chakib-belgaid", + "title": "ComfyUI-autosize", + "id": "autosize", + "reference": "https://github.com/chakib-belgaid/ComfyUI-autosize", + "files": [ + "https://github.com/chakib-belgaid/ComfyUI-autosize" + ], + "install_type": "git-clone", + "description": "A ComfyUI utility plugin designed to optimize the latent space for generating high-quality results. It approximates the closest size model for better generation results." + }, + { + "author": "DataCTE", + "title": "Prompt Injection Node for ComfyUI", + "id": "prompt-injection", + "reference": "https://github.com/DataCTE/prompt_injection", + "files": [ + "https://github.com/DataCTE/prompt_injection" + ], + "install_type": "git-clone", + "description": "This custom node for ComfyUI allows you to inject specific prompts at specific blocks of the Stable Diffusion UNet, providing fine-grained control over the generated image. It is based on the concept that the content/subject understanding of the model is primarily contained within the MID0 and MID1 blocks, as demonstrated in the B-Lora (Content Style implicit separation) paper. Features.\nInject different prompts into specific UNet blocks Three different node variations for flexible workflow integration Customize the learning rate of specific blocks to focus on content, lighting, style, or other aspects Potential for developing a 'Mix of Experts' approach by swapping blocks on-the-fly based on prompt content" + }, + { + "author": "lks-ai", + "title": "ComfyUI Stable Audio Open 1.0 Sampler", + "id": "stableaudiosampler", + "reference": "https://github.com/lks-ai/ComfyUI-StableAudioSampler", + "files": [ + "https://github.com/lks-ai/ComfyUI-StableAudioSampler" + ], + "install_type": "git-clone", + "description": "Nodes: StableAudioSampler. Wraps the new Stable Audio Open Model in the sampler that dropped Jun 5th. See Github for Features" + }, + { + "author": "luandev", + "title": "ComfyUI CrewAI", + "id": "crewai", + "reference": "https://github.com/luandev/ComfyUI-CrewAI", + "files": [ + "https://github.com/luandev/ComfyUI-CrewAI" + ], + "install_type": "git-clone", + "description": "ComfyUI-CrewAI aims to integrate Crew AI's multi-agent collaboration framework into the ComfyUI environment. By combining the strengths of Crew AI's role-based, collaborative AI agent system with ComfyUI's intuitive interface, we will create a robust platform for managing and executing complex AI tasks seamlessly" + }, + { + "author": "Tool Of North america", + "title": "Easy automatic (square) image cropper using Yolo", + "id": "tooldigital", + "reference": "https://github.com/tooldigital/ComfyUI-Yolo-Cropper", + "files": [ + "https://github.com/tooldigital/ComfyUI-Yolo-Cropper" + ], + "install_type": "git-clone", + "description": "A very simple and easy to use node to automaticaaly create (square) image crops and masks using YoloV8. This can be very useful when using controlnet and ip adapters" + }, + { + "author": "11dogzi", + "title": "Comfyui-ergouzi-samplers", + "id": "ergouzi-samplers", + "reference": "https://github.com/11dogzi/Comfyui-ergouzi-samplers", + "files": [ + "https://github.com/11dogzi/Comfyui-ergouzi-samplers" + ], + "install_type": "git-clone", + "description": "Partial redraw sampler and variant seed sampler" + }, + { + "author": "prodogape", + "title": "ComfyUI-OmDet", + "id": "omdet", + "reference": "https://github.com/prodogape/ComfyUI-OmDet", + "files": [ + "https://github.com/prodogape/ComfyUI-OmDet" + ], + "install_type": "git-clone", + "description": "This node is mainly based on [a/OmDet](https://github.com/om-ai-lab/OmDet) for object detection, and it outputs related images, masks, and Labelme JSON information." + }, + { + "author": "risunobushi", + "title": "comfyUI_FrequencySeparation_RGB-HSV", + "id": "freq-sep", + "reference": "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV", + "files": [ + "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV" + ], + "install_type": "git-clone", + "description": "A collection of simple nodes for Frequency Separation / Frequency Recombine with RGB and HSV methods" + }, + { + "author": "chandlergis", + "title": "ComfyUI_EmojiOverlay", + "id": "emoji-overlay", + "reference": "https://github.com/chandlergis/ComfyUI_EmojiOverlay", + "files": [ + "https://github.com/chandlergis/ComfyUI_EmojiOverlay" + ], + "install_type": "git-clone", + "description": "Nodes:Image Emoji Overlay" + }, + { + "author": "JayLyu", + "title": "ComfyUI_BaiKong_Node", + "id": "baikong", + "reference": "https://github.com/JayLyu/ComfyUI_BaiKong_Node", + "files": [ + "https://github.com/JayLyu/ComfyUI_BaiKong_Node" + ], + "install_type": "git-clone", + "description": "Nodes:BK Img To Color, BK Color Selector" + }, + { + "author": "zohac", + "title": "ComfyUI_ZC_DrawShape", + "id": "drawshape", + "reference": "https://github.com/zohac/ComfyUI_ZC_DrawShape", + "files": [ + "https://github.com/zohac/ComfyUI_ZC_DrawShape" + ], + "install_type": "git-clone", + "description": "Nodes:ZC DrawShape Node" + }, + { + "author": "ThereforeGames", + "title": "ComfyUI-Unprompted", + "id": "unprompted", + "reference": "https://github.com/ThereforeGames/ComfyUI-Unprompted", + "files": [ + "https://github.com/ThereforeGames/ComfyUI-Unprompted" + ], + "install_type": "git-clone", + "description": "This is a ComfyUI node that processes your input text with the [a/Unprompted templating language](https://github.com/ThereforeGames/unprompted). Early alpha release.\n" + }, + { + "author": "Scorpinaus", + "title": "Loaders for Diffusers-format checkpoints", + "id": "diffusersloader", + "reference": "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader", + "files": [ + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader" + ], + "install_type": "git-clone", + "description": "This node pack allows loading of CLIP, MODEL, VAE aspects for both SD1.5 and SDXL checkpoints that is converted to diffusers format." + }, + { + "author": "chakib-belgaid", + "title": "ComfyUI Style Plugin", + "id": "style-plugin", + "reference": "https://github.com/chakib-belgaid/Comfyui_Prompt_styler", + "files": [ + "https://github.com/chakib-belgaid/Comfyui_Prompt_styler" + ], + "install_type": "git-clone", + "description": "This is a simple plugin for ComfyUI that allows you to import A1111 CSV styles into ComfyUI prompts." + }, + { + "author": "tiankuan93", + "title": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation", + "id": "v-express", + "reference": "https://github.com/tiankuan93/ComfyUI-V-Express", + "files": [ + "https://github.com/tiankuan93/ComfyUI-V-Express" + ], + "install_type": "git-clone", + "description": "[Original] In the field of portrait video generation, the use of single images to generate portrait videos has become increasingly prevalent. A common approach involves leveraging generative models to enhance adapters for controlled generation. However, control signals can vary in strength, including text, audio, image reference, pose, depth map, etc. Among these, weaker conditions often struggle to be effective due to interference from stronger conditions, posing a challenge in balancing these conditions. In our work on portrait video generation, we identified audio signals as particularly weak, often overshadowed by stronger signals such as pose and original image. However, direct training with weak signals often leads to difficulties in convergence. To address this, we propose V-Express, a simple method that balances different control signals through a series of progressive drop operations. Our method gradually enables effective control by weak conditions, thereby achieving generation capabilities that simultaneously take into account pose, input image, and audio.\nNOTE: You need to downdload [a/model_ckpts](https://huggingface.co/tk93/V-Express/tree/main) manually." + }, + { + "author": "CMonk", + "title": "Stable Projectorz Bridge", + "id": "projectorz", + "reference": "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge", + "files": [ + "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge" + ], + "install_type": "git-clone", + "description": "This custom nodes enables Stable Projectorz to work with ComfyUI Directly." + }, + { + "author": "comfyanonymous", + "title": "TensorRT Node for ComfyUI", + "id": "tensorrt", + "reference": "https://github.com/comfyanonymous/ComfyUI_TensorRT", + "files": [ + "https://github.com/comfyanonymous/ComfyUI_TensorRT" + ], + "install_type": "git-clone", + "description": "This node enables the best performance on NVIDIA RTX™ Graphics Cards (GPUs) for Stable Diffusion by leveraging NVIDIA TensorRT." + }, + { + "author": "fexploit", + "title": "ComfyUI-Classifier", + "id": "classifier", + "reference": "https://github.com/fexploit/ComfyUI-Classifier", + "files": [ + "https://github.com/fexploit/ComfyUI-Classifier" + ], + "install_type": "git-clone", + "description": "ComfyUI-Classifier is a custom node for ComfyUI that uses a zero-shot classification model to classify text inputs based on a set of candidate labels. This node leverages the power of Hugging Face Transformers to provide accurate and flexible text classification." + }, + { + "author": "humgate", + "title": "simplecomfy", + "reference": "https://github.com/humgate/simplecomfy", + "files": [ + "https://github.com/humgate/simplecomfy" + ], + "install_type": "git-clone", + "description": "Simple JS application based on ComfyUI which takes prompt and style picture from user and runs hardcoded workflow inference returning generated image to user." + }, + { + "author": "hben35096", + "title": "ComfyUI-ToolBox", + "id": "hben-toolbox", + "reference": "https://github.com/hben35096/ComfyUI-ToolBox", + "files": [ + "https://github.com/hben35096/ComfyUI-ToolBox" + ], + "install_type": "git-clone", + "description": "Nodes:commonly_node." + }, + { + "author": "vanche1212", + "title": "ZMG PLUGIN", + "id": "zmg", + "reference": "https://github.com/vanche1212/ComfyUI-ZMG-Nodes", + "files": [ + "https://github.com/vanche1212/ComfyUI-ZMG-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:ApiRequestNode, LoadVideoNode, JsonParserNode, OllamaRequestNode, OldPhotoColorizationNode." + }, + { + "author": "daxcay", + "title": "ComfyUI-NODEJS", + "reference": "https://github.com/daxcay/ComfyUI-NODEJS", + "files": [ + "https://github.com/daxcay/ComfyUI-NODEJS" + ], + "install_type": "git-clone", + "description": "This node allows the execution of Node.js application within ComfyUI by leveraging the ComfyUI-NODEJS, which starts alongside ComfyUI and facilitates the installation of Node.js. The integration enables Python subprocesses to execute Node.js scripts." + }, { "author": "Smirnov75", "title": "ComfyUI-mxToolkit", @@ -242,500 +716,6 @@ ], "install_type": "git-clone", "description": "Nodes:Private ImageCPostprocessor" - }, - { - "author": "SozeInc", - "title": "ComfyUI-Mobile", - "id": "comfyui-mobile", - "reference": "https://github.com/SozeInc/ComfyUI-Mobile", - "files": [ - "https://github.com/SozeInc/ComfyUI-Mobile" - ], - "install_type": "git-clone", - "description": "Nodes: Ultimate Concat (Mobile), Send Notification (Mobile), Settings Launcher (Mobile), Settings Launcher Outputs (Mobile)" - }, - { - "author": "AIFSH", - "title": "ComfyUI_V-Express", - "id": "v-express", - "reference": "https://github.com/AIFSH/ComfyUI_V-Express", - "files": [ - "https://github.com/AIFSH/ComfyUI_V-Express" - ], - "install_type": "git-clone", - "description": "the comfyui custom node of [a/V-Express](https://github.com/tencent-ailab/V-Express) to make audio driven videos!" - }, - { - "author": "AonekoSS", - "title": "ComfyUI-LoRA-Tuner", - "id": "lora-tuner", - "reference": "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner", - "files": [ - "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner" - ], - "install_type": "git-clone", - "description": "Nodes: LoRA-Tuner. For using multiple LoRA easily." - }, - { - "author": "nirex0", - "title": "ComfyUI_pytorch_openpose", - "id": "pytorch-openpose", - "reference": "https://github.com/nirex0/ComfyUI_pytorch_openpose", - "files": [ - "https://github.com/nirex0/ComfyUI_pytorch_openpose" - ], - "install_type": "git-clone", - "description": "All Credits go to the original Repo: [a/Hzzone/pytorch-openpose](https://github.com/Hzzone/pytorch-openpose)." - }, - { - "author": "Mason-McGough", - "title": "Mosaica", - "id": "mosaica", - "reference": "https://github.com/Mason-McGough/ComfyUI-Mosaica", - "files": [ - "https://github.com/Mason-McGough/ComfyUI-Mosaica" - ], - "install_type": "git-clone", - "description": "Create colorful mosaic images in ComfyUI by computing label images and applying lookup tables." - }, - { - "author": "moyi7712", - "title": "ComfyUI_Seamless_Patten", - "id": "seamless-pattern", - "reference": "https://github.com/moyi7712/ComfyUI_Seamless_Patten", - "files": [ - "https://github.com/moyi7712/ComfyUI_Seamless_Patten" - ], - "install_type": "git-clone", - "description": "It make any text2image create seamless patten" - }, - { - "author": "discus0434", - "title": "ComfyUI Aesthetic Predictor V2.5", - "id": "caching-embeddings", - "reference": "https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5", - "files": [ - "https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5" - ], - "install_type": "git-clone", - "description": "Simple ComfyUI node that predicts the score of an aesthetic image with SigLIP-based predictor." - }, - { - "author": "Ron-Digital", - "title": "ComfyUI-SceneGenerator", - "id": "scenegenerator", - "reference": "https://github.com/Ron-Digital/ComfyUI-SceneGenerator", - "files": [ - "https://github.com/Ron-Digital/ComfyUI-SceneGenerator" - ], - "install_type": "git-clone", - "description": "ComfyUI-SceneGenerator is a ComfyUI plugin used to generate scene preview photos from JSON files. This plugin creates scenes based on the provided JSON configuration and produces two different image outputs: one containing only the products and the other containing both the products and the props." - }, - { - "author": "spacepxl", - "title": "ComfyUI-StyleGan", - "id": "stylegan", - "reference": "https://github.com/spacepxl/ComfyUI-StyleGan", - "files": [ - "https://github.com/spacepxl/ComfyUI-StyleGan" - ], - "install_type": "git-clone", - "description": "Basic support for StyleGAN2 and StyleGAN3 models." - }, - { - "author": "Mason-McGough", - "title": "🎨 ComfyUI-Mosaica", - "id": "mosaica", - "reference": "https://github.com/Mason-McGough/ComfyUI-Mosaica", - "files": [ - "https://github.com/Mason-McGough/ComfyUI-Mosaica" - ], - "install_type": "git-clone", - "description": "Create colorful mosaic images in ComfyUI by computing label images and applying lookup tables." - }, - { - "author": "larsupb", - "title": "LoRA Power-Merger ComfyUI", - "id": "lora-powermerger", - "reference": "https://github.com/larsupb/LoRA-Merger-ComfyUI", - "files": [ - "https://github.com/larsupb/LoRA-Merger-ComfyUI" - ], - "install_type": "git-clone", - "description": "An extension for merging LoRAs. Offers a wide range of LoRA merge techniques (including dare) and XY plots. XY plots require efficiency nodes." - }, - { - "author": "alessandrozonta", - "title": "Save Layers Node for ComfyUI", - "id": "layers", - "reference": "https://github.com/alessandrozonta/ComfyUI-Layers", - "files": [ - "https://github.com/alessandrozonta/ComfyUI-Layers" - ], - "install_type": "git-clone", - "description": "This custom node for ComfyUI allows you to create layers of an image based on input masks and save them into a PSD file." - }, - { - "author": "githubYiheng", - "title": "comfyui_meanshift_filter", - "id": "meanshift-filter", - "reference": "https://github.com/githubYiheng/comfyui_meanshift_filter", - "files": [ - "https://github.com/githubYiheng/comfyui_meanshift_filter" - ], - "install_type": "git-clone", - "description": "Nodes:Apply Meanshift Filter" - }, - { - "author": "cuongloveit", - "title": "comfy_http_request", - "reference": "https://github.com/cuongloveit/comfy_http_request", - "files": [ - "https://github.com/cuongloveit/comfy_http_request" - ], - "install_type": "git-clone", - "description": "Nodes:Send Http Request. You can use this node to save full size images through the websocket." - }, - { - "author": "SayanoAI", - "title": "Comfy-RVC", - "id": "rvc", - "reference": "https://github.com/SayanoAI/Comfy-RVC", - "files": [ - "https://github.com/SayanoAI/Comfy-RVC" - ], - "install_type": "git-clone", - "description": "ComfyUI custom nodes for RVC related inference and image generation" - }, - { - "author": "nirbhay-faaya", - "title": "ImgProcessing_ComfyUI", - "id": "imgprocessing", - "reference": "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI", - "files": [ - "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI" - ], - "install_type": "git-clone", - "description": "Custom Image processing ComfyUI Nodes" - }, - { - "author": "smthemex", - "title": "ComfyUI_StoryDiffusion", - "id": "StoryDiffusion", - "reference": "https://github.com/smthemex/ComfyUI_StoryDiffusion", - "files": [ - "https://github.com/smthemex/ComfyUI_StoryDiffusion" - ], - "install_type": "git-clone", - "description": "A StoryDiffusion node for ComfyUI." - }, - { - "author": "christian-byrne", - "title": "Node - Size Matcher", - "id": "sizematcher", - "reference": "https://github.com/christian-byrne/size-match-compositing-nodes", - "files": [ - "https://github.com/christian-byrne/size-match-compositing-nodes" - ], - "install_type": "git-clone", - "description": "Takes two images and matches their sizes using various methods, detailed below." - }, - { - "author": "lks-ai", - "title": "ComfyUI AnyNode: Any Node you ask for", - "id": "anynode", - "reference": "https://github.com/lks-ai/anynode", - "files": [ - "https://github.com/lks-ai/anynode" - ], - "install_type": "git-clone", - "description": "Nodes: AnyNode. Nodes that can be anything you ask. Auto-Generate functional nodes using LLMs. Create impossible workflows. API Compatibility: (OpenAI, LocalLLMs, Gemini)." - }, - { - "author": "Thomas Ward", - "title": "TW-CUI-Util", - "id": "tw-cui-util", - "reference": "https://github.com/TW-CUI/TW-CUI-Util", - "files": [ - "https://github.com/TW-CUI/TW-CUI-Util" - ], - "install_type": "git-clone", - "description": "A collection of custom nodes to help with saving images, providing generation parameters, static literal nodes, and other useful nodes." - }, - { - "author": "fexploit", - "title": "ComfyUI-AutoLabel", - "id": "autolabel", - "reference": "https://github.com/fexploit/ComfyUI-AutoLabel", - "files": [ - "https://github.com/fexploit/ComfyUI-AutoLabel" - ], - "install_type": "git-clone", - "description": "ComfyUI-AutoLabel is a custom node for ComfyUI that uses BLIP (Bootstrapping Language-Image Pre-training) to generate detailed descriptions of the main object in an image. This node leverages the power of BLIP to provide accurate and context-aware captions for images." - }, - { - "author": "christian-byrne", - "title": "img2colors-comfyui-node", - "id": "img2colors-nodes", - "reference": "https://github.com/christian-byrne/img2colors-comfyui-node", - "files": [ - "https://github.com/christian-byrne/img2colors-comfyui-node" - ], - "install_type": "git-clone", - "description": "Nodes:Img2Color - Color Palette Extractor" - }, - { - "author": "xuhongming251", - "title": "ComfyUI-MuseTalkUtils", - "id": "musetalk-utils", - "reference": "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils", - "files": [ - "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils" - ], - "install_type": "git-clone", - "description": "MuseTalk ComfyUI Preprocess and Postprocess Nodes" - }, - { - "author": "xuhongming251", - "title": "ComfyUI-GPEN", - "id": "gpen", - "reference": "https://github.com/xuhongming251/ComfyUI-GPEN", - "files": [ - "https://github.com/xuhongming251/ComfyUI-GPEN" - ], - "install_type": "git-clone", - "description": "Nodes:FaceEnhancement. Based on modelscope pipeline." - }, - { - "author": "exdysa", - "title": "comfyui-selector", - "reference": "https://github.com/exdysa/comfyui-selector", - "files": [ - "https://github.com/exdysa/comfyui-selector/raw/main/selector.py" - ], - "install_type": "copy", - "description": "Nodes:Selector. Quick and dirty parameter generator node for ComfyUI." - }, - { - "author": "barckley75", - "title": "comfyUI_DaVinciResolve", - "reference": "https://github.com/barckley75/comfyUI_DaVinciResolve", - "files": [ - "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/node_text_to_speech.py", - "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/nodes_phy_3_contitioning.py", - "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/save_audio_to_davinci.py", - "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/save_image_to_davinci.py" - ], - "install_type": "copy", - "description": "Nodes:TextToSpeech, phy_3_conditioning, SaveAudioToDaVinci, SaveImageToDaVinci.\nNOTE:In order to use DaVinci node you must have DaVinci Resolve Studio connected to the API. For more information check the help seciton in DaVinci Resolve Studio HELP>DOCUMENTATION>DEVELOPER. It will open a folder, search for scripting and the for README.txt file, the API documentation." - }, - { - "author": "archifancy", - "title": "Image-vector-for-ComfyUI", - "reference": "https://github.com/archifancy/Image-vector-for-ComfyUI", - "files": [ - "https://github.com/archifancy/Image-vector-for-ComfyUI/raw/main/AIvector.py" - ], - "install_type": "copy", - "description": "Nodes:AIvector. A wrapped comfyui node for converting pixels to vectors using Vtracer. Check it out here: [a/https://github.com/visioncortex/vtracer](https://github.com/visioncortex/vtracer)." - }, - { - "author": "muzi12888", - "title": "m9-prompts-comfyui", - "id": "m9-prompts", - "reference": "https://github.com/MarcusNyne/m9-prompts-comfyui", - "files": [ - "https://github.com/MarcusNyne/m9-prompts-comfyui" - ], - "install_type": "git-clone", - "description": "Two custom nodes are included for modifying a prompt to create prompt variations.\nScramblePrompts [m9]: Reorder prompts, remove prompts, modify weights\nTweakWeights [m9]: Modify the weights of prompts matching keywords" - }, - { - "author": "SaltAI", - "title": "SaltAI Language Toolkit", - "id": "saltai-langtool", - "reference": "https://github.com/get-salt-AI/SaltAI_Language_Toolkit", - "files": [ - "https://github.com/get-salt-AI/SaltAI_Language_Toolkit" - ], - "install_type": "git-clone", - "description": "The project integrates the Retrieval Augmented Generation (RAG) tool [a/Llama-Index](https://www.llamaindex.ai/), [a/Microsoft's AutoGen](https://microsoft.github.io/autogen/), and [a/LlaVA-Next](https://github.com/LLaVA-VL/LLaVA-NeXT) with ComfyUI's adaptable node interface, enhancing the functionality and user experience of the platform." - }, - { - "author": "muzi12888", - "title": "PoseKeypoint Mask", - "id": "posekeypoint-mask", - "reference": "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask", - "files": [ - "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask" - ], - "install_type": "git-clone", - "description": "Convert PoseKeypoint to mask, please refer to the example workflow for usage instructions." - }, - { - "author": "if-ai", - "title": "ComfyUI-IF_AI_HFDownloaderNode", - "id": "if-ai-hfdownloader", - "reference": "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode", - "files": [ - "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode" - ], - "install_type": "git-clone", - "description": "Talking avatars Heads for the IF_AI tools integrates dreamtalk in ComfyUI" - }, - { - "author": "iFREEGROUP", - "title": "comfyui-undistort", - "id": "undistort", - "reference": "https://github.com/iFREEGROUP/comfyui-undistort", - "files": [ - "https://github.com/iFREEGROUP/comfyui-undistort" - ], - "install_type": "git-clone", - "description": "Node:Load Checkerboard Images for Calibrate Camera, Matrix and distortion coefficient to text, Undistort" - }, - { - "author": "Auttasak-L", - "title": "ComfyUI-ImageCropper", - "id": "imagecropper", - "reference": "https://github.com/Auttasak-L/ComfyUI-ImageCropper", - "files": [ - "https://github.com/Auttasak-L/ComfyUI-ImageCropper" - ], - "install_type": "git-clone", - "description": "Nodes:Image cropping tool" - }, - { - "author": "AIFSH", - "title": "ComfyUI-Live2DViewer", - "reference": "https://github.com/AIFSH/ComfyUI-Live2DViewer", - "id": "live2dviewer", - "files": [ - "https://github.com/AIFSH/ComfyUI-Live2DViewer" - ], - "install_type": "git-clone", - "description": "a comfyui node for viewing Live2D model" - }, - { - "author": "daniabib", - "title": "ComfyUI ProPainter Nodes", - "id": "propainter", - "reference": "https://github.com/daniabib/ComfyUI_ProPainter_Nodes", - "files": [ - "https://github.com/daniabib/ComfyUI_ProPainter_Nodes" - ], - "install_type": "git-clone", - "description": "ComfyUI custom node implementation of [a/ProPainter](https://github.com/sczhou/ProPainter) framework for video inpainting." - }, - { - "author": "fexploit", - "title": "ComfyUI-AutoTrimBG", - "id": "autotrimbg", - "reference": "https://github.com/fexploit/ComfyUI-AutoTrimBG", - "files": [ - "https://github.com/fexploit/ComfyUI-AutoTrimBG" - ], - "install_type": "git-clone", - "description": "ComfyUI-AutoCropBgTrim is a powerful tool designed to automatically clean up the background of your images. This tool trims unnecessary spaces and pixels, leaving only the main subject of the image. It generates both a mask and an image output, making it easy to focus on the essential elements. Perfect for enhancing your photos and preparing them for professional use." - }, - { - "author": "StartHua", - "title": "ComfyUI_PCDMs", - "id": "pcdms", - "reference": "https://github.com/StartHua/ComfyUI_PCDMs", - "files": [ - "https://github.com/StartHua/ComfyUI_PCDMs" - ], - "install_type": "git-clone", - "description": "Original project: [a/link](https://github.com/tencent-ailab/PCDMs)\nBased on testing, the author's original images work very well, but using my own images generally requires some luck!" - }, - { - "author": "linshier", - "title": "comfyui-remote-tools", - "id": "remote-tools", - "reference": "https://github.com/linshier/comfyui-remote-tools", - "files": [ - "https://github.com/linshier/comfyui-remote-tools" - ], - "install_type": "git-clone", - "description": "Node:SendBase64ToRemote. To connect to another ComfyUI server." - }, - { - "author": "Fantaxico", - "title": "ComfyUI-GCP-Storage", - "id": "gcp-storage", - "reference": "https://github.com/Fantaxico/ComfyUI-GCP-Storage", - "files": [ - "https://github.com/Fantaxico/ComfyUI-GCP-Storage" - ], - "install_type": "git-clone", - "description": "Node:GCP Storage Node. Support google-cloud-storage." - }, - { - "author": "storyicon", - "title": "ComfyUI MuseV Evolved", - "id": "musev-evolved", - "reference": "https://github.com/storyicon/comfyui_musev_evolved", - "files": [ - "https://github.com/storyicon/comfyui_musev_evolved" - ], - "install_type": "git-clone", - "description": "Nodes:MuseVImg2Vid (comfyui_musev_evolved)\nNOTE: Download [a/MuseV](https://huggingface.co/TMElyralab/MuseV) to ComfyUI/models/diffusers" - }, - { - "author": "smthemex", - "title": "ComfyUI_CustomNet", - "id": "customnet", - "reference": "https://github.com/smthemex/ComfyUI_CustomNet", - "files": [ - "https://github.com/smthemex/ComfyUI_CustomNet" - ], - "install_type": "git-clone", - "description": "This node allows you to use customnet." - }, - { - "author": "githubYiheng", - "title": "comfyui_median_filter", - "id": "median-filter", - "reference": "https://github.com/githubYiheng/comfyui_median_filter", - "files": [ - "https://github.com/githubYiheng/comfyui_median_filter" - ], - "install_type": "git-clone", - "description": "Nodes:Apply Median Filter" - }, - { - "author": "githubYiheng", - "title": "ComfyUI_Change_IMAGE_BOREDER", - "id": "change-image-border", - "reference": "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER", - "files": [ - "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER" - ], - "install_type": "git-clone", - "description": "Nodes:Change Image Border" - }, - { - "author": "ai-liam", - "title": "LiamUtil", - "id": "liam-util", - "reference": "https://github.com/ai-liam/comfyui-liam", - "files": [ - "https://github.com/ai-liam/comfyui-liam" - ], - "install_type": "git-clone", - "description": "Nodes: LiamLibLoadImage, LiamLibImageToGray, LiamLibSaveImg, LiamLibFillImage, PreviewReliefImage, GetBetterDepthImage, LiamLibSaveText" - }, - { - "author": "Isaac Emesowum", - "title": "Isaac's Nodes", - "id": "isaac", - "reference": "https://github.com/iemesowum/ComfyUI_IsaacNodes", - "files": [ - "https://github.com/iemesowum/ComfyUI_IsaacNodes" - ], - "install_type": "git-clone", - "description": "This extension offers automatic drums extraction from audio files, as well as a few helper nodes to support my audio synchronization AnimateDiff workflows." } ] } diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index 731fef68..be26b9fb 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -91,6 +91,16 @@ "title_aux": "Comfyui-ergouzi-Nodes" } ], + "https://github.com/11dogzi/Comfyui-ergouzi-samplers": [ + [ + "EGBYZZCYQ", + "EGCYQJB", + "EGCYQJBCJ" + ], + { + "title_aux": "Comfyui-ergouzi-samplers" + } + ], "https://github.com/1mckw/Comfyui-Gelbooru": [ [ "Gelbooru (ID)", @@ -127,9 +137,12 @@ "SAMIN String Attribute Selector", "SANMIN Adapt Coordinates", "SANMIN AdjustTransparency", + "SANMIN BlurMaskArea", "SANMIN ChineseToCharacter", "SANMIN ClothingWildcards", "SANMIN ConvertToEnglish", + "SANMIN EditWildcards", + "SANMIN Float", "SANMIN LoadPathImagesPreview", "SANMIN SCALE AND FILL BLACK", "SANMIN SanmiSaveImageToLocal", @@ -399,6 +412,7 @@ [ "> Clear Text", "> Float to Int", + "> Get Mean Color", "> Int", "> Int to Text", "> Light Source Mask", @@ -407,6 +421,8 @@ "> Mask Curves", "> NIKSampler", "> Noise From Image", + "> Normal Map Lighting", + "> RGB Color", "> Resolution by Aspect Ratio", "> Rotate Image", "> Save Image", @@ -498,10 +514,19 @@ "https://github.com/Acly/comfyui-tooling-nodes": [ [ "ETN_ApplyMaskToImage", + "ETN_AttentionMask", + "ETN_BackgroundRegion", "ETN_CropImage", + "ETN_DefineRegion", + "ETN_ExtractImageTile", + "ETN_ExtractMaskTile", + "ETN_GenerateTileMask", + "ETN_ListRegionMasks", "ETN_LoadImageBase64", "ETN_LoadMaskBase64", - "ETN_SendImageWebSocket" + "ETN_MergeImageTile", + "ETN_SendImageWebSocket", + "ETN_TileLayout" ], { "title_aux": "ComfyUI Nodes for External Tooling" @@ -576,17 +601,6 @@ "title_aux": "ComfyUI-SimpleCounter" } ], - "https://github.com/AppleBotzz/ComfyUI_LLMVISION": [ - [ - "CLAUDE_CHAT", - "CLAUDE_VISION", - "GPT4_CHAT", - "GPT4_VISION" - ], - { - "title_aux": "ComfyUI_LLMVISION" - } - ], "https://github.com/ArcherFMY/Diffusion360_ComfyUI": [ [ "Diffusion360LoaderImage2Pano", @@ -769,6 +783,19 @@ "title_aux": "bsz-cui-extras" } ], + "https://github.com/BenNarum/SigmaWaveFormNode": [ + [ + "AttenuatorNode", + "FourierFilterNode", + "PhaseLockedLoopNode", + "SigmaWaveFormNode", + "SigmaWaveFormNodeAdvanced", + "SigmaWaveFormNodeSimple" + ], + { + "title_aux": "SigmaWaveFormNodes" + } + ], "https://github.com/BennyKok/comfyui-deploy": [ [ "ComfyDeployWebscoketImageInput", @@ -1111,6 +1138,14 @@ "title_aux": "Comfy Couple" } ], + "https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py": [ + [ + "Depth2Mask" + ], + { + "title_aux": "ComfyUI-Depth2Mask" + } + ], "https://github.com/DarKDinDoN/comfyui-checkpoint-automatic-config": [ [ "CheckpointAutomaticConfig", @@ -1120,6 +1155,16 @@ "title_aux": "ComfyUI Checkpoint Automatic Config" } ], + "https://github.com/DataCTE/prompt_injection": [ + [ + "AdvancedPromptInjection", + "PromptInjection", + "SimplePromptInjection" + ], + { + "title_aux": "Prompt Injection Node for ComfyUI" + } + ], "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes": [ [], { @@ -1253,12 +1298,7 @@ "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings": [ [ "CLIP Temperature", - "Dynamic scale as float", - "Unet Temperature SD1", - "Unet Temperature SD1 per layer", - "Unet Temperature SDXL", - "Unet Temperature SDXL per layer", - "Unet Temperature any model" + "Unet Temperature" ], { "title_aux": "Stable-Diffusion-temperature-settings" @@ -1287,6 +1327,7 @@ "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler": [ [ "Aligned Scheduler", + "Gaussian Tail Scheduler", "Get sigmas as float", "Graph sigmas", "Manual scheduler", @@ -1753,6 +1794,14 @@ "title_aux": "ComfyUI-GTSuya-Nodes" } ], + "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes": [ + [ + "SD3LatentSelectRes" + ], + { + "title_aux": "ComfyUI-SD3LatentSelectRes" + } + ], "https://github.com/GentlemanHu/ComfyUI-SunoAI": [ [ "GentlemanHu_SunoAI", @@ -1790,6 +1839,8 @@ ], "https://github.com/GraftingRayman/ComfyUI_GraftingRayman": [ [ + "GR Flip Tile Random Inverted", + "GR Flip Tile Random Red Ring", "GR Image Details Displayer", "GR Image Details Saver", "GR Image Resize", @@ -1919,13 +1970,16 @@ "IG Cross Fade Images", "IG Explorer", "IG Float", + "IG Float List", "IG Folder", "IG Int", + "IG Interpolate", "IG Load Image", "IG Load Images", "IG Multiply", "IG Path Join", "IG String", + "IG String List", "IG ZFill" ], { @@ -2108,6 +2162,7 @@ "JNodes_BooleanSelectorWithString", "JNodes_BreakMediaInfo", "JNodes_CheckpointSelectorWithString", + "JNodes_CreateStereoscopicImageFromDepth", "JNodes_GetOutputDirectory", "JNodes_GetParameterFromList", "JNodes_GetParameterGlobal", @@ -2149,6 +2204,15 @@ "title_aux": "ComfyUI-JNodes" } ], + "https://github.com/JayLyu/ComfyUI_BaiKong_Node": [ + [ + "BK_ColorSelector", + "BK_Img2Color" + ], + { + "title_aux": "ComfyUI_BaiKong_Node" + } + ], "https://github.com/JcandZero/ComfyUI_GLM4Node": [ [ "GLM3_turbo_CHAT", @@ -2692,6 +2756,7 @@ "MaraScottPasteInpaintingByMask_v1", "MaraScottSetInpaintingByMask_v1", "MaraScottUpscalerRefinerNode_v2", + "MaraScottUpscalerRefinerNode_v3", "MaraScott_Kijai_TokenCounter_v1" ], { @@ -2729,7 +2794,7 @@ "ShowText" ], { - "title_aux": "ComfyUI_Text" + "title_aux": "ComfyUI-Text" } ], "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": [ @@ -2793,6 +2858,7 @@ "HueShift", "ImageDimensions", "ImageResizeLong", + "ImageZigzag", "IndoorBackgrounds", "IndoorDir", "IntEvaluate", @@ -2822,6 +2888,7 @@ "SearchReplace", "SimplePrompts", "SpecificStylesDir", + "SplitImages", "StringJoin", "TimeStamp", "TricolorComposition", @@ -3349,6 +3416,7 @@ [ "AudioBatchValueNode", "AudioTranscriptionNode", + "DownloadAudio", "ImageRepeatInterleavedNode", "LatentRepeatInterleavedNode", "LoadAudio", @@ -3377,6 +3445,37 @@ "title_aux": "SComfyUI-Keyframe" } ], + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": [ + [ + "CombinedDiffusersLoader", + "CombinedDiffusersSD15Loader", + "CombinedDiffusersSDXLLoader", + "DiffusersClipLoader", + "DiffusersUNETLoader", + "DiffusersVAELoader", + "SD15CLIPLoader", + "SD15UNETLoader", + "SD15VAELoader", + "SDXLCLIPLoader", + "SDXLUNETLoader", + "SDXLVAELoader" + ], + { + "title_aux": "Loaders for Diffusers-format checkpoints" + } + ], + "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode": [ + [ + "OllamaCLIPTextEncode" + ], + { + "author": "Michael Standen", + "description": "Use AI to generate prompts and perform CLIP text encoding", + "nickname": "Ollama Prompt Encode", + "title": "Ollama Prompt Encode", + "title_aux": "Ollama Prompt Encode" + } + ], "https://github.com/SeaArtLab/ComfyUI-Long-CLIP": [ [ "SeaArtLongClip", @@ -3659,17 +3758,6 @@ "title_aux": "Eagleshadow Custom Nodes" } ], - "https://github.com/Shinsplat/ComfyUI-Shinsplat": [ - [ - "Clip Text Encode (Shinsplat)", - "Clip Text Encode SDXL (Shinsplat)", - "Lora Loader (Shinsplat)", - "Sum Wrap (Shinsplat)" - ], - { - "title_aux": "ComfyUI-Shinsplat" - } - ], "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": [ [ "SVDRsizer" @@ -3794,6 +3882,7 @@ "Stability Creative Upscale", "Stability Erase", "Stability Image Core", + "Stability Image Ultra", "Stability Inpainting", "Stability Outpainting", "Stability Remove Background", @@ -4193,11 +4282,13 @@ "tri3d-adjust-neck", "tri3d-atr-parse", "tri3d-atr-parse-batch", + "tri3d-clear-memory", "tri3d-clipdrop-bgremove-api", "tri3d-clipdrop-bgreplace-api", "tri3d-composite-image-splitter", "tri3d-dwpose", "tri3d-extract-hand", + "tri3d-extract-masks-batch", "tri3d-extract-parts-batch", "tri3d-extract-parts-batch2", "tri3d-extract-parts-mask-batch", @@ -4380,6 +4471,14 @@ "title_aux": "Anyline" } ], + "https://github.com/ThereforeGames/ComfyUI-Unprompted": [ + [ + "Unprompted" + ], + { + "title_aux": "ComfyUI-Unprompted" + } + ], "https://github.com/TinyTerra/ComfyUI_tinyterraNodes": [ [ "ttN KSampler_v2", @@ -5075,6 +5174,16 @@ "title_aux": "ComfyUI-Q-Align" } ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2": [ + [ + "Qwen2_Chat_Zho", + "Qwen2_ModelLoader_Zho", + "Qwen2_Zho" + ], + { + "title_aux": "ComfyUI-Qwen-2" + } + ], "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": [ [ "QWenVL_API_S_Multi_Zho", @@ -5307,13 +5416,17 @@ ], "https://github.com/ai-liam/comfyui-liam": [ [ + "AiStoreAzureGPTLiam", "GetBetterDepthImage", "LiamLibFillImage", "LiamLibImageToGray", "LiamLibLoadImage", "LiamLibSaveImg", "LiamLibSaveText", - "PreviewReliefImage" + "OllamaApiTNodeLiam", + "PreviewReliefImage", + "SpeechRecognitionLiam", + "SpeechSynthesisLiam" ], { "title_aux": "LiamUtil" @@ -5359,6 +5472,15 @@ "title_aux": "Save Layers Node for ComfyUI" } ], + "https://github.com/alessandrozonta/ComfyUI-OpenPose": [ + [ + "OpenPose - Get poses" + ], + { + "author": "joe", + "title_aux": "OpenPose Node" + } + ], "https://github.com/alexopus/ComfyUI-Image-Saver": [ [ "Cfg Literal (Image Saver)", @@ -5617,7 +5739,7 @@ ], "https://github.com/audioscavenger/ComfyUI-Thumbnails": [ [ - "ComfyUIThumbnails" + "LoadImageThumbnails" ], { "author": "AudioscavengeR", @@ -5667,7 +5789,10 @@ "Bedrock - Claude", "Bedrock - Claude Multimodal", "Bedrock - SDXL", - "Bedrock - Titan Image", + "Bedrock - Titan Inpainting", + "Bedrock - Titan Outpainting", + "Bedrock - Titan Text to Image", + "Bedrock - Titan Variation", "Image From S3", "Image From URL", "Image To S3", @@ -5761,6 +5886,8 @@ "Mikey Sampler Base Only Advanced", "Mikey Sampler Tiled", "Mikey Sampler Tiled Base Only", + "MikeyLatentTileSampler", + "MikeyLatentTileSamplerCustom", "MikeySamplerTiledAdvanced", "MikeySamplerTiledAdvancedBaseOnly", "MosaicExpandImage", @@ -5790,6 +5917,7 @@ "TextCombinations", "TextCombinations3", "TextConcat", + "TextPadderMikey", "TextPreserve", "Upscale Tile Calculator", "Wildcard Processor", @@ -6083,6 +6211,7 @@ ], "https://github.com/bobmagicii/comfykit-custom-nodes": [ [ + "LoraThree", "LoraWithMeta", "TypecasterImage", "TypecasterLatent" @@ -6269,6 +6398,23 @@ "title_aux": "ComfyUI LLaVA Captioner" } ], + "https://github.com/chakib-belgaid/ComfyUI-autosize": [ + [ + "CustomAutoSize", + "SDXLAutoSize" + ], + { + "title_aux": "ComfyUI-autosize" + } + ], + "https://github.com/chakib-belgaid/Comfyui_Prompt_styler": [ + [ + "Prompt_Styler" + ], + { + "title_aux": "ComfyUI Style Plugin" + } + ], "https://github.com/chandlergis/ComfyUI-IMG_Query": [ [ "ImageRequestNode" @@ -6277,6 +6423,14 @@ "title_aux": "ComfyUI-IMG_Query" } ], + "https://github.com/chandlergis/ComfyUI_EmojiOverlay": [ + [ + "Image Emoji Overlay" + ], + { + "title_aux": "ComfyUI_EmojiOverlay" + } + ], "https://github.com/chaojie/ComfyUI-AniPortrait": [ [ "AniPortraitLoader", @@ -6750,9 +6904,11 @@ "LayerColor: Levels", "LayerColor: RGB", "LayerColor: YUV", + "LayerFilter: AddGrain", "LayerFilter: ChannelShake", "LayerFilter: ColorMap", "LayerFilter: Film", + "LayerFilter: FilmV2", "LayerFilter: GaussianBlur", "LayerFilter: HDREffects", "LayerFilter: LightLeak", @@ -6764,6 +6920,7 @@ "LayerMask: BiRefNetUltra", "LayerMask: BlendIf Mask", "LayerMask: CreateGradientMask", + "LayerMask: ImageToMask", "LayerMask: MaskBoxDetect", "LayerMask: MaskByColor", "LayerMask: MaskByDifferent", @@ -6771,11 +6928,13 @@ "LayerMask: MaskEdgeUltraDetail", "LayerMask: MaskEdgeUltraDetail V2", "LayerMask: MaskGradient", + "LayerMask: MaskGrain", "LayerMask: MaskGrow", "LayerMask: MaskInvert", "LayerMask: MaskMotionBlur", "LayerMask: MaskPreview", "LayerMask: MaskStroke", + "LayerMask: MediapipeFacialSegment", "LayerMask: PersonMaskUltra", "LayerMask: PersonMaskUltra V2", "LayerMask: PixelSpread", @@ -6801,6 +6960,7 @@ "LayerStyle: Stroke", "LayerStyle: Stroke V2", "LayerUtility: AddBlindWaterMark", + "LayerUtility: BatchSelector", "LayerUtility: Boolean", "LayerUtility: BooleanOperator", "LayerUtility: ColorImage", @@ -6819,6 +6979,7 @@ "LayerUtility: GetImageSize", "LayerUtility: GradientImage", "LayerUtility: GradientImage V2", + "LayerUtility: HLFrequencyDetailRestore", "LayerUtility: ImageAutoCrop", "LayerUtility: ImageAutoCrop V2", "LayerUtility: ImageBlend", @@ -6851,6 +7012,7 @@ "LayerUtility: QWenImage2Prompt", "LayerUtility: RGB Value", "LayerUtility: RestoreCropBox", + "LayerUtility: SD3NegativeConditioning", "LayerUtility: SaveImagePlus", "LayerUtility: Seed", "LayerUtility: ShowBlindWaterMark", @@ -7149,6 +7311,7 @@ "CLIPSetLastLayer", "CLIPTextEncode", "CLIPTextEncodeControlnet", + "CLIPTextEncodeSD3", "CLIPTextEncodeSDXL", "CLIPTextEncodeSDXLRefiner", "CLIPVisionEncode", @@ -7178,6 +7341,7 @@ "DualCLIPLoader", "EmptyImage", "EmptyLatentImage", + "EmptySD3LatentImage", "ExponentialScheduler", "FeatherMask", "FlipSigmas", @@ -7245,6 +7409,7 @@ "ModelMergeSubtract", "ModelSamplingContinuousEDM", "ModelSamplingDiscrete", + "ModelSamplingSD3", "ModelSamplingStableCascade", "Morphology", "PatchModelAddDownscale", @@ -7296,6 +7461,7 @@ "StyleModelLoader", "ThresholdMask", "TomePatchModel", + "TripleCLIPLoader", "UNETLoader", "UNetCrossAttentionMultiply", "UNetSelfAttentionMultiply", @@ -7319,6 +7485,16 @@ "title_aux": "ComfyUI" } ], + "https://github.com/comfyanonymous/ComfyUI_TensorRT": [ + [ + "DYNAMIC_TRT_MODEL_CONVERSION", + "STATIC_TRT_MODEL_CONVERSION", + "TensorRTLoader" + ], + { + "title_aux": "TensorRT Node for ComfyUI" + } + ], "https://github.com/comfyanonymous/ComfyUI_experiments": [ [ "ModelMergeBlockNumber", @@ -7437,6 +7613,7 @@ "IPAdapterCombineParams", "IPAdapterCombineWeights", "IPAdapterEmbeds", + "IPAdapterEmbedsBatch", "IPAdapterEncoder", "IPAdapterFaceID", "IPAdapterFromParams", @@ -7500,6 +7677,7 @@ "ImageApplyLUT+", "ImageBatchMultiple+", "ImageCASharpening+", + "ImageColorMatch+", "ImageCompositeFromMaskBatch+", "ImageCrop+", "ImageDesaturate+", @@ -7507,6 +7685,7 @@ "ImageExpandBatch+", "ImageFlip+", "ImageFromBatch+", + "ImageHistogramMatch+", "ImageListToBatch+", "ImagePosterize+", "ImageRandomTransform+", @@ -7613,8 +7792,6 @@ ], "https://github.com/dagthomas/comfyui_dagthomas": [ [ - "CSL", - "CSVPromptGenerator", "PromptGenerator" ], { @@ -7723,14 +7900,18 @@ "JDCN_BatchLatentLoadFromDir", "JDCN_BatchLatentLoadFromList", "JDCN_BatchSaveLatent", + "JDCN_BoolInt", + "JDCN_EnableDisable", "JDCN_FileMover", "JDCN_ImageSaver", "JDCN_ListToString", "JDCN_ReBatch", "JDCN_SeamlessExperience", + "JDCN_ShowAny", "JDCN_SplitString", "JDCN_StringManipulator", "JDCN_StringToList", + "JDCN_SwapInputs", "JDCN_TXTFileSaver", "JDCN_VHSFileMover" ], @@ -7765,6 +7946,40 @@ "title_aux": "comfyui_facetools" } ], + "https://github.com/denfrost/Den_ComfyUI_Workflow": [ + [ + "Den_BatchIndex_AS", + "Den_CropImage_AS", + "Den_Eval_AS", + "Den_FaceRestoreCFWithModel", + "Den_GPTLoaderSimple_llama", + "Den_GPTSampler_llama", + "Den_ImageMixMasked_As", + "Den_ImageToLatentSpace", + "Den_ImageToMask_AS", + "Den_Int2Any_AS", + "Den_LatentAdd_AS", + "Den_LatentMixMasked_As", + "Den_LatentMix_AS", + "Den_LatentToImages_AS", + "Den_LoadLatent_AS", + "Den_MapRange_AS", + "Den_MaskToImage_AS", + "Den_Math_AS", + "Den_NoiseImage_AS", + "Den_Number2Float_AS", + "Den_Number2Int_AS", + "Den_Number_AS", + "Den_SVD_img2vid", + "Den_SaveLatent_AS", + "Den_TextToImage_AS", + "Den_TextWildcardList_AS", + "Increment_AS" + ], + { + "title_aux": "Den_ComfyUI_Workflows" + } + ], "https://github.com/deroberon/StableZero123-comfyui": [ [ "SDZero ImageSplit", @@ -8056,20 +8271,23 @@ "Eden_String", "FolderScanner", "GetRandomFile", + "Get_Prefixed_Imgs", "HistogramMatching", "IMG_blender", "IMG_padder", "IMG_resolution_multiple_of", "IMG_scaler", "IMG_unpadder", - "IPAdapterRandomRotateEmbeds", "If ANY execute A else B", "ImageDescriptionNode", "LatentTypeConversion", + "Linear_Combine_IP_Embeds", + "LoadImagesByFilename", "LoadRandomImage", + "Load_Embeddings_From_Folder", "MaskFromRGB", "MaskFromRGB_KMeans", - "SaveExplorationState", + "Random_Style_Mixture", "SaveImageAdvanced", "SavePosEmbeds", "VAEDecode_to_folder", @@ -8137,15 +8355,16 @@ "title_aux": "ComfyMath" } ], - "https://github.com/exdysa/comfyui-selector/raw/main/selector.py": [ + "https://github.com/exdysa/comfyui-selector": [ [ + "Recourse", "Selector" ], { - "author": "\u02f6\ud835\udfa2\u292c\u2ad2\u2d56s\u143c\u02f6", - "description": "Preset aspect ratios and inference parameters.", - "nickname": "Selector", - "title": "Selector", + "author": "\"\u02f6\ud835\udfa2\u292c\u2ad2\u2d56s\u143c\u02f6\"", + "description": "\"Selector and Recourse for exdysa workflow. Preset aspect ratios, general settings, fallback switches.\"", + "nickname": "\"Selector\"", + "title": "\"Selector\"", "title_aux": "comfyui-selector" } ], @@ -8212,6 +8431,14 @@ "title_aux": "ComfyUI-AutoTrimBG" } ], + "https://github.com/fexploit/ComfyUI-Classifier": [ + [ + "ClassifierNode" + ], + { + "title_aux": "ComfyUI-Classifier" + } + ], "https://github.com/filipemeneses/comfy_pixelization": [ [ "Pixelization" @@ -8232,8 +8459,10 @@ "FL_HalftonePattern", "FL_HexagonalPattern", "FL_ImageCaptionSaver", + "FL_ImageCollage", "FL_ImageDimensionDisplay", "FL_ImageDurationSync", + "FL_ImageNotes", "FL_ImagePixelator", "FL_ImageRandomizer", "FL_InfiniteZoom", @@ -8376,6 +8605,7 @@ "https://github.com/fmatray/ComfyUI_BattlemapGrid": [ [ "Battlemap Grid", + "Compass", "Map Generator", "Map Generator(Outdoors)" ], @@ -8459,6 +8689,13 @@ "title_aux": "ComfyUI_MagicClothing" } ], + "https://github.com/frankchieng/ComfyUI_llm_easyanimiate": [ + [], + { + "nodename_pattern": "^FrankChiengEasyAnimate", + "title_aux": "ComfyUI_llm_easyanimiate" + } + ], "https://github.com/fsdymy1024/ComfyUI_fsdymy": [ [ "Preview Image Without Metadata", @@ -8897,17 +9134,24 @@ "Image20SwitcherNode", "Image3SwitcherNode", "Image5SwitcherNode", + "MonoClip_node", + "PixelArt_node", + "VAEDecodePreview_node", + "image2contrastMask_node", + "image2imbgg_node", "image_halftone", "image_histograms_node", "image_histograms_node_compact", "images_side_by_side", - "smart_checkpoint_loader" + "imgbbLoader_node", + "smart_checkpoint_loader", + "storeURL_node" ], { "author": "YFG", - "description": "This extension calculates the histogram of an image and outputs the results as graph images for individual channels as well as RGB and Luminosity.", - "nickname": "\ud83d\udc2f YFG Histograms", - "title": "YFG Histograms", + "description": "This extension loads a model checkpoint file and extracts the model state dictionary or the entire model, treating all checkpoints as if they are in the root directory.", + "nickname": "\ud83e\udde0 YFG Smart Checkpoint Loader", + "title": "YFG Smart Checkpoint Loader", "title_aux": "\ud83d\ude38 YFG Comical Nodes" } ], @@ -8984,6 +9228,14 @@ "title_aux": "ComfyUI-Image-Matting" } ], + "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector": [ + [ + "Image Selector" + ], + { + "title_aux": "ComfyUI-HH-Image-Selector" + } + ], "https://github.com/hay86/ComfyUI_AceNodes": [ [ "ACE_AnyInputSwitchBool", @@ -9001,6 +9253,7 @@ "ACE_ImageRemoveBackground", "ACE_ImageSaveToCloud", "ACE_Integer", + "ACE_MaskBlur", "ACE_Seed", "ACE_Text", "ACE_TextConcatenate", @@ -9052,10 +9305,22 @@ "title_aux": "ComfyUI OpenVoice" } ], + "https://github.com/hben35096/ComfyUI-ToolBox": [ + [ + "AutoDLDownload", + "FolderDeleter", + "FolderViewe" + ], + { + "title_aux": "ComfyUI-ToolBox" + } + ], "https://github.com/heshengtao/comfyui_LLM_party": [ [ "About_us", "CLIPTextEncode_party", + "Dingding", + "Dingding_tool", "KSampler_party", "LLM", "LLM_api_loader", @@ -9066,6 +9331,7 @@ "accuweather_tool", "api_tool", "arxiv_tool", + "bing_tool", "check_web_tool", "classify_function", "classify_function_plus", @@ -9075,8 +9341,11 @@ "ebd_tool", "end_dialog", "end_workflow", + "feishu", + "feishu_tool", "file_combine", "file_combine_plus", + "github_tool", "google_tool", "interpreter_tool", "load_embeddings", @@ -9087,15 +9356,20 @@ "load_url", "load_wikipedia", "new_interpreter_tool", + "openai_tts", + "play_audio", "show_text_party", "start_dialog", "start_workflow", "string_logic", + "substring", "time_tool", "tool_combine", "tool_combine_plus", "weather_tool", "wikipedia_tool", + "work_wechat", + "work_wechat_tool", "workflow_tool", "workflow_transfer" ], @@ -9209,6 +9483,31 @@ "title_aux": "ComfyUI_DanTagGen" } ], + "https://github.com/huchenlei/ComfyUI_densediffusion": [ + [ + "DenseDiffusionAddCondNode", + "DenseDiffusionApplyNode" + ], + { + "title_aux": "ComfyUI DenseDiffusion" + } + ], + "https://github.com/huchenlei/ComfyUI_omost": [ + [ + "OmostDenseDiffusionLayoutNode", + "OmostGreedyBagsTextEmbeddingNode", + "OmostLLMChatNode", + "OmostLLMHTTPServerNode", + "OmostLLMLoaderNode", + "OmostLayoutCondNode", + "OmostLoadCanvasConditioningNode", + "OmostLoadCanvasPythonCodeNode", + "OmostRenderCanvasConditioningNode" + ], + { + "title_aux": "ComfyUI_omost" + } + ], "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor": [ [ "Openpose Keypoint Extractor" @@ -10352,14 +10651,6 @@ "title_aux": "LoRTnoC-ComfyUI" } ], - "https://github.com/laksjdjf/attention-couple-ComfyUI": [ - [ - "Attention couple" - ], - { - "title_aux": "attention-couple-ComfyUI" - } - ], "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": [ [ "CDTuner", @@ -10407,6 +10698,15 @@ "title_aux": "LoRA Power-Merger ComfyUI" } ], + "https://github.com/latenightlabs/ComfyUI-LNL": [ + [ + "LNL_FrameSelector", + "LNL_FrameSelectorV2" + ], + { + "title_aux": "LNL Frame Selector" + } + ], "https://github.com/leoleelxh/ComfyUI-LLMs": [ [ "\ud83d\uddbc\ufe0f LLMs_Vison_Ali", @@ -10458,18 +10758,37 @@ "https://github.com/ljleb/comfy-mecha": [ [ "Blocks Mecha Hyper", - "Custom Code Mecha Recipe", + "Float Mecha Hyper", + "Lora Mecha Recipe", + "Mecha Custom Code Recipe", "Mecha Merger", + "Mecha Recipe List", "Model Mecha Recipe" ], { - "title_aux": "comfy-mecha" + "title_aux": "Mecha Merge Node Pack" + } + ], + "https://github.com/lks-ai/ComfyUI-StableAudioSampler": [ + [ + "StableAudioConditioning", + "StableAudioLoadModel", + "StableAudioPrompt", + "StableAudioSampler" + ], + { + "author": "lks-ai", + "description": "A Simple integration of Stable Audio Diffusion with knobs and stuff!", + "nickname": "stableaudio", + "title": "StableAudioSampler", + "title_aux": "ComfyUI Stable Audio Open 1.0 Sampler" } ], "https://github.com/lks-ai/anynode": [ [ "AnyNode", "AnyNodeCodeViewer", + "AnyNodeExport", "AnyNodeGemini", "AnyNodeLocal" ], @@ -10592,10 +10911,15 @@ "https://github.com/longgui0318/comfyui-magic-clothing": [ [ "Add Magic Clothing Attention", + "Change Pipeline Dtype And Device", "Change Pixel Value Normalization", - "LOAD OMS", + "Diffusers Model Makeup &MC", + "Diffusers Scheduler Loader &MC", + "Load Magic Clothing Adapter", "Load Magic Clothing Model", - "RUN OMS" + "Load Magic Clothing Pipeline", + "Load Magic Clothing Pipeline With Path", + "RUN Magic Clothing Diffusers Model" ], { "title_aux": "comfyui-magic-clothing" @@ -10605,11 +10929,15 @@ [ "Image Adaptive Crop M&R", "Image Adaptive Crop With Mask", + "Image Change DType", "Image Change Device", "Image Resolution Adaptive With X", "Image Resolution Limit With 8K", + "Load Image With Name", + "Mask Change DType", "Mask Change Device", "Mask Selection Of Masks", + "Output Image To Input", "Split Masks" ], { @@ -10619,10 +10947,15 @@ "https://github.com/longgui0318/comfyui-oms-diffusion": [ [ "Add Magic Clothing Attention", + "Change Pipeline Dtype And Device", "Change Pixel Value Normalization", - "LOAD OMS", + "Diffusers Model Makeup &MC", + "Diffusers Scheduler Loader &MC", + "Load Magic Clothing Adapter", "Load Magic Clothing Model", - "RUN OMS" + "Load Magic Clothing Pipeline", + "Load Magic Clothing Pipeline With Path", + "RUN Magic Clothing Diffusers Model" ], { "title_aux": "comfyui-oms-diffusion" @@ -10639,6 +10972,8 @@ "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch": [ [ "InpaintCrop", + "InpaintExtendOutpaint", + "InpaintResize", "InpaintStitch" ], { @@ -10714,6 +11049,7 @@ "ImpactControlNetApplySEGS", "ImpactControlNetClearSEGS", "ImpactConvertDataType", + "ImpactCount_Elts_in_SEGS", "ImpactDecomposeSEGS", "ImpactDilateMask", "ImpactDilateMaskInSEGS", @@ -10875,6 +11211,7 @@ "ChangeLatentBatchSize //Inspire", "CheckpointLoaderSimpleShared //Inspire", "ColorMapToMasks //Inspire", + "ColorMaskToDepthMask //Inspire", "Color_Preprocessor_Provider_for_SEGS //Inspire", "ConcatConditioningsWithMultiplier //Inspire", "ConditioningStretch //Inspire", @@ -10919,6 +11256,7 @@ "PromptExtractor //Inspire", "RandomGeneratorForList //Inspire", "RandomNoise //Inspire", + "RegionalCFG //Inspire", "RegionalConditioningColorMask //Inspire", "RegionalConditioningSimple //Inspire", "RegionalIPAdapterColorMask //Inspire", @@ -10956,6 +11294,21 @@ "title_aux": "ComfyUI Inspire Pack" } ], + "https://github.com/luandev/ComfyUI-CrewAI": [ + [ + "\ud83d\udcceCrewAI Agent", + "\ud83d\udcceCrewAI Agent List", + "\ud83d\udcceCrewAI Crew", + "\ud83d\udcceCrewAI LLM Chat GPT", + "\ud83d\udcceCrewAI LLM Hugging Face", + "\ud83d\udcceCrewAI LLM OpenAI", + "\ud83d\udcceCrewAI Task", + "\ud83d\udcceCrewAI Task List" + ], + { + "title_aux": "ComfyUI CrewAI" + } + ], "https://github.com/m-sokes/ComfyUI-Sokes-Nodes": [ [ "Custom Date Format | sokes \ud83e\uddac", @@ -10996,6 +11349,20 @@ "title_aux": "ComfyUI-SubjectStyle-CSV" } ], + "https://github.com/marduk191/comfyui-marnodes": [ + [ + "marduk191_5_text_string", + "marduk191_5way_text_switch", + "marduk191_workflow_settings" + ], + { + "author": "\u02f6marduk191", + "description": "A node to set workflow settings.", + "nickname": "marduk191 workflow settings", + "title": "marduk191 workflow settings", + "title_aux": "marduk191 workflow settings" + } + ], "https://github.com/marhensa/sdxl-recommended-res-calc": [ [ "RecommendedResCalc" @@ -11550,6 +11917,15 @@ "title_aux": "ntdviet/comfyui-ext" } ], + "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace": [ + [ + "FlashFace_Loader_NuA", + "FlashFace_Sampler_NuA" + ], + { + "title_aux": "ComfyUI-NuA-FlashFace" + } + ], "https://github.com/nullquant/ComfyUI-BrushNet": [ [ "BlendInpaint", @@ -11816,6 +12192,7 @@ "BMAB Prompt", "BMAB Remove Background", "BMAB Resize By Person", + "BMAB Resize By Ratio", "BMAB Resize and Fill", "BMAB SD-WebUI API BMAB Extension", "BMAB SD-WebUI API ControlNet", @@ -11855,6 +12232,14 @@ "title_aux": "Comfyui-Minio" } ], + "https://github.com/prodogape/ComfyUI-OmDet": [ + [ + "Apply OmDet" + ], + { + "title_aux": "ComfyUI-OmDet" + } + ], "https://github.com/pythongosssss/ComfyUI-Custom-Scripts": [ [ "CheckpointLoader|pysssss", @@ -11952,6 +12337,7 @@ ], "https://github.com/receyuki/comfyui-prompt-reader-node": [ [ + "SDAnyConverter", "SDBatchLoader", "SDLoraLoader", "SDLoraSelector", @@ -12042,6 +12428,17 @@ "title_aux": "comfyui-ricklove" } ], + "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": [ + [ + "FrequencyCombination", + "FrequencyCombinationHSV", + "FrequencySeparation", + "FrequencySeparationHSV" + ], + { + "title_aux": "comfyUI_FrequencySeparation_RGB-HSV" + } + ], "https://github.com/rklaffehn/rk-comfy-nodes": [ [ "RK_CivitAIAddHashes", @@ -12145,6 +12542,7 @@ [ "Runtime44ColorMatch", "Runtime44DynamicKSampler", + "Runtime44FilmGrain", "Runtime44ImageEnhance", "Runtime44ImageOverlay", "Runtime44ImageResizer", @@ -12206,6 +12604,14 @@ "title_aux": "SRL's nodes" } ], + "https://github.com/seghier/ComfyUI_LibreTranslate/raw/main/translate_node.py": [ + [ + "LibreTranslate" + ], + { + "title_aux": "ComfyUI_LibreTranslate" + } + ], "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": [ [ "AdjustAndRoundDimensions", @@ -12247,6 +12653,7 @@ "ChatGPTOpenAI", "CkptNames_", "Color", + "CombineAudioVideo", "ComparingTwoFrames_", "CompositeImages_", "DynamicDelayProcessor", @@ -12259,6 +12666,7 @@ "Font", "GLIGENTextBoxApply_Advanced", "GamePal", + "GenerateFramesByCount", "GetImageSize_", "GradientImage", "GridDisplayAndSave", @@ -12267,12 +12675,14 @@ "ImageColorTransfer", "ImageCropByAlpha", "ImageListReplace_", + "ImageListToBatch_", "ImagesPrompt_", "IncrementingListNode_", "IntNumber", "JoinWithDelimiter", "LimitNumber", "ListSplit_", + "LoadAndCombinedAudio_", "LoadImagesFromPath", "LoadImagesFromURL", "LoadImagesToBatch", @@ -12298,6 +12708,7 @@ "SaveImageAndMetadata_", "SaveImageToLocal", "SaveTripoSRMesh", + "ScenesNode_", "ScreenShare", "Seed_", "ShowLayer", @@ -12329,6 +12740,16 @@ "title_aux": "comfyui-mixlab-nodes" } ], + "https://github.com/shadowcz007/comfyui-sound-lab": [ + [ + "AudioPlay", + "Musicgen_", + "StableAudio_" + ], + { + "title_aux": "comfyui-sound-lab" + } + ], "https://github.com/shadowcz007/comfyui-ultralytics-yolo": [ [ "DetectByLabel" @@ -12397,6 +12818,14 @@ "title_aux": "ComfyUI-send-Eagle(slim)" } ], + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": [ + [ + "PlusMinusTextClip" + ], + { + "title_aux": "PlusMinusTextClip - Single node for Positive and Negative Prompts" + } + ], "https://github.com/shockz0rz/ComfyUI_InterpolateEverything": [ [ "OpenposePreprocessorInterpolate" @@ -12542,6 +12971,9 @@ ], "https://github.com/smthemex/ComfyUI_ChatGLM_API": [ [ + "Glm_4_9b_Chat", + "Glm_4v_9b", + "Glm_Lcoal_Or_Repo", "ZhipuaiApi_Character", "ZhipuaiApi_Txt", "ZhipuaiApi_img" @@ -12570,7 +13002,8 @@ ], "https://github.com/smthemex/ComfyUI_ID_Animator": [ [ - "ID_Animator" + "ID_Animator", + "ID_Repo_Choice" ], { "title_aux": "ComfyUI_ID_Animator" @@ -12611,8 +13044,34 @@ "title_aux": "ComfyUI_Pipeline_Tool" } ], + "https://github.com/smthemex/ComfyUI_Pops": [ + [ + "Imgae_To_Path", + "Pops_Controlnet_Sampler", + "Pops_Ipadapter_Sampler", + "Pops_Mean_Sampler", + "Pops_Prior_Embedding", + "Pops_Repo_Choice", + "Pops_Unet_Sampler" + ], + { + "title_aux": "ComfyUI_Pops" + } + ], + "https://github.com/smthemex/ComfyUI_StableAudio_Open": [ + [ + "StableAudio_Open", + "Use_LocalModel_Or_Repo" + ], + { + "title_aux": "ComfyUI_StableAudio_Open" + } + ], "https://github.com/smthemex/ComfyUI_StoryDiffusion": [ [ + "Character_Batch", + "Comic_Type", + "Pre_Translate_prompt", "Storydiffusion_Img2Img", "Storydiffusion_Text2Img" ], @@ -12676,6 +13135,7 @@ "BatchNormalizeImage", "BatchNormalizeLatent", "BetterFilmGrain", + "BilateralFilterImage", "BlurImageFast", "BlurMaskFast", "ClampOutliers", @@ -12685,7 +13145,10 @@ "DilateErodeMask", "EnhanceDetail", "ExposureAdjust", + "FrequencyCombine", + "FrequencySeparate", "GuidedFilterAlpha", + "GuidedFilterImage", "ImageConstant", "ImageConstantHSV", "InstructPixToPixConditioningAdvanced", @@ -12693,6 +13156,7 @@ "Keyer", "LatentNormalizeShuffle", "LatentStats", + "MedianFilterImage", "NormalMapSimple", "OffsetLatentImage", "PrintSigmas", @@ -13062,6 +13526,38 @@ "title_aux": "ComfyUI Stable Video Diffusion" } ], + "https://github.com/tiankuan93/ComfyUI-V-Express": [ + [ + "Load_Audio_Path", + "Load_Audio_Path_From_Video", + "Load_Image_Path", + "Load_Kps_Path", + "Load_Kps_Path_From_Video", + "Load_Video_Path", + "VEINTConstant", + "VEPreview_Video", + "VEStringConstant", + "V_Express_Loader", + "V_Express_Sampler" + ], + { + "title_aux": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation" + } + ], + "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge": [ + [ + "ProjectorzControlnetInput", + "ProjectorzControlnetParameter", + "ProjectorzInitInput", + "ProjectorzOutput", + "ProjectorzParameter", + "ProjectorzStringToFloat", + "ProjectorzStringToInt" + ], + { + "title_aux": "Stable Projectorz Bridge" + } + ], "https://github.com/time-river/ComfyUI-CLIPSeg/raw/main/custom_nodes/clipseg.py": [ [ "CLIPSeg", @@ -13090,6 +13586,14 @@ "title_aux": "ComfyUI-AudioReactor" } ], + "https://github.com/tooldigital/ComfyUI-Yolo-Cropper": [ + [ + "ToolYoloCropper" + ], + { + "title_aux": "Easy automatic (square) image cropper using Yolo" + } + ], "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes": [ [ "CaptureWebcam", @@ -13113,6 +13617,12 @@ "quadmoonINTConditionalOperation", "quadmoonKSampler", "quadmoonKSamplerAdvanced", + "quadmoonLoadConfigs", + "quadmoonModelLoader", + "quadmoonSaveNeg", + "quadmoonSavePrompt", + "quadmoonSmartNeg", + "quadmoonSmartPrompt", "quadmoonThebutton" ], { @@ -13196,7 +13706,7 @@ ], "https://github.com/turkyden/ComfyUI-Comic": [ [ - "Image To Comic" + "ImageToComic" ], { "title_aux": "ComfyUI-Comic" @@ -13204,7 +13714,7 @@ ], "https://github.com/turkyden/ComfyUI-Sticker": [ [ - "Image To Sticker" + "ImageToSticker" ], { "title_aux": "ComfyUI-Sticker" @@ -13299,6 +13809,22 @@ "title_aux": "unwdef-nodes" } ], + "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": [ + [ + "VC_Load_Video_Path_Unified_Output", + "VC_Load_Video_Upload_Unified_Output", + "VC_Video_Combine_Unified_Output", + "Waveform2Audio", + "\ud83d\ude0bAPI Request Node", + "\ud83d\ude0bJSON Parser Node", + "\ud83d\ude0bOld Photo Colorization Node", + "\ud83d\ude0bOllama Request Node", + "\ud83d\ude0bSave Image Unified Output" + ], + { + "title_aux": "ZMG PLUGIN" + } + ], "https://github.com/vanillacode314/SimpleWildcardsComfyUI": [ [ "SimpleConcat", @@ -13690,6 +14216,7 @@ "easy a1111Loader", "easy applyBrushNet", "easy applyFooocusInpaint", + "easy applyInpaint", "easy applyPowerPaint", "easy boolean", "easy cascadeKSampler", @@ -14080,6 +14607,18 @@ "title_aux": "EasyCaptureNode for ComfyUI" } ], + "https://github.com/zohac/ComfyUI_ZC_DrawShape": [ + [ + "ZcDrawShape" + ], + { + "author": "Zohac", + "description": "nodes for artists, designers and animators.", + "nickname": "Zc DrawShape", + "title": "Zc DrawShape", + "title_aux": "ComfyUI_ZC_DrawShape" + } + ], "https://github.com/zombieyang/sd-ppp": [ [ "Get Image From Photoshop Layer", diff --git a/node_db/new/model-list.json b/node_db/new/model-list.json index aac8b0b1..c354d935 100644 --- a/node_db/new/model-list.json +++ b/node_db/new/model-list.json @@ -1,5 +1,107 @@ { "models": [ + { + "name": "CN-anytest_v4-marged.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[2.5GB] AnyTest Controlnet. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged.safetensors" + }, + { + "name": "CN-anytest_v4-marged_am_dim256.safetensors (dim256/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Animagine. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_am_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim256.safetensors" + }, + { + "name": "CN-anytest_v4-marged_am_dim128.safetensors (dim128/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Animagine. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_am_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim128.safetensors" + }, + { + "name": "CN-anytest_v4-marged_pn_dim256.safetensors (dim256/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Pony. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_pn_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim256.safetensors" + }, + { + "name": "CN-anytest_v4-marged_pn_dim128.safetensors (dim128/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Pony. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_pn_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim128.safetensors" + }, + + { + "name": "CN-anytest_v3-50000_fp16.safetensors (fp16)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[2.5GB] AnyTest Controlnet. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_fp16.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_fp16.safetensors" + }, + { + "name": "CN-anytest_v3-50000_am_dim256.safetensors (dim256/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Animagine. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_am_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim256.safetensors" + }, + { + "name": "CN-anytest_v3-50000_am_dim128.safetensors (dim128/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Animagine. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_am_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim128.safetensors" + }, + { + "name": "CN-anytest_v3-50000_pn_dim256.safetensors (dim256/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Pony. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_pn_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim256.safetensors" + }, + { + "name": "CN-anytest_v3-50000_pn_dim128.safetensors (dim128/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Pony. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_pn_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim128.safetensors" + }, + { "name": "Kijai/ToonCrafter model checkpoint (interpolation fp16)", "type": "checkpoint", @@ -52,7 +154,7 @@ "url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model_twins.safetensors" }, { - "name": "xinsir/CControlnet-Scribble-Sdxl-1.0-Anime", + "name": "xinsir/Controlnet-Scribble-Sdxl-1.0-Anime", "type": "controlnet", "base": "SDXL", "save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0-anime", diff --git a/prestartup_script.py b/prestartup_script.py index a5f28a9e..943f771c 100644 --- a/prestartup_script.py +++ b/prestartup_script.py @@ -9,13 +9,14 @@ import locale import platform import json - glob_path = os.path.join(os.path.dirname(__file__), "glob") sys.path.append(glob_path) +import security_check from manager_util import * import cm_global +security_check.security_check() cm_global.pip_downgrade_blacklist = ['torch', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia'] diff --git a/pyproject.toml b/pyproject.toml index fbb9ed13..4bd3661a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] 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." -version = "2.36" +version = "2.38" license = "LICENSE" dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"] diff --git a/scanner.py b/scanner.py index 72715870..9ff7fb58 100644 --- a/scanner.py +++ b/scanner.py @@ -293,12 +293,16 @@ def update_custom_nodes(): if len(path_parts) >= 2 and domain == "github.com": owner_repo = "/".join(path_parts[-2:]) repo = g.get_repo(owner_repo) - + owner = repo.owner + now = datetime.datetime.now(datetime.timezone.utc) + author_time_diff = now - owner.created_at + last_update = repo.pushed_at.strftime("%Y-%m-%d %H:%M:%S") if repo.pushed_at else 'N/A' item = { "stars": repo.stargazers_count, "last_update": last_update, - "cached_time": datetime.datetime.now().timestamp(), + "cached_time": now.timestamp(), + "author_account_age_days": author_time_diff.days, } return url, item else: @@ -453,7 +457,13 @@ def gen_json(node_info): git_url, title, preemptions, node_pattern = node_info[extension] with open(node_list_json_path, 'r', encoding='utf-8') as f: - node_list_json = json.load(f) + try: + node_list_json = json.load(f) + except Exception as e: + print(f"\nERROR: Invalid json format '{node_list_json_path}'") + print("------------------------------------------------------") + print(e) + print("------------------------------------------------------") metadata_in_url = {} if git_url not in data: