feat: 更新 webui 界面以支持新功能

This commit is contained in:
linyq 2025-11-19 20:36:14 +08:00
parent 238c1c13f1
commit 5254798464

View File

@ -131,18 +131,11 @@ def render_generate_button():
"""渲染生成按钮和处理逻辑""" """渲染生成按钮和处理逻辑"""
if st.button(tr("Generate Video"), use_container_width=True, type="primary"): if st.button(tr("Generate Video"), use_container_width=True, type="primary"):
from app.services import task as tm from app.services import task as tm
from app.services import state as sm
# 重置日志容器和记录 from app.models import const
log_container = st.empty() import threading
log_records = [] import time
import uuid
def log_received(msg):
with log_container:
log_records.append(msg)
st.code("\n".join(log_records))
from loguru import logger
logger.add(log_received)
config.save_config() config.save_config()
@ -155,9 +148,6 @@ def render_generate_button():
st.error(tr("视频文件不能为空")) st.error(tr("视频文件不能为空"))
return return
st.toast(tr("生成视频"))
logger.info(tr("开始生成视频"))
# 获取所有参数 # 获取所有参数
script_params = script_settings.get_script_params() script_params = script_settings.get_script_params()
video_params = video_settings.get_video_params() video_params = video_settings.get_video_params()
@ -175,29 +165,61 @@ def render_generate_button():
# 创建参数对象 # 创建参数对象
params = VideoClipParams(**all_params) params = VideoClipParams(**all_params)
# 使用新的统一裁剪策略不再需要预裁剪的subclip_videos
# 生成一个新的task_id用于本次处理 # 生成一个新的task_id用于本次处理
import uuid
task_id = str(uuid.uuid4()) task_id = str(uuid.uuid4())
result = tm.start_subclip_unified( # 创建进度条
task_id=task_id, progress_bar = st.progress(0)
params=params status_text = st.empty()
)
video_files = result.get("videos", []) def run_task():
st.success(tr("视生成完成")) try:
tm.start_subclip_unified(
task_id=task_id,
params=params
)
except Exception as e:
logger.error(f"任务执行失败: {e}")
sm.state.update_task(task_id, state=const.TASK_STATE_FAILED, message=str(e))
try: # 在新线程中启动任务
if video_files: thread = threading.Thread(target=run_task)
player_cols = st.columns(len(video_files) * 2 + 1) thread.start()
for i, url in enumerate(video_files):
player_cols[i * 2 + 1].video(url) # 轮询任务状态
except Exception as e: while True:
logger.error(f"播放视频失败: {e}") task = sm.state.get_task(task_id)
if task:
progress = task.get("progress", 0)
state = task.get("state")
# 更新进度条
progress_bar.progress(progress / 100)
status_text.text(f"Processing... {progress}%")
if state == const.TASK_STATE_COMPLETE:
status_text.text(tr("视频生成完成"))
progress_bar.progress(1.0)
# 显示结果
video_files = task.get("videos", [])
try:
if video_files:
player_cols = st.columns(len(video_files) * 2 + 1)
for i, url in enumerate(video_files):
player_cols[i * 2 + 1].video(url)
except Exception as e:
logger.error(f"播放视频失败: {e}")
st.success(tr("视频生成完成"))
break
elif state == const.TASK_STATE_FAILED:
st.error(f"任务失败: {task.get('message', 'Unknown error')}")
break
time.sleep(0.5)
# file_utils.open_task_folder(config.root_dir, task_id)
logger.info(tr("视频生成完成"))
def main(): def main():