修复 SFX 音效信息页元数据整块丢失 #153

Merged
kdletters merged 4 commits from fix/sfx-info into master 2026-08-09 13:47:17 +08:00
Owner

读边界的内联媒体脱敏在每层对象上无差别删除 null 值,把 SFX 自动时长 metadata 里
合法的 requestedDurationSeconds: null 一并删掉;客户端据此判定整份 soundEffect 非法,
音频信息页的「生成输入」退化成空,Task 也被截成 0 这类误导值。手动指定时长的音效不受
影响,图片路径的 generationInputs 没有可为 null 的字段,所以只有部分 SFX 可见。

  • sanitize_editor_payload_media_value 改为返回「是否被抹除」,只删除本次抹掉的内联
    媒体,调用方原有的显式 null 保留;脱敏强度不变,内联媒体与保留字段仍连键消失
  • SFX 自动时长的 requestedDurationSeconds 接受显式 null 与整个键缺失两种同义形态
  • 音频信息页 Task 按图层 assetKind 判定,不再随 soundEffect 元数据缺失降级成截断值

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

读边界的内联媒体脱敏在每层对象上无差别删除 null 值,把 SFX 自动时长 metadata 里 合法的 requestedDurationSeconds: null 一并删掉;客户端据此判定整份 soundEffect 非法, 音频信息页的「生成输入」退化成空,Task 也被截成 0 这类误导值。手动指定时长的音效不受 影响,图片路径的 generationInputs 没有可为 null 的字段,所以只有部分 SFX 可见。 - sanitize_editor_payload_media_value 改为返回「是否被抹除」,只删除本次抹掉的内联 媒体,调用方原有的显式 null 保留;脱敏强度不变,内联媒体与保留字段仍连键消失 - SFX 自动时长的 requestedDurationSeconds 接受显式 null 与整个键缺失两种同义形态 - 音频信息页 Task 按图层 assetKind 判定,不再随 soundEffect 元数据缺失降级成截断值 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 added 1 commit 2026-08-09 00:10:24 +08:00
修复 SFX 音效信息页元数据整块丢失
Project CI / Backend tests (pull_request) Failing after 13s
Project CI / Repository checks (pull_request) Failing after 13s
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
11e67d1a36
读边界的内联媒体脱敏在每层对象上无差别删除 null 值,把 SFX 自动时长 metadata 里
合法的 requestedDurationSeconds: null 一并删掉;客户端据此判定整份 soundEffect 非法,
音频信息页的「生成输入」退化成空,Task 也被截成 0 这类误导值。手动指定时长的音效不受
影响,图片路径的 generationInputs 没有可为 null 的字段,所以只有部分 SFX 可见。

- sanitize_editor_payload_media_value 改为返回「是否被抹除」,只删除本次抹掉的内联
  媒体,调用方原有的显式 null 保留;脱敏强度不变,内联媒体与保留字段仍连键消失
- SFX 自动时长的 requestedDurationSeconds 接受显式 null 与整个键缺失两种同义形态
- 音频信息页 Task 按图层 assetKind 判定,不再随 soundEffect 元数据缺失降级成截断值

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 added 1 commit 2026-08-09 00:10:47 +08:00
合并 master 最新提交
Project CI / Repository checks (pull_request) Successful in 1m1s
Project CI / Frontend tests (pull_request) Successful in 3m4s
Project CI / Backend tests (pull_request) Successful in 3m48s
Project CI / Native shell tests (pull_request) Successful in 13m9s
c206e901a0
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 added 1 commit 2026-08-09 02:36:17 +08:00
音频信息页 Task 判据改用资源原始类型
Project CI / Repository checks (pull_request) Successful in 1m10s
Project CI / Frontend tests (pull_request) Successful in 2m49s
Project CI / Backend tests (pull_request) Successful in 3m52s
Project CI / Native shell tests (pull_request) Successful in 13m12s
070775dfd9
layer.assetKind 是 assetKindOverride ?? resourceAssetKind,用户在画布上改一次「素材标签」
就能翻转判据:背景音乐被改标成「音效」会换用完整 id,音效被改标成「背景音乐」则退回
formatTaskIdForDisplay 的截断假值——上一版修复被一次改标就废掉。

- 判据换成 resolveLayerResourceAssetKind;它在资源类型缺省时回退到 layer.assetKind,
  刚生成、尚未注册资源行的音效层同样命中
- soundEffect 那一支保留为补充判据:它和生成 action 一样长在 generationInputs 上,
  元数据整块缺失时会一并消失,不能当主判据
