feat(assets): 3 个资产页视频也加 poster 首帧 — batch B 漏的补全
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 6m40s

v0.20.1 batch B 只给生成页 GenerationCard + 消费记录 RecordDetailModal +
视频详情 VideoDetailModal 加了 poster,3 个资产页漏了:
- 用户资产页 (AssetsPage.tsx)
- 超管内容资产 (AdminAssetsPage.tsx)
- 团管内容资产 (TeamAssetsPage.tsx)

用户实测:消费记录详情能看到首帧海报 + 加载圈;打开内容资产页 / 生成页面
其他位置的视频卡片黑底硬等加载,没首帧 — 体验不一致。

修法:
- 后端 admin_assets_user_videos / team_assets_member_videos view 各加一行
  'thumbnail_url': r.thumbnail_url or '' (batch B 的 3 个 records view 已有)
- AssetVideo 类型加 thumbnail_url?: string
- 3 个资产页 <video> 加 poster={... ? rewriteTosUrl(...) : undefined}
  (跟 GenerationCard/RecordDetailModal/VideoDetailModal 写法一致)

GenerationCard.tsx 已在 batch B 加过 poster — 用户感觉"生成页面也没"是因为本地
ARK_API_KEY 未配生不了新视频,老 record thumbnail_url 字段是空。新生成的视频
会有(后端 tasks.py:_handle_completed ffmpeg 已经写入)。

测试:tsc 0 error, v0.20.1-smoke 11/11 + modal-interaction 8/8 + announcement 17/17

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
seaislee1209 2026-05-15 17:23:56 +08:00
parent 08b5e66fbc
commit e500c2d6a0
5 changed files with 6 additions and 2 deletions

View File

@ -3022,6 +3022,7 @@ def admin_assets_user_videos(request, user_id):
'task_id': str(r.task_id),
'prompt': r.prompt,
'result_url': r.result_url or '',
'thumbnail_url': r.thumbnail_url or '',
'duration': r.duration,
'seconds_consumed': r.seconds_consumed,
'aspect_ratio': r.aspect_ratio,
@ -3104,6 +3105,7 @@ def team_assets_member_videos(request, member_id):
'task_id': str(r.task_id),
'prompt': r.prompt,
'result_url': r.result_url or '',
'thumbnail_url': r.thumbnail_url or '',
'duration': r.duration,
'seconds_consumed': r.seconds_consumed,
'aspect_ratio': r.aspect_ratio,

View File

@ -21,7 +21,7 @@ function VideoThumbnail({ video, onClick }: { video: AssetVideo; onClick: () =>
onClick={onClick}
>
{video.result_url ? (
<video ref={videoRef} src={rewriteTosUrl(video.result_url)} className={styles.thumbVideo} muted loop preload="metadata" />
<video ref={videoRef} src={rewriteTosUrl(video.result_url)} poster={video.thumbnail_url ? rewriteTosUrl(video.thumbnail_url) : undefined} className={styles.thumbVideo} muted loop preload="metadata" />
) : (
<div className={styles.thumbPlaceholder} />
)}

View File

@ -72,6 +72,7 @@ function VideoThumbnail({
<video
ref={videoRef}
src={rewriteTosUrl(task.resultUrl)}
poster={task.thumbnailUrl ? rewriteTosUrl(task.thumbnailUrl) : undefined}
className={styles.thumbVideo}
muted
loop

View File

@ -21,7 +21,7 @@ function VideoThumbnail({ video, onClick }: { video: AssetVideo; onClick: () =>
onClick={onClick}
>
{video.result_url ? (
<video ref={videoRef} src={rewriteTosUrl(video.result_url)} className={styles.thumbVideo} muted loop preload="metadata" />
<video ref={videoRef} src={rewriteTosUrl(video.result_url)} poster={video.thumbnail_url ? rewriteTosUrl(video.thumbnail_url) : undefined} className={styles.thumbVideo} muted loop preload="metadata" />
) : (
<div className={styles.thumbPlaceholder} />
)}

View File

@ -414,6 +414,7 @@ export interface AssetVideo {
task_id: string;
prompt: string;
result_url: string;
thumbnail_url?: string;
duration: number;
seconds_consumed: number;
cost_amount?: number;