Initial TrueGrowth source import

This commit is contained in:
2026-07-07 09:36:36 +08:00
commit 3b6781d695
2283 changed files with 691996 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
## Context
项目里已存在三类视频预览来源:
- 任务结果自带 `previewImageUrl` / `thumbnail`
- Service Worker 为缓存媒体生成 `?thumbnail=` 预览图
- 无法生成首帧时只能直接依赖 `<video>`
现状问题不在“完全没有能力”,而在于展示入口未统一复用,导致素材库等高频列表仍走原生 video 首次解码。
## Goals
- 降低视频列表和卡片首次渲染成本
- 不让跨域失败导致视频完全不可预览
- 不破坏已有点击播放和原生控制条场景
## Non-Goals
- 不改动视频分析器、画布视频节点等重交互播放内核
- 不新增后端缩略图服务
- 不强制为所有远程跨域视频生成首帧
## Decision
采用统一策略:
1. 优先海报
- 若业务已提供 `posterUrl` / `thumbnail` / `previewImageUrl`,优先直接展示
- 否则对虚拟缓存 URL 使用现有 `useThumbnailUrl(..., 'video')`
2. 失败降级
- 海报图加载失败时自动退回 `<video>`
- 对远程跨域 URL由于 `useThumbnailUrl` 会返回原视频地址,`img` 失败后自动退回 `<video>`
3. 交互分层
- 列表、网格、时间线、任务卡片等场景:默认只展示海报,必要时仅保留播放 icon
- 详情预览、嵌入卡片等可点击播放场景:默认海报,用户点击后切换到 `<video controls>`
- 画布节点、分析工具主预览等必须即时播放/控制的场景:继续直接使用 `<video>`
## Risks
- 某些样式只给 `video` 写了 class需要同步兼容 `img`
- 海报与视频尺寸不一致时可能出现裁切差异
- 远程视频会先经历一次 `img` 失败再退回 `video`,需要避免闪烁过重
## Verification
- 本地上传视频首次进入素材库,应优先看到海报而非黑屏或长时间等待
- 远程跨域视频无法抽帧时,应自动退回 video仍可预览/播放
- 可播放详情场景点击海报后,应切换为可控制的 video

View File

@@ -0,0 +1,19 @@
# Change: 优化视频展示为海报优先并保留可播放降级
## Why
当前项目中多个视频列表/卡片场景直接渲染 `<video preload="metadata">`,导致素材库等页面首次展示慢。项目内已经存在视频首帧缩略图与 Cache Storage 基础能力,但接入不统一,且跨域失败时容易退化为“无预览”。
## What Changes
- 统一视频缩略场景的展示策略为“海报图优先,失败再降级到 video”
- 优先复用已有 `thumbnail``previewImageUrl``?thumbnail=` Service Worker 缓存能力
- 在需要直接点击播放的场景支持“先海报、后切换 video 播放”
- 对必须保留原生 `video` 的场景维持现状,避免交互回退
## Impact
- Affected specs: `media-preview`
- Affected code:
- `packages/drawnix/src/components/media-library/*`
- `packages/drawnix/src/components/shared/media-preview/*`
- `packages/drawnix/src/components/task-queue/*`
- `packages/drawnix/src/components/MarkdownEditor/asset-embed-plugin/*`
- `packages/drawnix/src/components/shared/SelectedContentPreview.tsx`

View File

@@ -0,0 +1,28 @@
## ADDED Requirements
### Requirement: 视频展示必须优先使用海报预览
系统 SHALL 在列表、网格、缩略图等非必须即时播放的视频展示场景中优先使用图片海报,而不是首次直接渲染视频内容。
#### Scenario: 缓存视频首次出现在素材库列表
- **GIVEN** 视频资源已缓存到本地虚拟路径
- **WHEN** 用户首次打开素材库或滚动到该素材
- **THEN** 界面应优先请求该视频对应的海报图
- **AND** 不应依赖首次解码 `<video>` 作为默认展示路径
### Requirement: 海报失败时必须回退到视频预览
系统 SHALL 在视频海报不可用或加载失败时自动回退到原生视频预览,避免出现“完全不可预览”的状态。
#### Scenario: 跨域视频无法生成首帧
- **GIVEN** 视频资源因跨域限制无法提取首帧或海报图加载失败
- **WHEN** 页面尝试展示该视频
- **THEN** 系统应自动改用 `<video>` 进行预览
- **AND** 用户仍可看到该视频内容或继续播放
### Requirement: 可点击播放场景必须支持先海报后播放
系统 SHALL 在允许用户直接播放视频的详情或预览场景中支持先显示海报,再在用户触发后切换为原生视频播放器。
#### Scenario: 详情面板中的视频点击播放
- **GIVEN** 某视频展示场景支持用户直接点击播放
- **WHEN** 海报图已成功展示
- **AND** 用户点击该海报
- **THEN** 系统应切换为原生 `<video controls>`
- **AND** 用户可正常播放该视频

View File

@@ -0,0 +1,7 @@
## 1. Implementation
- [x] 1.1 盘点所有视频展示入口,按“缩略场景 / 直接播放场景”分类
- [x] 1.2 抽取统一的视频海报预览组件,支持已有 poster、缓存缩略图、失败回退到 video
- [x] 1.3 替换素材库、缩略队列、任务卡片等非直接播放场景
- [x] 1.4 替换需要点击播放但可先展示海报的场景
- [x] 1.5 保持分析器、画布节点等必须原生播放的场景不变
- [x] 1.6 验证跨域视频、无缩略图视频、本地缓存视频三类行为