From 5a9e3fdb5edc0d166922f1067cf97ec6747d9cc7 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Fri, 28 Aug 2026 15:10:40 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20thumbnail=5Furl=E6=9C=AA=E5=86=99?= =?UTF-8?q?=E5=85=A5generated=5Fvideos=E8=A1=A8=20+=20=E7=BC=A9=E7=95=A5?= =?UTF-8?q?=E5=9B=BE=E5=AD=98=E5=82=A8key=E9=81=BF=E5=85=8D=E8=A6=86?= =?UTF-8?q?=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug 1: render_adapter渲染完成后thumbnail_url未传递给create_video_record_and_dedup - _render_from_edit_plan 补充返回 result.thumbnail_url - _upload_and_record 新增 thumbnail_url 参数并透传 - generate_video 调用处同步更新 Bug 2: 缩略图存储key rendered/{plan_id}/thumbnail.jpg 导致同plan多次渲染互相覆盖 - 改为 rendered/{plan_id}/thumbnails/{task_id}.jpg --- apps/worker/video_processing/render_adapter.py | 2 +- apps/worker/worker_app/tasks/generation.py | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/worker/video_processing/render_adapter.py b/apps/worker/video_processing/render_adapter.py index 4f5cb5444..ccfa15838 100755 --- a/apps/worker/video_processing/render_adapter.py +++ b/apps/worker/video_processing/render_adapter.py @@ -580,7 +580,7 @@ class RenderAdapter: try: from video_processing.thumbnail_generator import generate_and_upload_thumbnail - thumb_storage_key = f"rendered/{plan_id}/thumbnail.jpg" + thumb_storage_key = f"rendered/{plan_id}/thumbnails/{job_id}.jpg" thumbnail_url = generate_and_upload_thumbnail(str(result.output_path), thumb_storage_key) except Exception as thumb_err: logger.warning( diff --git a/apps/worker/worker_app/tasks/generation.py b/apps/worker/worker_app/tasks/generation.py index 8dbbde32b..71bc47b1b 100644 --- a/apps/worker/worker_app/tasks/generation.py +++ b/apps/worker/worker_app/tasks/generation.py @@ -389,6 +389,7 @@ def _upload_and_record( editing_mode, user_id: str = "", video_name: str = "", + thumbnail_url: str = "", ) -> tuple[str, float, int, int]: """上传 OSS、创建视频记录并查重。 @@ -447,6 +448,7 @@ def _upload_and_record( mode=editing_mode.value, session=dedup_session, name=video_name, + thumbnail_url=thumbnail_url, ) finally: dedup_session.close() @@ -535,11 +537,11 @@ def _render_from_edit_plan( task_id: str, source_edit_plan_id: str, task_info: dict, -) -> tuple[Path, float, list[dict] | None, str | None, str | None]: +) -> tuple[Path, float, list[dict] | None, str | None, str | None, str]: """从 EditPlan 数据库记录直接渲染(不再内存重建clips)。 Returns: - (output_path, render_duration, cover_candidates, voiceover_path, temp_dir) + (output_path, render_duration, cover_candidates, voiceover_path, temp_dir, thumbnail_url) """ from video_processing.render_adapter import RenderAdapter from worker_app.db import SessionLocal @@ -580,7 +582,7 @@ def _render_from_edit_plan( cover_candidates = getattr(result, "cover_candidates", None) render_temp_dir = getattr(result, "temp_dir", None) - return output_path, result.duration, cover_candidates, voiceover_path, render_temp_dir + return output_path, result.duration, cover_candidates, voiceover_path, render_temp_dir, result.thumbnail_url or "" finally: db.close() @@ -692,7 +694,7 @@ def generate_video(self, task_id: str) -> dict: gen_task.append_log("渲染模式", "从草稿数据渲染(与预览一致)") _flush_logs(task_id, gen_task) - output_path, render_duration, cover_candidates, voiceover_tmp_path, render_temp_dir = ( + output_path, render_duration, cover_candidates, voiceover_tmp_path, render_temp_dir, thumbnail_url = ( _render_from_edit_plan( task_id=task_id, source_edit_plan_id=source_edit_plan_id, @@ -717,6 +719,7 @@ def generate_video(self, task_id: str) -> dict: editing_mode=editing_mode, user_id=user_id, video_name=task_info.get("video_title", ""), + thumbnail_url=thumbnail_url, ) if gen_task: -- 2.54.0 From 87deb7e4675fb1a0cffa9a880f5f6b7c5c4790a1 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Fri, 28 Aug 2026 07:37:56 +0000 Subject: [PATCH 2/3] style: auto-format with black + isort + prettier [skip ci-format-check] --- apps/worker/worker_app/tasks/generation.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/worker/worker_app/tasks/generation.py b/apps/worker/worker_app/tasks/generation.py index 71bc47b1b..7915bd075 100644 --- a/apps/worker/worker_app/tasks/generation.py +++ b/apps/worker/worker_app/tasks/generation.py @@ -582,7 +582,14 @@ def _render_from_edit_plan( cover_candidates = getattr(result, "cover_candidates", None) render_temp_dir = getattr(result, "temp_dir", None) - return output_path, result.duration, cover_candidates, voiceover_path, render_temp_dir, result.thumbnail_url or "" + return ( + output_path, + result.duration, + cover_candidates, + voiceover_path, + render_temp_dir, + result.thumbnail_url or "", + ) finally: db.close() -- 2.54.0 From 1b19e17cb7e6b4997136f642e2867836302f23a5 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Fri, 28 Aug 2026 15:47:15 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20AI=20Code=20Review=20=E6=BE=84?= =?UTF-8?q?=E6=B8=85=E6=B3=A8=E9=87=8A=20-=20job=5Fid=E6=98=AF=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=8F=82=E6=95=B0=20+=20thumbnail=5Furl=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E6=9E=84=E9=80=A0=E5=87=BD=E6=95=B0=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/worker/video_processing/render_adapter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/worker/video_processing/render_adapter.py b/apps/worker/video_processing/render_adapter.py index ccfa15838..c52f3b2d0 100755 --- a/apps/worker/video_processing/render_adapter.py +++ b/apps/worker/video_processing/render_adapter.py @@ -575,11 +575,12 @@ class RenderAdapter: self._report_progress(progress_cb, 90.0, "生成封面缩略图") - # 6. 生成封面缩略图 + # 6. 生成封面缩略图(结果通过 RenderAdapterResult.thumbnail_url 返回给调用方) thumbnail_url = "" try: from video_processing.thumbnail_generator import generate_and_upload_thumbnail + # job_id 是 _do_render 方法的参数(参见方法签名) thumb_storage_key = f"rendered/{plan_id}/thumbnails/{job_id}.jpg" thumbnail_url = generate_and_upload_thumbnail(str(result.output_path), thumb_storage_key) except Exception as thumb_err: -- 2.54.0