| import gradio as gr
|
| import spaces
|
| from huggingface_hub import hf_hub_download
|
| import requests
|
| import json
|
| import time
|
| import random
|
| import os
|
|
|
|
|
| def download_models():
|
| print("📥 Downloading models...")
|
|
|
| hf_hub_download("Comfy-Org/Qwen-Image-Edit_ComfyUI", "split_files/diffusion_models/qwen_image_edit_2509_fp8_e4m3fn.safetensors", local_dir="models/diffusion_models", force_download=False)
|
| hf_hub_download("Comfy-Org/Qwen-Image_ComfyUI", "split_files/vae/qwen_image_vae.safetensors", local_dir="models/vae", force_download=False)
|
| hf_hub_download("Comfy-Org/Qwen-Image_ComfyUI", "split_files/text_encoders/qwen_2.5_vl_7b_fp8_scaled.safetensors", local_dir="models/text_encoders", force_download=False)
|
| hf_hub_download("lightx2v/Qwen-Image-Lightning", "Qwen-Image-Edit-2509/Qwen-Image-Edit-2509-Lightning-4steps-V1.0-bf16.safetensors", local_dir="models/loras", force_download=False)
|
|
|
|
|
| hf_hub_download("Comfy-Org/Wan_2.2_ComfyUI_Repackaged", "split_files/vae/wan_2.1_vae.safetensors", local_dir="models/vae", force_download=False)
|
| hf_hub_download("NSFW-API/NSFW-Wan-UMT5-XXL", "nsfw_wan_umt5-xxl_fp8_scaled.safetensors", local_dir="models/text_encoders", force_download=False)
|
| hf_hub_download("FX-FeiHou/wan2.2-Remix", "NSFW/Wan2.2_Remix_NSFW_i2v_14b_low_lighting_v2.0.safetensors", local_dir="models/diffusion_models", force_download=False)
|
| hf_hub_download("FX-FeiHou/wan2.2-Remix", "NSFW/Wan2.2_Remix_NSFW_i2v_14b_high_lighting_v2.0.safetensors", local_dir="models/diffusion_models", force_download=False)
|
| hf_hub_download("Comfy-Org/Wan_2.2_ComfyUI_Repackaged", "split_files/loras/wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors", local_dir="models/loras", force_download=False)
|
| hf_hub_download("Comfy-Org/Wan_2.2_ComfyUI_Repackaged", "split_files/loras/wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors", local_dir="models/loras", force_download=False)
|
|
|
| print("✅ Models ready!")
|
|
|
| download_models()
|
|
|
| COMFY_URL = "http://127.0.0.1:8188"
|
|
|
| @spaces.GPU(duration=180)
|
| def run_workflow(prompt_image, prompt_video, bedroom_image, woman_image, steps, cfg, length, seed):
|
| if bedroom_image is None or woman_image is None:
|
| return None, None, "❌ Naloži obe sliki!"
|
|
|
| if seed == -1:
|
| seed = random.randint(0, 999999999)
|
|
|
| try:
|
| with open("workflow_api.json", "r") as f:
|
| workflow = json.load(f)
|
|
|
|
|
|
|
| response = requests.post(f"{COMFY_URL}/prompt", json={"prompt": workflow})
|
| prompt_id = response.json().get("prompt_id")
|
|
|
| status = f"🔄 Running workflow... (ID: {prompt_id})"
|
|
|
|
|
| for _ in range(120):
|
| time.sleep(3)
|
| history = requests.get(f"{COMFY_URL}/history/{prompt_id}").json()
|
| if prompt_id in history:
|
| status = "✅ Workflow finished!"
|
| break
|
|
|
| return None, None, status
|
|
|
| except Exception as e:
|
| return None, None, f"Error: {str(e)}"
|
|
|
| with gr.Blocks(title="Wan2.2 Video Generator") as demo:
|
| gr.Markdown("# 🛏️ Qwen Image Edit + Wan2.2 Video")
|
|
|
| with gr.Row():
|
| with gr.Column():
|
| prompt_image = gr.Textbox(label="Prompt za sliko", lines=3, value="Natural integration, cozy bedroom...")
|
| prompt_video = gr.Textbox(label="Prompt za video", lines=3, value="smooth cinematic motion...")
|
|
|
| with gr.Row():
|
| img1 = gr.Image(label="Image 1", type="filepath")
|
| img2 = gr.Image(label="Image 2", type="filepath")
|
|
|
| with gr.Accordion("Advanced", open=False):
|
| steps = gr.Slider(1, 20, value=4, step=1, label="Steps")
|
| cfg = gr.Slider(0.5, 3.0, value=1.0, step=0.1, label="CFG")
|
| length = gr.Slider(16, 121, value=81, step=1, label="Video Length")
|
| seed = gr.Number(value=-1, label="Seed (-1 = random)")
|
|
|
| btn = gr.Button("🚀 Generate", variant="primary")
|
|
|
| with gr.Column():
|
| out_image = gr.Image(label="Generated Image")
|
| out_video = gr.Video(label="Generated Video")
|
| status = gr.Textbox(label="Status", interactive=False)
|
|
|
| btn.click(
|
| run_workflow,
|
| inputs=[prompt_image, prompt_video, img1, img2, steps, cfg, length, seed],
|
| outputs=[out_image, out_video, status]
|
| )
|
|
|
| if __name__ == "__main__":
|
| demo.launch(server_name="0.0.0.0", server_port=7860, theme=gr.themes.Soft()) |