summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/timeline/audio-separation
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-06 00:02:23 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-06 00:02:23 +0200
commit44d8c4c8764d49a8e8d0ae713432c07f07cb7597 (patch)
tree4657187279adb475ea710231feb3d0bd4add36ed /apps/web/src/lib/timeline/audio-separation
parent20235d0724a70e6787b6cbdbfa054b1c5d8f62e9 (diff)
downloadopencut-44d8c4c8764d49a8e8d0ae713432c07f07cb7597.tar.gz
refactor: unify element updates into pipeline and centralize ripple
Diffstat (limited to 'apps/web/src/lib/timeline/audio-separation')
-rw-r--r--apps/web/src/lib/timeline/audio-separation/__tests__/index.test.ts44
-rw-r--r--apps/web/src/lib/timeline/audio-separation/index.ts8
2 files changed, 26 insertions, 26 deletions
diff --git a/apps/web/src/lib/timeline/audio-separation/__tests__/index.test.ts b/apps/web/src/lib/timeline/audio-separation/__tests__/index.test.ts
index 173b6402..1946f1e0 100644
--- a/apps/web/src/lib/timeline/audio-separation/__tests__/index.test.ts
+++ b/apps/web/src/lib/timeline/audio-separation/__tests__/index.test.ts
@@ -1,5 +1,5 @@
import { describe, expect, test } from "bun:test";
-import type { AudioElement, VideoElement } from "@/lib/timeline";
+import type { UploadAudioElement, VideoElement } from "@/lib/timeline";
import {
buildSeparatedAudioElement,
doesElementHaveEnabledAudio,
@@ -80,31 +80,11 @@ describe("audio separation", () => {
});
test("skips source audio collection when the source clip is separated", () => {
- const mediaAsset = {
- id: "media-1",
- type: "video",
- name: "Clip",
- size: 1,
- lastModified: 1,
- file: new File(["video"], "clip.mp4", { type: "video/mp4" }),
- url: "blob:clip",
- hasAudio: true,
- };
+ const mediaAsset = { hasAudio: true };
const videoElement = buildVideoElement({
isSourceAudioEnabled: false,
});
- const audioElement = {
- id: "audio-1",
- type: "audio",
- sourceType: "upload",
- mediaId: "audio-media-1",
- name: "Detached audio",
- duration: 5,
- startTime: 0,
- trimStart: 0,
- trimEnd: 0,
- volume: 0,
- } as AudioElement;
+ const audioElement = buildAudioElement();
expect(
doesElementHaveEnabledAudio({
@@ -145,3 +125,21 @@ function buildVideoElement(
...overrides,
};
}
+
+function buildAudioElement(
+ overrides: Partial<UploadAudioElement> = {},
+): UploadAudioElement {
+ return {
+ id: "audio-1",
+ type: "audio",
+ sourceType: "upload",
+ mediaId: "audio-media-1",
+ name: "Detached audio",
+ duration: 5,
+ startTime: 0,
+ trimStart: 0,
+ trimEnd: 0,
+ volume: 0,
+ ...overrides,
+ } satisfies UploadAudioElement;
+}
diff --git a/apps/web/src/lib/timeline/audio-separation/index.ts b/apps/web/src/lib/timeline/audio-separation/index.ts
index b92cb79b..093edfbc 100644
--- a/apps/web/src/lib/timeline/audio-separation/index.ts
+++ b/apps/web/src/lib/timeline/audio-separation/index.ts
@@ -9,6 +9,8 @@ import type {
VideoElement,
} from "../types";
+type MediaAudioState = Pick<MediaAsset, "hasAudio">;
+
export function isSourceAudioEnabled({
element,
}: {
@@ -30,7 +32,7 @@ export function canExtractSourceAudio({
mediaAsset,
}: {
element: TimelineElement;
- mediaAsset: MediaAsset | null | undefined;
+ mediaAsset: MediaAudioState | null | undefined;
}): element is VideoElement {
return (
element.type === "video" &&
@@ -53,7 +55,7 @@ export function canToggleSourceAudio({
mediaAsset,
}: {
element: TimelineElement;
- mediaAsset: MediaAsset | null | undefined;
+ mediaAsset: MediaAudioState | null | undefined;
}): element is VideoElement {
return (
canRecoverSourceAudio({ element }) ||
@@ -66,7 +68,7 @@ export function doesElementHaveEnabledAudio({
mediaAsset,
}: {
element: AudioElement | VideoElement;
- mediaAsset?: MediaAsset | null;
+ mediaAsset?: MediaAudioState | null;
}): boolean {
if (element.type === "audio") {
return true;