From e003a43894ece0586efa248e82f4bad1b7f867f2 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Sun, 19 Jul 2026 14:40:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(P0):=20=E7=B4=A0=E6=9D=90=E5=BA=93=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E4=B8=8A=E4=BC=A0=E6=97=B6=E7=94=9F=E6=88=90=E7=BC=A9?= =?UTF-8?q?=E7=95=A5=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ingest流程中添加视频缩略图生成(使用15%处抽帧) - 缩略图生成失败不影响主流程,仅打warning日志 - 修复素材库视频全部显示渐变占位图的问题 Issue: #577 --- apps/worker/worker_app/tasks/ingest.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/apps/worker/worker_app/tasks/ingest.py b/apps/worker/worker_app/tasks/ingest.py index a3e001e01..e2a8d6f5b 100755 --- a/apps/worker/worker_app/tasks/ingest.py +++ b/apps/worker/worker_app/tasks/ingest.py @@ -280,6 +280,7 @@ def ingest_asset(job_id: str) -> dict: # 先从 OSS 下载文件到本地临时目录,再提取元数据 # (storage_key 是 OSS 内部路径,不能直接传给 ffprobe/Pillow) local_file = None + thumbnail_url = None try: suffix = Path(job.storage_key).suffix or ".bin" with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tmp: @@ -291,6 +292,29 @@ def ingest_asset(job_id: str) -> dict: metadata, extract_success = {}, False else: metadata, extract_success = extract_media_metadata(str(local_file), media_type) + + # 视频类型:生成缩略图(文件还在的时候生成) + thumbnail_url = None + if media_type == "video" and extract_success: + try: + from video_processing.thumbnail_generator import generate_and_upload_thumbnail + + thumb_storage_key = f"assets/{job.project_id}/thumbnails/{job_id}.jpg" + thumbnail_url = generate_and_upload_thumbnail( + str(local_file), thumb_storage_key + ) + if thumbnail_url: + logger.info( + "素材缩略图生成成功: job_id=%s url=%s", + job_id, + thumbnail_url[:80], + ) + except Exception as thumb_err: + logger.warning( + "素材缩略图生成失败(不影响主流程): job_id=%s error=%s", + job_id, + thumb_err, + ) finally: if local_file and local_file.exists(): try: @@ -359,6 +383,7 @@ def ingest_asset(job_id: str) -> dict: codec=metadata.get("codec") or None, status=AssetStatus.READY, file_hash=job.file_hash, + thumbnail_url=thumbnail_url, ) asset_repo.create(asset)