Files
sh570655308 de0613df0e feat: 给 LoadVideo 节点添加视频预览 + 任意路径预览端点
前端 (web/js/topaz_video.js):
- 提取通用 createVideoWidget 函数,TopazVideoAI 和 LoadVideo 共用
- TopazLoadVideoFFmpeg:     选了文件后实时预览 (input 目录,用 /view)
- TopazLoadVideoFFmpegPath: 选了文件后实时预览 (任意路径,用 /topaz/view_video)
- 不需要执行工作流就能预览选中的视频
- 加载已有工作流时自动触发预览

后端 (__init__.py):
- 新增 /topaz/view_video 端点,支持预览任意路径的视频
  (ComfyUI 原生 /view 只支持 input/output/temp 目录)
- 安全限制: 只允许视频扩展名,防止误暴露非视频文件
2026-08-12 22:42:58 +08:00

54 lines
2.2 KiB
Python

from .topaz_video_node import TopazVideoAINode,TopazUpscaleParamsNode
from .video_load import TopazLoadVideoFFmpeg, TopazLoadVideoFFmpegPath
# 定义节点类映射
NODE_CLASS_MAPPINGS = {
"TopazVideoAI": TopazVideoAINode,
"TopazUpscaleParams": TopazUpscaleParamsNode,
"TopazLoadVideoFFmpeg": TopazLoadVideoFFmpeg,
"TopazLoadVideoFFmpegPath": TopazLoadVideoFFmpegPath,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"TopazVideoAI": "Topaz Video AI (Upscale & Frame Interpolation)",
"TopazUpscaleParams": "Topaz Upscale Parameters",
"TopazLoadVideoFFmpeg": "Load Video FFmpeg (Topaz)",
"TopazLoadVideoFFmpegPath": "Load Video Path FFmpeg (Topaz)",
}
# ---------------------------------------------------------------------------
# 服务端端点: 让前端能预览任意路径的视频文件 (LoadVideoFFmpegPath 需要)
# ComfyUI 原生 /view 只支持 input/output/temp 目录,不支持任意路径。
# ---------------------------------------------------------------------------
import os
import mimetypes
try:
from server import PromptServer
from aiohttp import web
_VIDEO_EXTS = {'.mp4', '.webm', '.mkv', '.mov', '.avi', '.gif', '.flv', '.ts', '.m4v', '.mpg', '.mpeg'}
@PromptServer.instance.routes.get("/topaz/view_video")
async def topaz_view_video(request):
"""预览任意路径的视频文件。仅允许视频扩展名,防止误暴露其它文件。"""
path = request.rel_url.query.get("filename", "")
if not path:
return web.Response(status=400, text="missing filename")
path = os.path.normpath(path)
ext = os.path.splitext(path)[1].lower()
if ext not in _VIDEO_EXTS:
return web.Response(status=403, text="not a video file")
if not os.path.isfile(path):
return web.Response(status=404, text="file not found")
ct = mimetypes.guess_type(path)[0] or 'application/octet-stream'
return web.FileResponse(path, headers={
"Content-Type": ct,
"Cache-Control": "no-store",
})
except ImportError:
pass
# 前端扩展目录: 让 ComfyUI 加载 web/js/ 下的 JS,为节点添加视频预览 widget
WEB_DIRECTORY = "./web"
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]