fix(media): 修正转码任务认领与媒资 id 校验

This commit is contained in:
Zhou Weidong committed 2026-10-22 15:27:51 +08:00
1 parent ad84704d28
commit 5552caa6c1
8 files changed
+200 -101

No files matched your search

+80
View File
@@ -25625,3 +25625,83 @@ $ mvn -pl fruitshorts-admin-api -am test
解读:真实 ffmpeg smoke 已有进度回调且达到 90% 阶段点;长错误截断、
进度更新、僵尸任务收口、重复触发复用均通过。
## 2026-10-22 转码任务认领与媒资 ID 校验
- 分支:`feature/transcode-claim-fix`
- 基线:`develop` / `origin/develop` = `08eddc9`
- 计划:`docs/plans/2026-10-22-transcode-claim-fix.md`
### 现场补充取证
```text
transcode_task id=2113167358829924354
media_asset_id=21, episode_id=0, status=QUEUED,
source_url=/files/episode/202610/f1b105e185f2405d838c1066313a7ff9.mp4
media_asset id=21 存在且 source_url 相同
drama_episode id=13 使用同一 video_url,但 video_asset_id=0
```
解读:21 不是不存在的媒资,而是未绑定分集的合法媒资;旧手动触发生成的
episode_id=0 任务被 claim 条件静默跳过。
### TDD 红测
```text
$ mvn -pl fruitshorts-transcode-worker -am \
-Dtest=MediaServiceTranscodePipelineTest,TranscodeClaimAndStorageTest \
-Dsurefire.failIfNoSpecifiedTests=false test
[ERROR] 找不到符号: resolveByVideoUrl(String)
[ERROR] trigger(Long,String,Long,Long) 不存在
[INFO] BUILD FAILURE
```
解读:红测先锁定“按视频 URL 绑定分集”与严格媒资 id 触发接口。
### 实现
- POST /admin/media/{id}/transcode 只按 `media_asset.id` 查询,不再把路径 id
当成分集 id 兜底,也不再自动生成替代媒资。
- 媒资存在后按 source_url 查找使用该视频的分集;未找到直接返回
`BAD_REQUEST: 媒资未绑定分集视频`,不创建 episode_id=0 任务。
- 找到分集后先回填 video_asset_id,再向 TranscodeService 传
mediaAssetId/dramaId/episodeId/sourceUrl。
- QUEUED/RUNNING 任务复用时会补齐 drama/episode 绑定,避免历史零绑任务继续卡住。
- claim 查询增加 media_asset_id>0、episode_id>0、source_url 非空条件;
对不可认领任务按 id 去重打印一次 WARN 和具体原因。
- RUNNING 无 updated_at 变化阈值从 10 分钟收紧到 5 分钟,覆盖 worker 重启遗留。
- 认领、每档完成、整体成功/失败均有明确日志;ffmpeg 进度仍每秒节流写库。
### 数据修复脚本
文件:`sql/patch-2026-10-22-transcode-task-id-fix.sql`
脚本将 QUEUED/RUNNING 且 `episode_id=0` 或 media_asset_id 不存在于
media_asset 的任务标记 FAILED 并写明原因,可重复执行。本任务未执行数据库变更。
### 定向测试
```text
$ mvn -pl fruitshorts-transcode-worker -am \
-Dtest=MediaServiceTranscodePipelineTest,TranscodeClaimAndStorageTest,TranscodeServiceTriggerTest \
-Dsurefire.failIfNoSpecifiedTests=false test
[INFO] Tests run: 22, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
```
### 最终门禁
```text
$ mvn -pl fruitshorts-module-media,fruitshorts-transcode-worker test
[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0
[INFO] Tests run: 39, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
$ mvn -pl fruitshorts-admin-api -am test
[INFO] Tests run: 53, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
```
解读:非法/未绑定媒资拒绝、合法 URL 自动绑定、claim 跳过日志、
进度上报、重复触发幂等与重启僵尸收口全部通过。