diff --git a/src/lib/ai-edition/timeline/virtual-preview.test.ts b/src/lib/ai-edition/timeline/virtual-preview.test.ts index f3dd64888..bb100f16e 100644 --- a/src/lib/ai-edition/timeline/virtual-preview.test.ts +++ b/src/lib/ai-edition/timeline/virtual-preview.test.ts @@ -5,6 +5,7 @@ import { formatSeconds } from "./format"; import { clampVirtualTime, findNextKeptSegment, + findRawClipForSegment, getRawVirtualStartTime, keptWordIdSet, locateKeptSegment, @@ -371,6 +372,23 @@ describe("virtual-preview pure functions", () => { expect(getRawVirtualStartTime(segClip2Part1, rawClips)).toBe(13.2); }); + it("findRawClipForSegment prefers an exact raw id over an earlier prefix match", () => { + const rawClips: AxcutClip[] = [ + { ...clips[0], id: "clip" }, + { + ...clips[1], + id: "clip_seg1", + }, + ]; + const segment = { ...rawClips[1] }; + + expect(findRawClipForSegment(segment, rawClips)?.id).toBe("clip_seg1"); + expect(getRawVirtualStartTime(segment, rawClips)).toBe(10); + expect(findRawClipForSegment({ ...segment, id: "clip_seg1_seg2" }, rawClips)?.id).toBe( + "clip_seg1", + ); + }); + it("findNextKeptSegment finds next kept segment across multi-clip trim boundary", () => { const rawClips: AxcutClip[] = [ { diff --git a/src/lib/ai-edition/timeline/virtual-preview.ts b/src/lib/ai-edition/timeline/virtual-preview.ts index 1cdc5d2f6..1859f78f4 100644 --- a/src/lib/ai-edition/timeline/virtual-preview.ts +++ b/src/lib/ai-edition/timeline/virtual-preview.ts @@ -58,7 +58,11 @@ export function findRawClipForSegment( rawClips: AxcutClip[], ): AxcutClip | undefined { return ( - rawClips.find((c) => c.id === segment.id || segment.id.startsWith(`${c.id}_seg`)) ?? + rawClips.find((clip) => clip.id === segment.id) ?? + rawClips.reduce((longest, clip) => { + if (!segment.id.startsWith(`${clip.id}_seg`)) return longest; + return !longest || clip.id.length > longest.id.length ? clip : longest; + }, undefined) ?? rawClips.find( (c) => c.assetId === segment.assetId &&