60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
|
|
|
|
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"]
|
|
|
|
# Frontend extension (drag&drop HEIC/HEIF upload handling)
|
|
WEB_DIRECTORY = "web"
|
|
|
|
|
|
def _register_preview_route() -> None:
|
|
"""Serve HEIC/HEIF previews as PNG for browsers that can't render HEIC."""
|
|
try:
|
|
from aiohttp import web
|
|
from io import BytesIO
|
|
from PIL import Image, ImageOps
|
|
|
|
from server import PromptServer
|
|
import folder_paths
|
|
|
|
from .nodes import _try_register_heif_opener
|
|
|
|
instance = getattr(PromptServer, "instance", None)
|
|
if instance is None or not hasattr(instance, "routes"):
|
|
return
|
|
|
|
# Avoid duplicate route registration if module reloads.
|
|
if getattr(instance, "_heic_preview_route_registered", False):
|
|
return
|
|
instance._heic_preview_route_registered = True
|
|
|
|
@instance.routes.get("/heic_preview")
|
|
async def heic_preview(request: web.Request):
|
|
filename = request.rel_url.query.get("filename")
|
|
if not filename:
|
|
return web.Response(status=400, text="filename is required")
|
|
|
|
if not folder_paths.exists_annotated_filepath(filename):
|
|
return web.Response(status=404, text="file not found")
|
|
|
|
path = folder_paths.get_annotated_filepath(filename)
|
|
|
|
_try_register_heif_opener()
|
|
|
|
try:
|
|
img = Image.open(path)
|
|
img = ImageOps.exif_transpose(img)
|
|
img = img.convert("RGBA")
|
|
except Exception as e:
|
|
return web.Response(status=500, text=f"failed to decode image: {e}")
|
|
|
|
bio = BytesIO()
|
|
img.save(bio, format="PNG")
|
|
return web.Response(body=bio.getvalue(), content_type="image/png")
|
|
|
|
except Exception:
|
|
# Never fail import because preview route couldn't register.
|
|
return
|
|
|
|
|
|
_register_preview_route()
|