From eb57d2a0fe17bfb980c03e8baec480eda717a853 Mon Sep 17 00:00:00 2001 From: linyq Date: Wed, 19 Nov 2025 20:36:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20webui=20=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E4=BB=A5=E6=94=AF=E6=8C=81=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui.py | 86 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 32 deletions(-) diff --git a/webui.py b/webui.py index e6af251..300650f 100644 --- a/webui.py +++ b/webui.py @@ -131,18 +131,11 @@ def render_generate_button(): """渲染生成按钮和处理逻辑""" if st.button(tr("Generate Video"), use_container_width=True, type="primary"): from app.services import task as tm - - # 重置日志容器和记录 - log_container = st.empty() - log_records = [] - - 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) + from app.services import state as sm + from app.models import const + import threading + import time + import uuid config.save_config() @@ -155,9 +148,6 @@ def render_generate_button(): st.error(tr("视频文件不能为空")) return - st.toast(tr("生成视频")) - logger.info(tr("开始生成视频")) - # 获取所有参数 script_params = script_settings.get_script_params() video_params = video_settings.get_video_params() @@ -175,29 +165,61 @@ def render_generate_button(): # 创建参数对象 params = VideoClipParams(**all_params) - # 使用新的统一裁剪策略,不再需要预裁剪的subclip_videos # 生成一个新的task_id用于本次处理 - import uuid task_id = str(uuid.uuid4()) - result = tm.start_subclip_unified( - task_id=task_id, - params=params - ) + # 创建进度条 + progress_bar = st.progress(0) + status_text = st.empty() - video_files = result.get("videos", []) - st.success(tr("视生成完成")) + def run_task(): + 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: - 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}") + # 在新线程中启动任务 + thread = threading.Thread(target=run_task) + thread.start() + + # 轮询任务状态 + while True: + 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():