"""Descarga un PNG generado por ComfyUI via GET /view a disco local. comfyui_wait_result devuelve solo metadata (node_id -> {images: [{filename, subfolder, type}]}); esta funcion baja el archivo real al disco local para poder abrirlo, mostrarlo o procesarlo. Impura: red (HTTP GET) + escritura en disco. Solo stdlib (urllib, os). """ import os import urllib.error import urllib.parse import urllib.request def comfyui_fetch_output_image( filename: str, *, subfolder: str = "", type_: str = "output", server: str = "127.0.0.1:8188", dest_dir: str = ".", timeout: float = 60.0, ) -> dict: """Baja una imagen del servidor ComfyUI a un directorio local. Args: filename: nombre del archivo en el servidor (ej. "comfy_00001_.png"), tal como lo reporta comfyui_wait_result en outputs[node].images. subfolder: subcarpeta dentro de la carpeta del servidor (vacia por defecto). keyword-only. type_: tipo de carpeta del servidor: "output", "temp" o "input". keyword-only. server: host:port del servidor ComfyUI (sin esquema). keyword-only. dest_dir: directorio local donde guardar la imagen; se crea si no existe. keyword-only. timeout: timeout de la peticion HTTP en segundos. keyword-only. Returns: dict {ok, path, size_bytes, error}. path = ruta local del PNG guardado; size_bytes = tamano descargado. Si falla, ok=False y error explica. """ qs = urllib.parse.urlencode( {"filename": filename, "subfolder": subfolder, "type": type_} ) url = f"http://{server}/view?{qs}" try: with urllib.request.urlopen(url, timeout=timeout) as resp: blob = resp.read() except urllib.error.HTTPError as exc: body = exc.read().decode(errors="replace")[:200] return {"ok": False, "path": "", "size_bytes": 0, "error": f"HTTP {exc.code} en {url}: {body}"} except urllib.error.URLError as exc: return {"ok": False, "path": "", "size_bytes": 0, "error": f"no se pudo conectar a {url}: {exc.reason}"} try: os.makedirs(dest_dir, exist_ok=True) out_path = os.path.join(dest_dir, os.path.basename(filename)) with open(out_path, "wb") as f: f.write(blob) except OSError as exc: return {"ok": False, "path": "", "size_bytes": 0, "error": f"no se pudo escribir en {dest_dir!r}: {exc}"} return {"ok": True, "path": out_path, "size_bytes": len(blob), "error": ""} if __name__ == "__main__": import json res = comfyui_fetch_output_image("comfy_00001_.png", dest_dir="/tmp") print(json.dumps(res, indent=2))