现象:「加载透明视频」节点下方的预览按原始像素尺寸渲染,容器
overflow:hidden 把画面裁掉一大块,只能看到局部。
根因不在本节点。ComfyUI 官方给节点视频预览的样式本来是对的
(.comfy-img-preview video { object-fit:contain; width:100%; height:100% }),
但 comfyui-art-venture 的 web/upload.js 为自家 LoadVideoFromUrl 注入了一条
同名全局选择器的规则,把宽高改成 var(--comfy-img-preview-width/height)。
这两个变量只在 art-venture 自家节点的 DOM 上定义,其它节点取到空值,
变量为空时整条声明失效,<video> 退回固有尺寸撑破容器而被裁切。
修法(web/rui_video_preview_fit.js,随 WEB_DIRECTORY 加载):
- 本节点专属规则 .comfy-img-preview.rui-video-fit video 强制
100% + object-fit:contain;容器标记通过拦截 node.videoContainer
的赋值时打上,无需轮询、不受创建时机影响
- 全局兜底规则给那两个变量补 100% 回退值:变量有值时行为完全不变
(art-venture 自身节点不受影响),仅在变量为空这种本就失效的
情况下恢复官方行为,对其它插件是纯修复
浏览器内 A/B 实测(640x640 视频、347px 宽容器):
修复前 video 渲染 640x640 溢出被裁;两条规则各自生效后均为 347x347 完整显示。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
190 lines
12 KiB
Python
190 lines
12 KiB
Python
# 顶部已有的导入
|
|
from .saturation_node import NODE_CLASS_MAPPINGS as SAT_NODE_CLASS_MAPPINGS
|
|
from .saturation_node import NODE_DISPLAY_NAME_MAPPINGS as SAT_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .flip_node import NODE_CLASS_MAPPINGS as FLIP_NODE_CLASS_MAPPINGS
|
|
from .flip_node import NODE_DISPLAY_NAME_MAPPINGS as FLIP_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .load_image_node import NODE_CLASS_MAPPINGS as LOAD_NODE_CLASS_MAPPINGS
|
|
from .load_image_node import NODE_DISPLAY_NAME_MAPPINGS as LOAD_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .load_image_with_name_node import NODE_CLASS_MAPPINGS as LOAD_NAME_NODE_CLASS_MAPPINGS
|
|
from .load_image_with_name_node import NODE_DISPLAY_NAME_MAPPINGS as LOAD_NAME_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .qwenedit_node import NODE_CLASS_MAPPINGS as QWEN_NODE_CLASS_MAPPINGS
|
|
from .qwenedit_node import NODE_DISPLAY_NAME_MAPPINGS as QWEN_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .shot_splitter_node import NODE_CLASS_MAPPINGS as SHOT_NODE_CLASS_MAPPINGS
|
|
from .shot_splitter_node import NODE_DISPLAY_NAME_MAPPINGS as SHOT_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .dialogue_extractor_node import NODE_CLASS_MAPPINGS as DIALOGUE_NODE_CLASS_MAPPINGS
|
|
from .dialogue_extractor_node import NODE_DISPLAY_NAME_MAPPINGS as DIALOGUE_NODE_DISPLAY_NAME_MAPPINGS
|
|
# 新增:遮罩筛选节点
|
|
from .mask_selector_node import NODE_CLASS_MAPPINGS as MASKSELECT_NODE_CLASS_MAPPINGS
|
|
from .mask_selector_node import NODE_DISPLAY_NAME_MAPPINGS as MASKSELECT_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .page_narration_remover_node import NODE_CLASS_MAPPINGS as NARRATION_NODE_CLASS_MAPPINGS
|
|
from .page_narration_remover_node import NODE_DISPLAY_NAME_MAPPINGS as NARRATION_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .text_list_node import NODE_CLASS_MAPPINGS as TEXTLIST_NODE_CLASS_MAPPINGS
|
|
from .text_list_node import NODE_DISPLAY_NAME_MAPPINGS as TEXTLIST_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .mask_preview_node import NODE_CLASS_MAPPINGS as MASKPREVIEW_NODE_CLASS_MAPPINGS
|
|
from .mask_preview_node import NODE_DISPLAY_NAME_MAPPINGS as MASKPREVIEW_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .utf8_converter_node import NODE_CLASS_MAPPINGS as UTF8_NODE_CLASS_MAPPINGS
|
|
from .utf8_converter_node import NODE_DISPLAY_NAME_MAPPINGS as UTF8_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .openai_node import NODE_CLASS_MAPPINGS as OPENAI_NODE_CLASS_MAPPINGS
|
|
from .openai_node import NODE_DISPLAY_NAME_MAPPINGS as OPENAI_NODE_DISPLAY_NAME_MAPPINGS
|
|
# 新增:颜色匹配器节点
|
|
from .color_matcher_node import NODE_CLASS_MAPPINGS as COLORMATCHER_NODE_CLASS_MAPPINGS
|
|
from .color_matcher_node import NODE_DISPLAY_NAME_MAPPINGS as COLORMATCHER_NODE_DISPLAY_NAME_MAPPINGS
|
|
# 新增:素材拆分节点
|
|
from .image_splitter_node import NODE_CLASS_MAPPINGS as IMAGESPLITTER_NODE_CLASS_MAPPINGS
|
|
from .image_splitter_node import NODE_DISPLAY_NAME_MAPPINGS as IMAGESPLITTER_NODE_DISPLAY_NAME_MAPPINGS
|
|
# 新增:SDMatte 精细抠图节点(依赖 diffusers/transformers,缺失时不影响其余节点加载)
|
|
try:
|
|
from .sdmatte_node import NODE_CLASS_MAPPINGS as SDMATTE_NODE_CLASS_MAPPINGS
|
|
from .sdmatte_node import NODE_DISPLAY_NAME_MAPPINGS as SDMATTE_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] SDMatte 节点未加载:{_e}")
|
|
print("[Ruinode] 如需使用,请安装:pip install diffusers transformers safetensors scipy opencv-python")
|
|
SDMATTE_NODE_CLASS_MAPPINGS = {}
|
|
SDMATTE_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# 新增:ZenMux API 连接节点(聚合平台,厂商→模型二级选择,标签含价格)
|
|
# 同样用 try/except 保护:万一快照损坏或依赖缺失,不连累其余节点加载
|
|
try:
|
|
from .zenmux import NODE_CLASS_MAPPINGS as ZENMUX_NODE_CLASS_MAPPINGS
|
|
from .zenmux import NODE_DISPLAY_NAME_MAPPINGS as ZENMUX_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] ZenMux 节点未加载:{_e}")
|
|
ZENMUX_NODE_CLASS_MAPPINGS = {}
|
|
ZENMUX_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# 新增:越光 API 连接节点(OpenAI 兼容,模型清单与价格内置)
|
|
try:
|
|
from .yueguang import NODE_CLASS_MAPPINGS as YUEGUANG_NODE_CLASS_MAPPINGS
|
|
from .yueguang import NODE_DISPLAY_NAME_MAPPINGS as YUEGUANG_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] 越光 API 节点未加载:{_e}")
|
|
YUEGUANG_NODE_CLASS_MAPPINGS = {}
|
|
YUEGUANG_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# 新增:Markdown 转图片节点(阅读器级排版渲染)
|
|
try:
|
|
from .markdown_image_node import NODE_CLASS_MAPPINGS as MDIMG_NODE_CLASS_MAPPINGS
|
|
from .markdown_image_node import NODE_DISPLAY_NAME_MAPPINGS as MDIMG_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] Markdown转图片 节点未加载:{_e}")
|
|
MDIMG_NODE_CLASS_MAPPINGS = {}
|
|
MDIMG_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# 新增:多行文本框(原样输出,规避 WAS Text Multiline 吞 "#" 行的问题)
|
|
from .text_box_node import NODE_CLASS_MAPPINGS as TEXTBOX_NODE_CLASS_MAPPINGS
|
|
from .text_box_node import NODE_DISPLAY_NAME_MAPPINGS as TEXTBOX_NODE_DISPLAY_NAME_MAPPINGS
|
|
# 新增:FeyNobg 全自动抠图节点(BiRefNet 系,内嵌 nobg 推理子集)
|
|
try:
|
|
from .feynobg_node import NODE_CLASS_MAPPINGS as FEYNOBG_NODE_CLASS_MAPPINGS
|
|
from .feynobg_node import NODE_DISPLAY_NAME_MAPPINGS as FEYNOBG_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] FeyNobg 抠图 节点未加载:{_e}")
|
|
FEYNOBG_NODE_CLASS_MAPPINGS = {}
|
|
FEYNOBG_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# 新增:八方向序列拆分节点(8方向行走动画管线)
|
|
try:
|
|
from .eightdir_node import NODE_CLASS_MAPPINGS as EIGHTDIR_NODE_CLASS_MAPPINGS
|
|
from .eightdir_node import NODE_DISPLAY_NAME_MAPPINGS as EIGHTDIR_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] 八方向序列拆分 节点未加载:{_e}")
|
|
EIGHTDIR_NODE_CLASS_MAPPINGS = {}
|
|
EIGHTDIR_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# 新增:像素化节点(面向像素游戏资产:网格检测/主导色降采样/调色板量化/抖动)
|
|
try:
|
|
from .pixelate_node import NODE_CLASS_MAPPINGS as PIXELATE_NODE_CLASS_MAPPINGS
|
|
from .pixelate_node import NODE_DISPLAY_NAME_MAPPINGS as PIXELATE_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] 像素化 节点未加载:{_e}")
|
|
PIXELATE_NODE_CLASS_MAPPINGS = {}
|
|
PIXELATE_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# 新增:Lucida 全自动抠图节点(BiRefNet_HR 微调,擅长文字/Logo/插画/玻璃)
|
|
try:
|
|
from .lucida_node import NODE_CLASS_MAPPINGS as LUCIDA_NODE_CLASS_MAPPINGS
|
|
from .lucida_node import NODE_DISPLAY_NAME_MAPPINGS as LUCIDA_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] Lucida 抠图 节点未加载:{_e}")
|
|
LUCIDA_NODE_CLASS_MAPPINGS = {}
|
|
LUCIDA_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# 新增:半透明抠图节点(Unmult 纯数学去底,适合光效/火焰/粒子/UI 特效)
|
|
from .unmult_node import NODE_CLASS_MAPPINGS as UNMULT_NODE_CLASS_MAPPINGS
|
|
from .unmult_node import NODE_DISPLAY_NAME_MAPPINGS as UNMULT_NODE_DISPLAY_NAME_MAPPINGS
|
|
# 新增:加载透明视频节点(显式 libvpx 解码,取出 WebM 边带里的 alpha)
|
|
try:
|
|
from .load_video_alpha_node import NODE_CLASS_MAPPINGS as LOADVIDA_NODE_CLASS_MAPPINGS
|
|
from .load_video_alpha_node import NODE_DISPLAY_NAME_MAPPINGS as LOADVIDA_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] 加载透明视频 节点未加载:{_e}")
|
|
LOADVIDA_NODE_CLASS_MAPPINGS = {}
|
|
LOADVIDA_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# 新增:满屏文字水印节点(平铺文字 + 旋转/密度/透明度/颜色可调)
|
|
try:
|
|
from .watermark_node import NODE_CLASS_MAPPINGS as WATERMARK_NODE_CLASS_MAPPINGS
|
|
from .watermark_node import NODE_DISPLAY_NAME_MAPPINGS as WATERMARK_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e:
|
|
print(f"[Ruinode] 满屏文字水印 节点未加载:{_e}")
|
|
WATERMARK_NODE_CLASS_MAPPINGS = {}
|
|
WATERMARK_NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
|
|
# 合并节点映射字典
|
|
NODE_CLASS_MAPPINGS = {}
|
|
NODE_CLASS_MAPPINGS.update(SAT_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(FLIP_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(LOAD_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(LOAD_NAME_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(QWEN_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(SHOT_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(DIALOGUE_NODE_CLASS_MAPPINGS)
|
|
# 新增:合并遮罩筛选节点
|
|
NODE_CLASS_MAPPINGS.update(MASKSELECT_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(NARRATION_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(TEXTLIST_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(MASKPREVIEW_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(UTF8_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(OPENAI_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(COLORMATCHER_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(IMAGESPLITTER_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(SDMATTE_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(ZENMUX_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(YUEGUANG_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(MDIMG_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(TEXTBOX_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(WATERMARK_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(FEYNOBG_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(LUCIDA_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(PIXELATE_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(EIGHTDIR_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(UNMULT_NODE_CLASS_MAPPINGS)
|
|
NODE_CLASS_MAPPINGS.update(LOADVIDA_NODE_CLASS_MAPPINGS)
|
|
|
|
# 合并节点显示名称映射
|
|
NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(SAT_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(FLIP_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(LOAD_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(LOAD_NAME_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(QWEN_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(SHOT_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(DIALOGUE_NODE_DISPLAY_NAME_MAPPINGS)
|
|
# 新增:合并遮罩筛选节点显示名
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(MASKSELECT_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(NARRATION_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(TEXTLIST_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(MASKPREVIEW_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(UTF8_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(OPENAI_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(COLORMATCHER_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(IMAGESPLITTER_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(SDMATTE_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(ZENMUX_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(YUEGUANG_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(MDIMG_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(TEXTBOX_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(WATERMARK_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(FEYNOBG_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(LUCIDA_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(PIXELATE_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(EIGHTDIR_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(UNMULT_NODE_DISPLAY_NAME_MAPPINGS)
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(LOADVIDA_NODE_DISPLAY_NAME_MAPPINGS)
|
|
|
|
# 前端资源目录:修正节点内视频预览被 art-venture 的全局 CSS 裁切的问题
|
|
WEB_DIRECTORY = "./web"
|
|
|
|
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY']
|