mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-02-21 15:34:05 +00:00
implemented assets scaner
This commit is contained in:
@@ -4,7 +4,7 @@ from typing import Optional
|
||||
from aiohttp import web
|
||||
from pydantic import ValidationError
|
||||
|
||||
from .. import assets_manager
|
||||
from .. import assets_manager, assets_scanner
|
||||
from . import schemas_in
|
||||
|
||||
|
||||
@@ -225,6 +225,31 @@ async def delete_asset_tags(request: web.Request) -> web.Response:
|
||||
return web.json_response(result.model_dump(mode="json"), status=200)
|
||||
|
||||
|
||||
@ROUTES.post("/api/assets/scan/schedule")
|
||||
async def schedule_asset_scan(request: web.Request) -> web.Response:
|
||||
try:
|
||||
payload = await request.json()
|
||||
except Exception:
|
||||
payload = {}
|
||||
|
||||
try:
|
||||
body = schemas_in.ScheduleAssetScanBody.model_validate(payload)
|
||||
except ValidationError as ve:
|
||||
return _validation_error_response("INVALID_BODY", ve)
|
||||
|
||||
states = await assets_scanner.schedule_scans(body.roots)
|
||||
return web.json_response(states.model_dump(mode="json"), status=202)
|
||||
|
||||
|
||||
@ROUTES.get("/api/assets/scan")
|
||||
async def get_asset_scan_status(request: web.Request) -> web.Response:
|
||||
root = request.query.get("root", "").strip().lower()
|
||||
states = assets_scanner.current_statuses()
|
||||
if root in {"models", "input", "output"}:
|
||||
states = [s for s in states.scans if s.root == root] # type: ignore
|
||||
return web.json_response(states.model_dump(mode="json"), status=200)
|
||||
|
||||
|
||||
def register_assets_routes(app: web.Application) -> None:
|
||||
app.add_routes(ROUTES)
|
||||
|
||||
|
||||
@@ -146,3 +146,29 @@ class TagsAdd(BaseModel):
|
||||
|
||||
class TagsRemove(TagsAdd):
|
||||
pass
|
||||
|
||||
|
||||
class ScheduleAssetScanBody(BaseModel):
|
||||
roots: list[Literal["models","input","output"]] = Field(default_factory=list)
|
||||
|
||||
@field_validator("roots", mode="before")
|
||||
@classmethod
|
||||
def _normalize_roots(cls, v):
|
||||
if v is None:
|
||||
return []
|
||||
if isinstance(v, str):
|
||||
items = [x.strip().lower() for x in v.split(",")]
|
||||
elif isinstance(v, list):
|
||||
items = []
|
||||
for x in v:
|
||||
if isinstance(x, str):
|
||||
items.extend([p.strip().lower() for p in x.split(",")])
|
||||
else:
|
||||
return []
|
||||
out = []
|
||||
seen = set()
|
||||
for r in items:
|
||||
if r in {"models","input","output"} and r not in seen:
|
||||
out.append(r)
|
||||
seen.add(r)
|
||||
return out
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Optional
|
||||
from typing import Any, Literal, Optional
|
||||
from pydantic import BaseModel, ConfigDict, Field, field_serializer
|
||||
|
||||
|
||||
@@ -87,3 +87,20 @@ class TagsRemove(BaseModel):
|
||||
removed: list[str] = Field(default_factory=list)
|
||||
not_present: list[str] = Field(default_factory=list)
|
||||
total_tags: list[str] = Field(default_factory=list)
|
||||
|
||||
|
||||
class AssetScanStatus(BaseModel):
|
||||
scan_id: str
|
||||
root: Literal["models","input","output"]
|
||||
status: Literal["scheduled","running","completed","failed","cancelled"]
|
||||
scheduled_at: Optional[str] = None
|
||||
started_at: Optional[str] = None
|
||||
finished_at: Optional[str] = None
|
||||
discovered: int = 0
|
||||
processed: int = 0
|
||||
errors: int = 0
|
||||
last_error: Optional[str] = None
|
||||
|
||||
|
||||
class AssetScanStatusResponse(BaseModel):
|
||||
scans: list[AssetScanStatus] = Field(default_factory=list)
|
||||
|
||||
Reference in New Issue
Block a user