mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-21 21:22:11 -03:00
Add support for importing recipes from remote sources by: - Adding import_remote_recipe endpoint to RecipeHandlerSet - Injecting downloader_factory and civitai_client_getter dependencies - Implementing image download and resource parsing logic - Supporting Civitai resource payloads with checkpoints and LoRAs - Adding required imports for regex and temporary file handling This enables users to import recipes directly from external sources like Civitai without manual file downloads.
65 lines
2.7 KiB
Python
65 lines
2.7 KiB
Python
"""Route registrar for recipe endpoints."""
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Callable, Mapping
|
|
|
|
from aiohttp import web
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RouteDefinition:
|
|
"""Declarative definition for a recipe HTTP route."""
|
|
|
|
method: str
|
|
path: str
|
|
handler_name: str
|
|
|
|
|
|
ROUTE_DEFINITIONS: tuple[RouteDefinition, ...] = (
|
|
RouteDefinition("GET", "/loras/recipes", "render_page"),
|
|
RouteDefinition("GET", "/api/lm/recipes", "list_recipes"),
|
|
RouteDefinition("GET", "/api/lm/recipe/{recipe_id}", "get_recipe"),
|
|
RouteDefinition("GET", "/api/lm/recipes/import-remote", "import_remote_recipe"),
|
|
RouteDefinition("POST", "/api/lm/recipes/analyze-image", "analyze_uploaded_image"),
|
|
RouteDefinition("POST", "/api/lm/recipes/analyze-local-image", "analyze_local_image"),
|
|
RouteDefinition("POST", "/api/lm/recipes/save", "save_recipe"),
|
|
RouteDefinition("DELETE", "/api/lm/recipe/{recipe_id}", "delete_recipe"),
|
|
RouteDefinition("GET", "/api/lm/recipes/top-tags", "get_top_tags"),
|
|
RouteDefinition("GET", "/api/lm/recipes/base-models", "get_base_models"),
|
|
RouteDefinition("GET", "/api/lm/recipe/{recipe_id}/share", "share_recipe"),
|
|
RouteDefinition("GET", "/api/lm/recipe/{recipe_id}/share/download", "download_shared_recipe"),
|
|
RouteDefinition("GET", "/api/lm/recipe/{recipe_id}/syntax", "get_recipe_syntax"),
|
|
RouteDefinition("PUT", "/api/lm/recipe/{recipe_id}/update", "update_recipe"),
|
|
RouteDefinition("POST", "/api/lm/recipe/lora/reconnect", "reconnect_lora"),
|
|
RouteDefinition("GET", "/api/lm/recipes/find-duplicates", "find_duplicates"),
|
|
RouteDefinition("POST", "/api/lm/recipes/bulk-delete", "bulk_delete"),
|
|
RouteDefinition("POST", "/api/lm/recipes/save-from-widget", "save_recipe_from_widget"),
|
|
RouteDefinition("GET", "/api/lm/recipes/for-lora", "get_recipes_for_lora"),
|
|
RouteDefinition("GET", "/api/lm/recipes/scan", "scan_recipes"),
|
|
)
|
|
|
|
|
|
class RecipeRouteRegistrar:
|
|
"""Bind declarative recipe definitions to an aiohttp router."""
|
|
|
|
_METHOD_MAP = {
|
|
"GET": "add_get",
|
|
"POST": "add_post",
|
|
"PUT": "add_put",
|
|
"DELETE": "add_delete",
|
|
}
|
|
|
|
def __init__(self, app: web.Application) -> None:
|
|
self._app = app
|
|
|
|
def register_routes(self, handler_lookup: Mapping[str, Callable[[web.Request], object]]) -> None:
|
|
for definition in ROUTE_DEFINITIONS:
|
|
handler = handler_lookup[definition.handler_name]
|
|
self._bind_route(definition.method, definition.path, handler)
|
|
|
|
def _bind_route(self, method: str, path: str, handler: Callable) -> None:
|
|
add_method_name = self._METHOD_MAP[method.upper()]
|
|
add_method = getattr(self._app.router, add_method_name)
|
|
add_method(path, handler)
|