From 9685d4f3c3e34b50d3f2e9bcb52026db7f7e624c Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Wed, 11 Jun 2025 16:21:28 -0400 Subject: [PATCH] auto register web folder from pyproject (#8478) * auto register web folder from pyproject * need pydantic-settings as dependency --- comfy_config/types.py | 15 ++++++++++++++- nodes.py | 16 ++++++++++++++++ requirements.txt | 1 + 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/comfy_config/types.py b/comfy_config/types.py index 611982083..11261a136 100644 --- a/comfy_config/types.py +++ b/comfy_config/types.py @@ -1,4 +1,4 @@ -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, field_validator from pydantic_settings import BaseSettings, SettingsConfigDict from typing import List, Optional @@ -50,6 +50,7 @@ class ComfyConfig(BaseModel): icon: str = Field(default="", alias="Icon") models: List[Model] = Field(default_factory=list, alias="Models") includes: List[str] = Field(default_factory=list) + web: Optional[str] = None class License(BaseModel): @@ -66,6 +67,18 @@ class ProjectConfig(BaseModel): license: License = Field(default_factory=License) urls: URLs = Field(default_factory=URLs) + @field_validator('license', mode='before') + @classmethod + def validate_license(cls, v): + if isinstance(v, str): + return License(text=v) + elif isinstance(v, dict): + return License(**v) + elif isinstance(v, License): + return v + else: + return License() + class PyProjectConfig(BaseModel): project: ProjectConfig = Field(default_factory=ProjectConfig) diff --git a/nodes.py b/nodes.py index 637279ffb..19612479b 100644 --- a/nodes.py +++ b/nodes.py @@ -38,6 +38,8 @@ import folder_paths import latent_preview import node_helpers +from comfy_config import config_parser + def before_node_execution(): comfy.model_management.throw_exception_if_processing_interrupted() @@ -2125,6 +2127,20 @@ def load_custom_node(module_path: str, ignore=set(), module_parent="custom_nodes LOADED_MODULE_DIRS[module_name] = os.path.abspath(module_dir) + project_config = config_parser.extract_node_configuration(module_path) + + web_dir_name = project_config.tool_comfy.web + + if web_dir_name: + web_dir_path = os.path.join(module_path, web_dir_name) + + if os.path.isdir(web_dir_path): + project_name = project_config.project.name + + EXTENSION_WEB_DIRS[project_name] = web_dir_path + + logging.info("Automatically register web folder {} for {}".format(web_dir_name, project_name)) + if hasattr(module, "WEB_DIRECTORY") and getattr(module, "WEB_DIRECTORY") is not None: web_dir = os.path.abspath(os.path.join(module_dir, getattr(module, "WEB_DIRECTORY"))) if os.path.isdir(web_dir): diff --git a/requirements.txt b/requirements.txt index ee4edb1dc..ee24b1cb3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,3 +25,4 @@ spandrel soundfile av>=14.2.0 pydantic~=2.0 +pydantic-settings~=2.0