diff --git a/server.py b/server.py index 60a8bfd..2ec4e5b 100644 --- a/server.py +++ b/server.py @@ -222,6 +222,14 @@ def generate_video(prompt): # Логируем структуру для диагностики logger.info(f"📋 History keys: {list(history.keys())}") + + # Проверяем статус выполнения — ComfyUI может сообщать об ошибках тут + if "status" in history: + status_info = history["status"] + logger.info(f"📋 Execution status: {json.dumps(status_info)}") + if status_info.get("status_str") == "error": + logger.error(f"❌ ComfyUI execution error! Messages: {status_info.get('messages', [])}") + if "outputs" in history: logger.info(f"📋 Output nodes: {list(history['outputs'].keys())}") for node_id, node_output in history["outputs"].items(): @@ -263,11 +271,17 @@ def generate_video(prompt): logger.error(f"❌ File not found: {video_path}") continue + file_size = os.path.getsize(video_path) + logger.info(f"📏 Video file size: {file_size} bytes ({file_size/1024:.1f} KB)") + with open(video_path, "rb") as f: video_b64 = base64.b64encode(f.read()).decode("utf-8") logger.info(f"✅ Video loaded: {len(video_b64)} chars base64") + if file_size < 50000: + logger.warning(f"⚠️ Video suspiciously small ({file_size} bytes) — likely black/empty frames!") + # Очистка try: os.remove(video_path) @@ -516,6 +530,31 @@ def comfyui_status(): return jsonify(result) +@app.route("/comfyui/logs", methods=["GET"]) +def comfyui_logs(): + """Получить последние логи ComfyUI — без авторизации. ?lines=100""" + lines = request.args.get("lines", "100") + try: + result = subprocess.run( + ["journalctl", "-u", "comfyui", "-n", str(lines), "--no-pager"], + capture_output=True, text=True, timeout=10 + ) + return jsonify({"logs": result.stdout, "stderr": result.stderr}) + except Exception as e: + return jsonify({"error": str(e)}) + + +@app.route("/comfyui/system_stats", methods=["GET"]) +def comfyui_system_stats(): + """Проксирует system_stats из ComfyUI — без авторизации.""" + try: + url = f"http://{COMFY_HOST}:{COMFY_PORT}/system_stats" + with urllib.request.urlopen(url, timeout=5) as resp: + return jsonify(json.loads(resp.read())) + except Exception as e: + return jsonify({"error": str(e)}) + + @app.route("/run", methods=["POST"]) def run_job(): """Отправляет задачу в очередь. Возвращает job_id сразу."""