HailuoAI / app.py
LTTEAM's picture
Update app.py
deeab35 verified
import os
import shutil
import gradio as gr
from runner import AutomationRunner
COOKIES_FILE = "cookies.json"
def clean_workspace():
for d in ("outputs", "images"):
if os.path.exists(d):
shutil.rmtree(d)
os.makedirs(d, exist_ok=True)
def run_automation(prompts, avatar, cookies_file, headless, wait_time, mode):
clean_workspace()
# 1) Lưu cookies.json nếu user upload
if cookies_file is not None:
shutil.copy(cookies_file.name, COOKIES_FILE)
# 2) Ghi prompt vào input.txt
with open("input.txt", "w", encoding="utf-8") as f:
f.write(prompts)
# 3) Lưu ảnh nhân vật nếu có
avatar_path = None
if avatar is not None:
avatar.save(os.path.join("images", avatar.name))
avatar_path = os.path.abspath(os.path.join("images", avatar.name))
logs = []
def log_cb(msg):
logs.append(msg)
# 4) Chạy automation
runner = AutomationRunner(
headless=headless,
wait_time=wait_time,
avatar_image_path=avatar_path,
video_folder="outputs",
mode=mode,
log_callback=log_cb
)
runner.run()
# 5) Thu thập video đầu ra
videos = sorted(
[os.path.join("outputs", f) for f in os.listdir("outputs") if f.endswith(".mp4")]
)
return "\n".join(logs), videos
with gr.Blocks() as demo:
gr.Markdown("## HaiLuo AI Video Automation")
with gr.Row():
with gr.Column(scale=2):
prompts = gr.Textbox(
lines=8,
label="Nhập các Scene (mỗi dòng `Scene X: ...`)",
value="Scene 1: "
)
avatar = gr.File(
label="Ảnh nhân vật (tuỳ chọn)",
file_count="single", # sửa thành "single"
file_types=["image"] # hoặc cụ thể hơn ["png","jpg","jpeg"]
)
cookies_file = gr.File(
label="Upload cookies.json (bắt buộc lần đầu)",
file_count="single", # sửa thành "single"
file_types=[".json"]
)
mode = gr.Radio(
["subject", "text"],
label="Chế độ",
value="subject"
)
headless = gr.Checkbox(
label="Chạy headless",
value=True
)
wait_time = gr.Slider(
60, 1800,
value=600,
step=30,
label="Thời gian chờ (giây)"
)
run_btn = gr.Button("🚀 Chạy Automation")
with gr.Column(scale=1):
log_output = gr.Textbox(
lines=15,
label="Logs",
interactive=False
)
video_out = gr.File(
label="Download Videos",
file_count="multiple"
)
run_btn.click(
run_automation,
inputs=[prompts, avatar, cookies_file, headless, wait_time, mode],
outputs=[log_output, video_out]
)
if __name__ == "__main__":
demo.launch()