- 补两条回归:背景音乐改标为音效仍截断、音效改标为背景音乐仍显示完整 id

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 marked the pull request as work in progress 2026-08-09 03:06:04 +08:00
Author
Owner

P2:ImageCanvasMetadataModalView.tsx (line 115) 旧资源缺少 assetKind 时,legacy 布局中的 assetKind: 'sound-effect' 会被水合成 resourceAssetKind: null + assetKindOverride: 'sound-effect'。新判据因此仍会把缺失 SFX 元数据的 Task 截成 1234,未覆盖目标场景。

P2:editor_project.rs (line 8938) 现在会保留顶层布局数组中的已有 null。保存接口接受任意 JSON,读回 [null] 后前端会访问 item.layerId/itemType 并崩溃;旧实现会移除这类数组项。应仅保留合法对象字段的 null,继续过滤无效布局元素。

P2:[ImageCanvasMetadataModalView.tsx (line 115)](C:/projects/narrative/Genarrative/src/components/image-editor/ImageCanvasMetadataModalView.tsx:115) 旧资源缺少 assetKind 时,legacy 布局中的 assetKind: 'sound-effect' 会被水合成 resourceAssetKind: null + assetKindOverride: 'sound-effect'。新判据因此仍会把缺失 SFX 元数据的 Task 截成 1234,未覆盖目标场景。 P2:[editor_project.rs (line 8938)](C:/projects/narrative/Genarrative/server-rs/crates/api-server/src/editor_project.rs:8938) 现在会保留顶层布局数组中的已有 null。保存接口接受任意 JSON,读回 [null] 后前端会访问 item.layerId/itemType 并崩溃;旧实现会移除这类数组项。应仅保留合法对象字段的 null,继续过滤无效布局元素。
lhk229 added 1 commit 2026-08-09 09:41:16 +08:00
读边界只放宽对象字段的 null,Task 判据改用生成模型
Project CI / Repository checks (pull_request) Successful in 1m10s
Project CI / Frontend tests (pull_request) Successful in 2m51s
Project CI / Backend tests (pull_request) Successful in 3m51s
Project CI / Native shell tests (pull_request) Successful in 13m14s
6d6b09b7a0
两处评审都成立,且都源自同一个毛病:修复时选错了作用范围/抽象层级。

一、数组元素的 null 不该跟着放宽
上一版把「无差别删 null」整体改成「只删本次抹掉的内联媒体」,连数组元素一起放宽了。
布局数组是唯一没有元素级 shape 校验的写入口(legacy layout_storage_version=0 是新画布的
默认状态,写侧 serialize_editor_layers 只挡内联媒体、不校验元素形状),读回的 null 元素会让
前端 canvasLayoutItemId / isCanvasSettingsLayoutItem 抛 TypeError,整次项目套用被 Promise
catch 吞成静默失败;generationInputs 的 fields / references 里混进 null 元素也会让整份元数据
被 isRecord 判非法丢弃——与本来要修的 SFX 症状同类。现在数组元素照旧过滤 null,放宽严格
限定在对象字段(requestedDurationSeconds 这种有意义的空值)。

二、Task 判据从资源分类换成生成模型
assetKind 是 assetKindOverride ?? resourceAssetKind,用户改一次「素材标签」就翻转;换成
resolveLayerResourceAssetKind 仍不够:legacy 布局快照没有 assetKindOverride 键时,旧的
assetKind 会被水合成 override 而 resourceAssetKind 落成 null,资源行查不到时同样是 null——
恰恰是元数据缺失最常伴随的形态。判据要回答的是「这个 taskId 由谁生成」,所以落在 model 上:
资源行权威字段,registered 图层的 serializeLayer 不回写,改标签不影响,后端
canonicalize_editor_sound_effect_model 只接受 eleven_text_to_sound_v2 一个取值。

- 新增后端回归:布局数组与 fields 数组里的 null 元素被过滤,对象字段的 null 原样保留
- 新增前端回归:资源类型不可解析(resourceAssetKind 为 null)的音效层仍显示完整 taskId
- 既有的「改标签」两向回归保持不变,在新判据下同样成立

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
lhk229 marked the pull request as ready for review 2026-08-09 10:00:55 +08:00
kdletters merged commit bcff8f1957 into master 2026-08-09 13:47:17 +08:00
kdletters deleted branch fix/sfx-info 2026-08-09 13:47:17 +08:00
Sign in to join this conversation.