From 815784e8094ed85b8b15e06778d57f9a1eb0449d Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 25 Jun 2025 00:18:18 +0900 Subject: [PATCH] fixed: Fix issue where some nodepacks were displayed redundantly in custom nodes manager. --- glob/manager_core.py | 60 +++++++++++++++++++++++++++++++------- glob/manager_server.py | 2 +- js/custom-nodes-manager.js | 1 + pyproject.toml | 2 +- 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/glob/manager_core.py b/glob/manager_core.py index 10adf22b..71f9a000 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -43,7 +43,7 @@ import manager_downloader from node_package import InstalledNodePackage -version_code = [3, 33, 1] +version_code = [3, 33, 2] version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '') @@ -400,32 +400,72 @@ class ManagedResult: return self -class NormalizedKeyDict(dict): +class NormalizedKeyDict: + def __init__(self): + self._store = {} + self._key_map = {} + def _normalize_key(self, key): if isinstance(key, str): return key.strip().lower() return key def __setitem__(self, key, value): - super().__setitem__(self._normalize_key(key), value) + norm_key = self._normalize_key(key) + self._key_map[norm_key] = key + self._store[key] = value def __getitem__(self, key): - return super().__getitem__(self._normalize_key(key)) + norm_key = self._normalize_key(key) + original_key = self._key_map[norm_key] + return self._store[original_key] def __delitem__(self, key): - return super().__delitem__(self._normalize_key(key)) + norm_key = self._normalize_key(key) + original_key = self._key_map.pop(norm_key) + del self._store[original_key] def __contains__(self, key): - return super().__contains__(self._normalize_key(key)) + return self._normalize_key(key) in self._key_map def get(self, key, default=None): - return super().get(self._normalize_key(key), default) + return self[key] if key in self else default def setdefault(self, key, default=None): - return super().setdefault(self._normalize_key(key), default) + if key in self: + return self[key] + self[key] = default + return default def pop(self, key, default=None): - return super().pop(self._normalize_key(key), default) + if key in self: + val = self[key] + del self[key] + return val + if default is not None: + return default + raise KeyError(key) + + def keys(self): + return self._store.keys() + + def values(self): + return self._store.values() + + def items(self): + return self._store.items() + + def __iter__(self): + return iter(self._store) + + def __len__(self): + return len(self._store) + + def __repr__(self): + return repr(self._store) + + def to_dict(self): + return dict(self._store) class UnifiedManager: @@ -842,7 +882,7 @@ class UnifiedManager: channel = normalize_channel(channel) nodes = await self.load_nightly(channel, mode) - res = {} + res = NormalizedKeyDict() added_cnr = set() for v in nodes.values(): v = v[0] diff --git a/glob/manager_server.py b/glob/manager_server.py index 5cad05f4..fc33f447 100644 --- a/glob/manager_server.py +++ b/glob/manager_server.py @@ -865,7 +865,7 @@ async def fetch_customnode_list(request): channel = found - result = dict(channel=channel, node_packs=node_packs) + result = dict(channel=channel, node_packs=node_packs.to_dict()) return web.json_response(result, content_type='application/json') diff --git a/js/custom-nodes-manager.js b/js/custom-nodes-manager.js index c1930ae1..f2fdc50c 100644 --- a/js/custom-nodes-manager.js +++ b/js/custom-nodes-manager.js @@ -714,6 +714,7 @@ export class CustomNodesManager { link.href = rowItem.reference; link.target = '_blank'; link.innerHTML = `${title}`; + link.title = rowItem.originalData.id; container.appendChild(link); return container; diff --git a/pyproject.toml b/pyproject.toml index 8e53c1b3..a794625d 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 = "3.33.1" +version = "3.33.2" license = { file = "LICENSE.txt" } dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"]