# -*- coding: utf-8 -*- """ File video_preview.py Author charon Date 2025/9/6 07:01 """ import os import requests import urllib.parse from uuid import uuid4 import folder_paths class VideoDownloaderNode: OUTPUT_DIR = folder_paths.get_input_directory() def __init__(self): pass @classmethod def INPUT_TYPES(s): """ 定义节点的输入参数。 """ return { "required": { "url": ("STRING", { "multiline": False, "default": "视频链接" }), "filename": ("STRING", { "multiline": False, "default": "" }), } } RETURN_TYPES = ("STRING",) RETURN_NAMES = ("file_path",) FUNCTION = "download_video" CATEGORY = "不忘科技-自定义节点🚩/utils/下载视频" def download_video(self, url, filename=""): if not url or not url.strip().startswith('http'): print("[VideoDownloader] 无效的URL,跳过下载。") return ("",) try: print(f"[VideoDownloader] 开始从 {url} 下载...") response = requests.get(url, stream=True, timeout=10) response.raise_for_status() if not filename.strip(): try: parsed_url = urllib.parse.urlparse(url) filename = os.path.basename(parsed_url.path) if not filename: raise ValueError except (ValueError, AttributeError): content_type = response.headers.get('content-type') ext = '.mp4' if content_type and '/' in content_type: mime_type = content_type.split('/')[1] if len(mime_type) < 5: # 简单的扩展名检查 ext = '.' + mime_type filename = f"downloaded_video_{uuid4().hex[:8]}{ext}" # 清理文件名,防止路径问题 safe_filename = "".join(c for c in filename if c.isalnum() or c in ('.', '_', '-')).strip() if not safe_filename: safe_filename = f"safe_video_{uuid4().hex[:8]}.mp4" file_path = os.path.join(self.OUTPUT_DIR, safe_filename) with open(file_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print(f"[VideoDownloader] 视频已成功下载到: {file_path}") ui_preview = { "videos": [{ "filename": safe_filename, "subfolder": "", "type": "input" }] } return {"ui": ui_preview, "result": (file_path,)} except requests.exceptions.RequestException as e: print(f"[VideoDownloader] 下载视频时出错: {e}") return ("",) # NODE_CLASS_MAPPINGS = { # "VideoDownloaderNode": VideoDownloaderNode # } # # NODE_DISPLAY_NAME_MAPPINGS = { # "VideoDownloaderNode": "视频下载器 (带预览)" # }