feat(editor): 剪辑成片验收闭环 - 概览渲染计数、导入/字幕/预览修复与本地 whisper 转写运行时 (#414)
* feat(editor): 剪辑成片验收闭环 - 概览渲染成功计数、媒体导入/字幕/预览修复与本地 whisper 转写运行时 - 概览:渲染成功计数接入项目概览 SQL/JSON,成片状态随 timeline_render 任务联动 - 修复:本地媒体导入后列表为空(挂载时服务端重同步 + 导入后校验重取)、 字幕工具残留 M6 占位文案、预览监视器悬浮遮挡层改为顶部信息条、 生成任务轮询连续查询失败即抛错不再空转至超时 - 本地转写:新增 scripts/start-whisper-local.sh 一键启动 whisper.cpp, local-development 文档补安装/启动/后端注入指引 - 同步 docs(overview/features、pending-test、index) * fix(assets): 素材库封面未知 kind 兜底,避免 AssetCover 渲染崩溃 运行时素材记录若带未知/脏 kind(历史遗留或本地存储异常),assetKindIcons[asset.kind] 得到 undefined,AssetCover/AssetDrawer 渲染 <KindIcon/> 触发 'Element type is invalid ... got: undefined' 使 /assets 整页崩溃。 新增 isKnownAssetKind 守卫:未知 kind 回退 FileText 图标与通用文案,脏数据不再崩页。 * fix(editor): mp4v 播放死循环修复——MPEG-4 Part 2 归入播放转码通道,监视器加终态护栏 - 后端把 mp4v 与 H.264/AV1/VP9 一并判为浏览器可播 → playbackStatus=none; Chromium/Firefox/Edge 实际均不支持 MPEG-4 Part 2,原件解码即失败。 现将其并入 H.265 转码通道(转 H.264 兼容副本);损坏文件转码失败落 failed,前端据此显示终止性错误而非死循环。 - 前端监视器轮询到 none/failed 或超时后不再回退 primary 重试;副本 URL 回退原件反复触发 onError 时保持终态文案,不再覆盖成"正在生成兼容版本"。 * feat(editor): 画布产物自动同步剪辑素材库,素材面板新增「画布素材」分组 - 打开剪辑器时自动把画布工作台当前采用(storyboard/action_board/分镜/导出成片, ready 且有资源)的产物 linkProjectAsset(source=canvas) 并入项目素材库; 后端幂等、前端按 storageKey+会话 ref 去重,失败静默下次进入自动补同步。 - LinkProjectAsset 支持 source 白名单(uploaded/canvas)并写入素材 payload, 供素材面板按来源分组;面板新增「画布素材」页签与分组,与「本地上传」「项目素材」并列。 - 补 source=canvas 写入断言测试。 * docs(progress): 记录 mp4v 播放死循环修复与画布产物素材同步的待浏览器验收项
This commit is contained in:
@@ -7,19 +7,20 @@ import (
|
||||
)
|
||||
|
||||
type ProjectOverviewMetrics struct {
|
||||
UnitCount int64 `gorm:"column:unit_count"`
|
||||
CompletedUnitCount int64 `gorm:"column:completed_unit_count"`
|
||||
TotalWordCount int64 `gorm:"column:total_word_count"`
|
||||
UnitsWithoutText int64 `gorm:"column:units_without_text"`
|
||||
UnitsWithoutShots int64 `gorm:"column:units_without_shots"`
|
||||
CanvasCount int64 `gorm:"column:canvas_count"`
|
||||
AssetCount int64 `gorm:"column:asset_count"`
|
||||
ShotCount int64 `gorm:"column:shot_count"`
|
||||
PendingCandidateCount int64 `gorm:"column:pending_candidate_count"`
|
||||
ReadyStoryboardCount int64 `gorm:"column:ready_storyboard_count"`
|
||||
ReadyPrevizCount int64 `gorm:"column:ready_previz_count"`
|
||||
ReadyVideoCount int64 `gorm:"column:ready_video_count"`
|
||||
StaleArtifactCount int64 `gorm:"column:stale_artifact_count"`
|
||||
UnitCount int64 `gorm:"column:unit_count"`
|
||||
CompletedUnitCount int64 `gorm:"column:completed_unit_count"`
|
||||
TotalWordCount int64 `gorm:"column:total_word_count"`
|
||||
UnitsWithoutText int64 `gorm:"column:units_without_text"`
|
||||
UnitsWithoutShots int64 `gorm:"column:units_without_shots"`
|
||||
CanvasCount int64 `gorm:"column:canvas_count"`
|
||||
AssetCount int64 `gorm:"column:asset_count"`
|
||||
ShotCount int64 `gorm:"column:shot_count"`
|
||||
PendingCandidateCount int64 `gorm:"column:pending_candidate_count"`
|
||||
ReadyStoryboardCount int64 `gorm:"column:ready_storyboard_count"`
|
||||
ReadyPrevizCount int64 `gorm:"column:ready_previz_count"`
|
||||
ReadyVideoCount int64 `gorm:"column:ready_video_count"`
|
||||
TimelineRenderSucceededCount int64 `gorm:"column:timeline_render_succeeded_count"`
|
||||
StaleArtifactCount int64 `gorm:"column:stale_artifact_count"`
|
||||
}
|
||||
|
||||
type ProjectOverviewUnitRow struct {
|
||||
@@ -62,8 +63,9 @@ func (r *Repository) ProjectOverviewMetrics(projectID string) (ProjectOverviewMe
|
||||
(SELECT COUNT(DISTINCT shot_id) FROM shot_artifacts WHERE project_id = ? AND type = 'storyboard' AND selected = ? AND status = 'ready') AS ready_storyboard_count,
|
||||
(SELECT COUNT(DISTINCT shot_id) FROM shot_artifacts WHERE project_id = ? AND type = 'action_board' AND selected = ? AND status = 'ready') AS ready_previz_count,
|
||||
(SELECT COUNT(DISTINCT shot_id) FROM shot_artifacts WHERE project_id = ? AND type = 'video' AND selected = ? AND status = 'ready') AS ready_video_count,
|
||||
(SELECT COUNT(*) FROM tasks WHERE project_id = ? AND type = ? AND status = ?) AS timeline_render_succeeded_count,
|
||||
(SELECT COUNT(*) FROM shot_artifacts WHERE project_id = ? AND status = 'stale') AS stale_artifact_count
|
||||
`, projectID, projectID, model.ProjectUnitStatusCompleted, projectID, projectID, projectID, model.ProjectUnitStatusDraft, projectID, projectID, projectID, projectID, projectID, true, projectID, true, projectID, true, projectID).Scan(&metrics).Error
|
||||
`, projectID, projectID, model.ProjectUnitStatusCompleted, projectID, projectID, projectID, model.ProjectUnitStatusDraft, projectID, projectID, projectID, projectID, projectID, true, projectID, true, projectID, true, projectID, model.TaskTypeTimelineRender, model.TaskStatusSucceeded, projectID).Scan(&metrics).Error
|
||||
return metrics, err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user