ab40c57e9e
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 51s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 1m16s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 1m57s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m55s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m43s
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 2m50s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 38s
CI/CD Pipeline / Build Staging API Image (push) Successful in 3m48s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 30s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m15s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m49s
CI/CD Pipeline / Validate - Code Quality (push) Successful in 7m32s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m47s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 6m0s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 8m5s
AI Code Review / AI Code Review (pull_request) Successful in 8m21s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 1m3s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 1m13s
CI/CD Pipeline / Integration Tests (push) Successful in 3m11s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m20s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 3m33s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m39s
CI/CD Pipeline / Unit Tests (push) Successful in 12m25s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 12m2s
CI/CD Pipeline / CI Gate (pull_request) Successful in 9s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 574h45m24s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 574h45m26s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 574h45m26s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 574h45m24s
CI/CD Pipeline / Production Browser E2E (push) Failing after 574h45m46s
CI/CD Pipeline / Deploy Production (push) Failing after 574h45m48s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 574h45m26s
CI/CD Pipeline / CI Gate (push) Failing after 574h45m49s
CI/CD Pipeline / Build Production API Image (push) Failing after 574h45m50s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 574h45m50s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 574h56m19s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 574h56m23s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 574h56m25s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 574h57m15s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 574h57m17s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 574h57m19s
CI/CD Pipeline / PR Build API Image (push) Failing after 574h57m23s
CI/CD Pipeline / Frontend Lint (push) Failing after 574h58m17s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Failing after 574h58m51s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 574h58m53s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 575h0m14s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 574h58m55s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 574h58m57s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 575h19m14s
CI/CD Pipeline / Canary Release to Production (push) Failing after 575h19m38s
CI/CD Pipeline / Build Production Web Image (push) Failing after 575h19m40s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 575h30m11s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 575h30m25s
CI/CD Pipeline / PR Build Web Image (push) Failing after 575h31m11s
- New API updateEditPlanClips (PUT /templates/{id}/editor/clips)
- useStep2Materials: debounced 800ms clips write, same duration
logic as FrontendPreviewPlayer.buildPlaybackSegments
- buildClipsFromAssets shared util ensures preview/DB consistency
- Supports manual + smart-match modes, silent failure
58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
/**
|
|
* 将选中素材 + 模板 segments 构建为 edit_plan_clips 写入数据。
|
|
*
|
|
* 逻辑必须与 FrontendPreviewPlayer.tsx 中 buildPlaybackSegments 完全一致:
|
|
* assetDuration = asset.duration || asset.metadata?.duration || 30
|
|
* tplSeg = templateSegments[i] || lastSegment
|
|
* segDuration = clamp(assetDuration, tplSeg.duration_min, tplSeg.duration_max)
|
|
* start_time = 0
|
|
* duration = segDuration
|
|
*/
|
|
import type { AssetItem } from "@/api/assets"
|
|
import type { TemplateSegment } from "@/api/templates/types"
|
|
import type { EditPlanClipInput } from "@/api/template-editor"
|
|
|
|
interface BuildClipsOptions {
|
|
/** 选中的素材 ID 列表(按选择顺序) */
|
|
selectedIds: string[]
|
|
/** 已加载的素材列表(用于查 duration) */
|
|
materials: AssetItem[]
|
|
/** 智能匹配返回的素材(auto 模式下可能不在 materials 列表中) */
|
|
smartMatchedAssets?: AssetItem[]
|
|
/** 模板 segments */
|
|
templateSegments?: TemplateSegment[]
|
|
}
|
|
|
|
export function buildClipsFromAssets({
|
|
selectedIds,
|
|
materials,
|
|
smartMatchedAssets = [],
|
|
templateSegments = [],
|
|
}: BuildClipsOptions): EditPlanClipInput[] {
|
|
if (!selectedIds.length) return []
|
|
|
|
// 合并两个素材来源,建立 id → asset 索引
|
|
const assetMap = new Map<string, AssetItem>()
|
|
for (const a of materials) assetMap.set(a.id, a)
|
|
for (const a of smartMatchedAssets) assetMap.set(a.id, a)
|
|
|
|
const lastSeg = templateSegments[templateSegments.length - 1]
|
|
|
|
return selectedIds.map((assetId, i) => {
|
|
const asset = assetMap.get(assetId)
|
|
const assetDuration = asset?.duration || asset?.metadata?.duration || 30
|
|
|
|
const tplSeg = templateSegments[i] || lastSeg
|
|
const segDuration = tplSeg
|
|
? Math.min(tplSeg.duration_max, Math.max(tplSeg.duration_min, assetDuration))
|
|
: Math.min(assetDuration, 10)
|
|
|
|
return {
|
|
asset_id: assetId,
|
|
start_time: 0,
|
|
duration: segDuration,
|
|
order: i,
|
|
}
|
|
})
|
|
}
|