feat(editor): 素材面板改造与视频 codec 存量重判 (#419)

* refactor(editor): 画布素材统一到项目素材

- 移除「画布素材」分组、筛选页签、来源徽标与详情「来源」行
- 画布产物(source=canvas)并入「项目素材」组,与普通项目素材一致展示
- 数据层仍写入 canvas 来源标记,仅供追溯,不再驱动任何 UI 分组

* fix(editor): 启动回填重判存量 none 视频的 codec

- Repository.PlaybackNoneVideos: 取旧规则遗留(provider=local, playback_status='none')的本地视频
- BackfillPlaybackTranscodes 追加有界重判(每次启动至多 20 条最旧行): H.264 保持 none,
  H.265/MPEG-4 Part 2 自动触发转码, 使 codec 判定规则变更覆盖规则变更前已导入的文件
- 新增守护测试 TestBackfillRejudgesLegacyNoneVideos: 存量 none 的 H.264 保持、mp4v 转码落 failed

* feat(editor): 素材展开改为浮层详情卡,列表不再被挤压

- 移除行内展开块:此前点击素材行会在分组内内联撑开预览+详情+按钮,把列表下方素材挤走
- 新增 AssetDetailSheet 浮层:覆盖在列表视口上方,列表 DOM 原位不动、滚动位置不丢
- 浮层自带头部(类型图标+标题+关闭)、滚动内容区(预览/元数据/描述)与固定底部「添加到时间线」
- 键盘可达:Esc 或关闭按钮退出;聚焦管理 + aria-label + 尊重 prefers-reduced-motion
This commit is contained in:
爱笑的毛毛虫 authored and GitHub committed 2026-09-05 16:09:34 +08:00
1 parent 923471f829
commit 7ab9f05c41
5 files changed
+220 -58

No files matched your search

+14
View File
@@ -1073,6 +1073,20 @@ func (r *Repository) PlaybackPendingVideos(limit int) ([]model.Resource, error)
return resources, err
}
// PlaybackNoneVideos 返回存量本地视频中旧逻辑遗留、停在 none 的行
// (规则变更前 H.265/MPEG-4 Part 2 曾被误判为浏览器可播并落 none)。
// 服务启动回填时对它们重新按 codec 判定,让判定规则变更覆盖规则变更前已导入的文件。
func (r *Repository) PlaybackNoneVideos(limit int) ([]model.Resource, error) {
var resources []model.Resource
if limit <= 0 || limit > 100 {
limit = 20
}
err := r.db.Where("kind = ? AND status = ? AND provider = ? AND playback_status = ?",
"video", model.ResourceStatusReady, "local", model.PlaybackStatusNone).
Order("created_at asc").Limit(limit).Find(&resources).Error
return resources, err
}
// ClaimPlaybackTranscode 原子地把待判定(空/none)视频置为 processing,返回是否抢占成功。
// 多实例或多 goroutine 并发转同一资源时仅一个能成功置位,其余返回 false 直接放弃,
// 避免重复转码同一份文件。