From 8de7c5188fb3410ad7bca2128e9b202231702e86 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 13 Aug 2026 17:31:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(cover):=20=E4=BF=AE=E5=A4=8D=20OSS=20?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=8F=8C=E6=96=9C=E6=9D=A0=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=20MediaKit=20404?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:模板编辑器草稿不属于任何项目(project_id=''),Worker 构建 storage_key 时 f'generated/projects/{project_id}/tasks/...' 产生 projects//tasks/ 双斜杠路径。文件实际上传到 OSS(URL 返回 200), 但 MediaKit 的 HTTP 客户端规范化 URL(合并 // 为 /),导致 404。 修复(4 层防御): 1. Worker: _upload_and_record 过滤空路径段,新文件不再产生 // 2. cover.py: 获取 URL 后规范化,处理历史脏数据 3. generation.py: _get_task_output_url 规范化复用产物 URL 4. ai_service.py: _call_ai_cover_service 入口规范化,不依赖调用方 新增单测: test_call_ai_cover_url_double_slash_normalized --- .../app/api/routes/templates_editor/cover.py | 6 ++++ .../api/routes/templates_editor/generation.py | 7 ++++- apps/worker/worker_app/tasks/generation.py | 4 ++- packages/shared/ai_service.py | 5 ++++ tests/unit/test_mediakit_cover.py | 28 +++++++++++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/apps/api/app/api/routes/templates_editor/cover.py b/apps/api/app/api/routes/templates_editor/cover.py index a112942d7..59a5a6ad9 100755 --- a/apps/api/app/api/routes/templates_editor/cover.py +++ b/apps/api/app/api/routes/templates_editor/cover.py @@ -137,6 +137,12 @@ def editor_generate_cover( storage_svc = get_shared_storage_service() primary_video_url = storage_svc.get_url(rendered_storage_key) + # 防御性规范化:合并路径中的双斜杠(// -> /),但保留协议头的 :// + # 历史数据中 project_id 为空时会产生 projects//tasks/ 路径, + # MediaKit 的 HTTP 客户端会规范化 URL 导致 404 + if primary_video_url: + import re as _re + primary_video_url = _re.sub(r'(? str: use_case = ListGeneratedVideosByTaskUseCase(video_repo) videos = use_case.execute(task.id) if videos: - return getattr(videos[0], "file_url", "") or "" + url = getattr(videos[0], "file_url", "") or "" + # 规范化:合并路径中的双斜杠(保留协议头 ://) + if url: + import re as _re + url = _re.sub(r"(? Date: Thu, 13 Aug 2026 09:37:28 +0000 Subject: [PATCH 2/2] style: auto-format with black + isort + prettier [skip ci-format-check] --- packages/shared/ai_service.py | 1 + tests/unit/test_mediakit_cover.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared/ai_service.py b/packages/shared/ai_service.py index c544116ab..b5e7f0ff3 100755 --- a/packages/shared/ai_service.py +++ b/packages/shared/ai_service.py @@ -399,6 +399,7 @@ def _call_ai_cover_service( # 规范化 URL:合并路径中的双斜杠(保留协议头 ://) # 历史数据中 project_id 为空时 OSS key 会出现 projects//tasks/ 路径 import re as _re + primary_video_url = _re.sub(r"(?