Fix/动作 前端展示下载+后端数据结构+精选 的问题 #117
2 Participants
Due Date
Notifications
Total Time Spent: 8 minutes
kdletters
8 minutes
No due date set.
Dependencies
No dependencies set.
Reference: GenarrativeAI/Genarrative#117
Reference in New Issue
Block a user
Delete Branch "fix/action-drag-to-canva-and-download"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
原问题
把生成动作的原视频asstetkind改为 video, 只把图片序列作为action
db asset新增字段image_sequence_frames_json image_seq_duration_ms等, (原来动作的这些数据存在generation-input中,并不合适)
修改了externaljob,把这部分数据正确填写到数据库中。
为避免到处fallback,做了数据库迁移, 脚本:
scripts/spacetime-normalize-editor-character-actions.mjs手动进行过画布+素材库中动作序列帧+原始视频 迁移的测试移除preview_video_path字段, reason:
移除每个frame的index字段 原因: 这个只用于后端内部处理时有一个并发请求, 每个赋一个index方便收集, 后续没有再用到,且与数组本身重复
清除副产品preview video的generation_input_json, 因为会影响改造功能, 迁移后预览视频不提供改造(参数), 只有序列帧动作有改造
仍存在的共性问题: #134
下载改为完整序列帧, 封面不再作为fallback, 部分帧读取失败时行为:仍生成 ZIP,并记录失败帧, 不变
画布放置:




before:
after:
精选模块: 主页展示, 审核部分UI:
这两处序列帧们的加载设计为惰式的, 只有hover和单独preview才会全部加载
7075c3ddb1to1b8344540d整理历史,补充commit正文
WIP: Fix/动作从素材库下载/拖动到画布上 结果是张静止的图片to WIP: Fix/动作资源 前端展示下载,后端数据结构,精选模块 的问题1b8344540dto48b05be1a148b05be1a1to104891823eFix/动作资源 前端展示下载,后端数据结构,精选模块 的问题to Fix/动作资源 前端展示下载+后端数据结构+精选 的问题Fix/动作资源 前端展示下载+后端数据结构+精选 的问题to Fix/动作 前端展示下载+后端数据结构+精选 的问题本轮审查结论:请求修改。已将 4 个 PR 引入的 blocker 绑定到对应代码行;修复后请基于新 head 重新请求 review。
另有无法绑定到单一代码行的仓库门禁:当前 PR 历史包含
abdb7492、043e1b63两个英文且空正文的Merge remote-tracking branch...提交,不符合AGENTS.md的中文标题和逐行正文要求。请清理历史,或确认通过仓库明确允许的 squash 策略交付。审查基于 head
89c017bb6154fe6078328b6be67c49d1edd6995a。当前 Gitea 显示 4 组 CI 全绿、无冲突且mergeable=true;这些状态不消除下述数据恢复、外部契约和签名 URL 生命周期问题。@@ -165,0 +445,4 @@key: string;};type AdminImageSequenceFrameCacheEntry = {[P2] 这个缓存没有保存签名 URL 的过期时间。下游固定请求
expireSeconds=300,但 entry 只保存 URL 和状态;预览打开超过 5 分钟后仍会复用已过期地址,浏览器重新取帧时会逐帧 403,最终只能依赖用户手动“重试失败帧”。请缓存expiresAt并在安全窗口前自动重新换签,或复用已有带过期窗口的读取缓存,并覆盖跨 5 分钟回绕播放测试。@@ -2054,0 +2063,4 @@"assetKind"]},"then": {[P2] 这里的条件 schema 与运行时不一致。
assetKind=character-animation时,SpacetimeDB 必须同时收到imageSequenceFrames和imageSequenceDurationMs,但该then只约束generationInputs;镜像的 project-resource schema(约 2191 行)也一样。反向情况下,非动作 kind 携带序列字段能通过 OpenAPI,却会被运行时拒绝。请在两个 schema 中补齐 required/forbidden 条件,并增加正反向契约测试,保证代码生成客户端能在提交前构造出真正合法的请求。@@ -7031,0 +7152,4 @@return None;}let mut normalized = serde_json::Map::from_iter([("imageSrc".to_string(), Value::String(image_src.to_string())),[P2] 正式序列帧不能原样持久化临时签名 URL。当前每帧只要求非空
imageSrc,objectKey/assetObjectId都可缺省;后续持久化检查也只拒绝 Blob/Data URL,因此两个即将过期的 signed URL 可以成为正式动作真相,过期后无法播放或恢复。请要求每帧具备稳定对象引用,并从稳定引用生成持久路径;显式拒绝仅含临时签名 URL 的帧,同时补 External v1 负向测试。@@ -731,1 +753,4 @@!resource && isSelfContainedLegacyLocalImageSequence(snapshot);const isFormalCharacterAnimation =assetKind === 'character-animation' && !isSelfContainedLocalResource;if ([P1] 不要让合法的标签操作在重载后静默删除图层。素材标签菜单允许普通图片选择
character-animation,保存时会写入assetKindOverride;这里随后把 override 当作正式动作,但底层 resource 仍是普通图片,于是直接return null。复现路径是:普通图层改标为“动作” → 保存 → 刷新,持久层仍有该图层但前端完全不渲染。请限制这种转换,或在恢复时保留图层并给出明确校验反馈,同时补保存/重载回归测试。89c017bb61to52d4e97a5d增加了数据库迁移的一个改动: 清除副产品preview video的generation_input_json, 因为会影响改造功能, 迁移后预览视频不提供改造(参数), 只有序列帧动作有改造
已再次测试迁移

af0a57706eto564f376b39基于当前 master
b63923eb与 head ba682a7a 复审。旧 review 123 的四项代码问题已修复,当前四组 CI 全绿且合并树无冲突;但后台角色动作预览仍有一项刷新失败边界,详见 inline comment。另外,PR 独有历史仍有 5 个空正文提交,另有 7 个正文使用字面量反斜杠 n 代替真实逐行换行,不符合仓库提交规范。请修复刷新失败路径、补回归测试并整理提交历史后请求复审。@@ -165,0 +590,4 @@status: refreshReadyFrame ? 'refreshing' : 'loading',}));}).catch(() => {[P2] 刷新失败时不要丢弃仍有效的帧缓存。
refreshReadyFrame为 true 时,这次请求只是提前换签,旧resolvedUrl在真实过期前仍可使用;但这里无条件清空 URL 并标记为failed,播放器随后会永久跳过该帧且不再自动重试,直到管理员手动点击重试。请在提前换签失败时保留当前可用 URL 并安排有界重试;只有不存在可用 URL 或图片解码失败时才标记failed,同时补充“提前换签失败仍保持已就绪帧可见”的回归测试。ba682a7a05tof52947d771