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:
爱笑的毛毛虫
2026-09-05 16:09:34 +08:00
committed by GitHub
parent 923471f829
commit 7ab9f05c41
5 changed files with 220 additions and 58 deletions

View File

@@ -301,7 +301,8 @@ func (s *Service) OpenResourcePlaybackRange(userID string, resourceID string) (*
}
// BackfillPlaybackTranscodes 在服务启动后扫描存量本地视频:未判定 codec 的补判定,
// H.265 触发转码、H.264 标记 none。幂等:maybeStartPlaybackTranscode 先置
// H.265/MPEG-4 Part 2 触发转码、H.264 标记 none;再对旧规则遗留的 none 行做一次
// 有界重判(见 PlaybackNoneVideos)。幂等:maybeStartPlaybackTranscode 先置
// processing/none 再入库,重复扫描不会重复转码。
func (s *Service) BackfillPlaybackTranscodes() {
// 上次进程可能崩溃在转码中途(状态卡 processing),先重置为待判定。
@@ -309,10 +310,20 @@ func (s *Service) BackfillPlaybackTranscodes() {
for {
resources, err := s.repo.PlaybackPendingVideos(20)
if err != nil || len(resources) == 0 {
return
break
}
for i := range resources {
s.maybeStartPlaybackTranscode(&resources[i])
}
}
// 旧版本曾把 H.265/MPEG-4 Part 2 误判为浏览器可播并落 none;对存量 none 行
// 做一次有界重判(H.264 保持 none,H.265/MPEG-4 Part 2 触发转码),使 codec
// 判定规则的变更覆盖规则变更前已导入的文件。每次启动最多重判 20 条最旧行,
// 天然收敛且不会重复转码(claim 原子地把 none → processing)。
legacy, err := s.repo.PlaybackNoneVideos(20)
if err == nil {
for i := range legacy {
s.maybeStartPlaybackTranscode(&legacy[i])
}
}
}