diff --git a/apps/api/app/api/routes/generation_tasks.py b/apps/api/app/api/routes/generation_tasks.py index 36083b5ce..36c11f709 100644 --- a/apps/api/app/api/routes/generation_tasks.py +++ b/apps/api/app/api/routes/generation_tasks.py @@ -259,7 +259,7 @@ def create_generation_task( ) except Exception as e: logger.error("[生成任务] 创建失败: %s", e, exc_info=True) - raise HTTPException(status_code=500, detail=f"创建生成任务失败: {e}") + raise HTTPException(status_code=500, detail="创建生成任务失败,请稍后重试或查看任务日志") items = [_to_generation_task_response(t) for t in created_tasks] return BatchGenerationTaskResponse(items=items, total=len(items)) diff --git a/apps/worker/worker_app/tasks/generation.py b/apps/worker/worker_app/tasks/generation.py index 58322695f..2d829ce66 100755 --- a/apps/worker/worker_app/tasks/generation.py +++ b/apps/worker/worker_app/tasks/generation.py @@ -343,6 +343,8 @@ def _download_library_assets( asset_ids: list[str] | None = None, video_extensions: tuple = (".mp4", ".mov", ".avi", ".mkv", ".webm"), strict: bool = True, + task_id: str = "", + gen_task=None, ) -> list[Path]: """下载视频素材 — 同时支持素材库模式和项目级模式。 @@ -442,19 +444,65 @@ def _download_library_assets( storage_key = asset.file_url if asset.file_url else None if not storage_key: failed_assets.append(f"{asset.name}({asset.id})") - logger.warning("素材缺少 file_url, 跳过: asset_id=%s name=%s", asset.id, asset.name) + logger.warning( + "[task_id=%s] 素材缺少 file_url, 跳过: asset_id=%s name=%s", task_id, asset.id, asset.name + ) + if gen_task: + gen_task.append_log( + "下载素材", + f"素材缺少file_url, 跳过", + level="WARN", + asset_id=asset.id, + asset_name=asset.name, + success=False, + file_size=0, + duration=0.0, + ) if strict: raise RuntimeError(f"素材缺少 file_url: asset_id={asset.id}, name={asset.name}") continue ext = Path(storage_key).suffix or ".mp4" local_file = temp_path / f"asset_{i:03d}_{asset.id}{ext}" - if download_asset(storage_key, local_file): + asset_start = time.monotonic() + download_ok = download_asset(storage_key, local_file) + asset_elapsed = time.monotonic() - asset_start + + if download_ok: + file_size = local_file.stat().st_size if local_file.exists() else 0 downloaded.append(local_file) - logger.info("Downloaded asset: %s -> %s", asset.name, local_file) + logger.info( + "[task_id=%s] Downloaded asset: %s -> %s (size=%d, time=%.1fs)", + task_id, + asset.name, + local_file, + file_size, + asset_elapsed, + ) + if gen_task: + gen_task.append_log( + "下载素材", + f"下载成功: {asset.name}", + asset_id=asset.id, + asset_name=asset.name, + success=True, + file_size=file_size, + duration=round(asset_elapsed, 2), + ) else: failed_assets.append(f"{asset.name}({asset.id})") - logger.warning("Failed to download asset: %s (id=%s)", asset.name, asset.id) + logger.warning("[task_id=%s] Failed to download asset: %s (id=%s)", task_id, asset.name, asset.id) + if gen_task: + gen_task.append_log( + "下载素材", + f"下载失败: {asset.name}", + level="WARN", + asset_id=asset.id, + asset_name=asset.name, + success=False, + file_size=0, + duration=round(asset_elapsed, 2), + ) if strict: raise RuntimeError(f"素材下载失败: asset_id={asset.id}, name={asset.name}") @@ -598,6 +646,8 @@ def generate_video(self, task_id: str) -> dict: asset_library_id=asset_library_id, project_id=project_id, asset_ids=task_asset_ids or None, + task_id=task_id, + gen_task=gen_task, ) download_elapsed = time.monotonic() - download_start logger.info(