Skip to content

fix(flow): 修复视频取媒体地址用错 id - #183

Merged
TheSmallHanCat merged 1 commit into
TheSmallHanCat:mainfrom
john-walks-slow:fix/video-media-id
Sep 30, 2026
Merged

TheSmallHanCat merged 1 commit into
TheSmallHanCat:mainfrom
john-walks-slow:fix/video-media-id

Conversation

@john-walks-slow

Copy link
Copy Markdown
Contributor

问题

视频生成成功,但取媒体地址这步失败:

HTTP 502
{"error":{"code":502,"message":"视频生成成功但获取媒体地址失败:
 Flow frontend RPC rejected: rpc=as29s, code=[5]","status":"UNAVAILABLE"}}

生成本身成功,挂在 as29s。这与 #182 的两处不同——这次参数结构没有错。

根因

as29s 的 argument 仍是单元素 UUID 列表,bl / f.sid / source-path 也都与前端一致(逐一比对过)。错的是值。

_resolve_video_asset 的取值优先级把 mediaName 排在第一位,但一个 operation 里同时存在两个不同的 UUID:

字段 样例值 用途
mediaGenerationId / operation.name a1607a19-… as29s 按这个索引
mediaName 4a7b00b4-… 另一个媒体记录,传它就 NOT_FOUND

证据

同一个 media,2×2 组合打点(仅换 id 与 source-path):

传入 id source-path 结果
mediaName /project/{id} code=[5]
mediaName /project/{id}/edit/{media} code=[5]
operation.name /project/{id} 返回 fifeUrl
operation.name /project/{id}/edit/{media} 返回 fifeUrl

source-path 两种都通,唯一的变量就是 id——所以不是结构问题。

附带收益

video_media_id 的兜底值也一并修正。返回的 URL 形如 /video/<operation.name>,所以 extend:// 续写引用的正是该 id,此前兜底会给出一个取不到媒体的 mediaName。

定位手法(可复用)

把 operation dump 出来拿到全部候选 UUID,再直接对 as29s 打点组合,无需重跑一次视频生成。比重跑快一个量级,定位成本从「一次生成 + 猜」降到「几次秒级请求」。

验证

  • 修复后同一条视频提示词跑通:HTTP 200 / 98.2s,返回 fileData
  • 新增 tests/test_video_asset_resolution.py,锁住「传 generation id 而非 mediaName」与「metadata 缺失时回落到 operation.name」
  • python -m unittest discover -s tests 全绿

说明

与 #182 分开提:根因不同类(结构错 vs 取值错),验证成本也差一个量级——图片那处看结构论证即可判断,视频这处必须真跑一次生成,不宜让维护者为一个本身无争议的修复额外承担这个等待。

抓包与测试中用到的 UUID、project id 均为打码值,flow.db 里的 cookie 与 recaptcha token 未包含在本 PR 中。

视频生成成功但取媒体地址失败:

```
HTTP 502
{"error":{"code":502,"message":"视频生成成功但获取媒体地址失败:
 Flow frontend RPC rejected: rpc=as29s, code=[5]","status":"UNAVAILABLE"}}
```

生成本身成功,挂在 as29s 这一步。

与 TheSmallHanCat#182 那两处不同:这次参数结构没有错。as29s 的 argument 仍是
单元素 UUID 列表,bl / f.sid / source-path 也都与前端一致。错的是值——
as29s 按「生成操作 id」索引,而 _resolve_video_asset 的取值优先级把
mediaName 排在了第一位。

一个 operation 里同时存在两个不同 UUID:

- mediaGenerationId / operation.name —— as29s 要的是这个
- mediaName —— 传它就 NOT_FOUND

2x2 组合实测(同一 media,仅换 id 与 source-path):

| 传入 id | source-path | 结果 |
|---|---|---|
| mediaName | /project/{id} | code=[5] |
| mediaName | /project/{id}/edit/{media} | code=[5] |
| operation.name | /project/{id} | 返回 fifeUrl |
| operation.name | /project/{id}/edit/{media} | 返回 fifeUrl |

可见 source-path 两种都通,唯一的变量就是 id。

附带收益:video_media_id 的兜底值也一并修正。返回的 URL 形如
/video/<operation.name>,故 extend:// 续写引用的正是该 id,
此前兜底会给出一个取不到媒体的 mediaName。

定位手法(可复用,无需重跑生成):把 operation dump 出来,拿到全部候选
UUID,再直接对 as29s 打点组合。比重跑一次视频生成快一个量级。
@TheSmallHanCat
TheSmallHanCat merged commit a10ea2f into TheSmallHanCat:main Sep 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants