From 9f05f5831bc77525adc7abde861a5df09510ca61 Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Fri, 22 May 2026 21:46:51 +0700 Subject: [PATCH] refactor(editor): extract mp4 export settings --- src/components/video-editor/VideoEditor.tsx | 25 +++--- .../video-editor/mp4ExportSettings.test.ts | 82 +++++++++++++++++++ .../video-editor/mp4ExportSettings.ts | 42 ++++++++++ 3 files changed, 138 insertions(+), 11 deletions(-) create mode 100644 src/components/video-editor/mp4ExportSettings.test.ts create mode 100644 src/components/video-editor/mp4ExportSettings.ts diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index 3d8c27f0..da9dd65a 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -89,6 +89,7 @@ import { import { ExtensionIcon } from "./ExtensionIcon"; import { calculateMp4ExportDimensions, calculateMp4SourceDimensions } from "./exportDimensions"; import { resolveMp4ExportRouting } from "./mp4ExportRouting"; +import { resolveMp4ExportSettings } from "./mp4ExportSettings"; import { useNvidiaCudaExportOptIn } from "./useNvidiaCudaExportOptIn"; const PhCursorFill = (props: { className?: string; weight?: "fill" | "regular" }) => ( @@ -4125,17 +4126,19 @@ export default function VideoEditor() { } } else { // MP4 Export - const quality = smokeExportConfig.enabled - ? (smokeExportConfig.quality ?? settings.quality ?? exportQuality) - : (settings.quality ?? exportQuality); - const encodingMode = smokeExportConfig.enabled - ? (smokeExportConfig.encodingMode ?? - settings.encodingMode ?? - exportEncodingMode) - : (settings.encodingMode ?? exportEncodingMode); - const selectedMp4FrameRate = smokeExportConfig.enabled - ? (smokeExportConfig.fps ?? settings.mp4FrameRate ?? mp4FrameRate) - : (settings.mp4FrameRate ?? mp4FrameRate); + const { quality, encodingMode, selectedMp4FrameRate } = + resolveMp4ExportSettings({ + smokeExportConfig: { + enabled: smokeExportConfig.enabled, + quality: smokeExportConfig.quality, + encodingMode: smokeExportConfig.encodingMode, + fps: smokeExportConfig.fps, + }, + settings, + exportQuality, + exportEncodingMode, + mp4FrameRate, + }); const { pipelineModel, useExperimentalNativeExport, diff --git a/src/components/video-editor/mp4ExportSettings.test.ts b/src/components/video-editor/mp4ExportSettings.test.ts new file mode 100644 index 00000000..6d4c0408 --- /dev/null +++ b/src/components/video-editor/mp4ExportSettings.test.ts @@ -0,0 +1,82 @@ +import { describe, expect, it } from "vitest"; + +import { resolveMp4ExportSettings } from "./mp4ExportSettings"; + +const baseOptions = { + smokeExportConfig: { + enabled: false, + }, + settings: {}, + exportQuality: "high" as const, + exportEncodingMode: "balanced" as const, + mp4FrameRate: 30 as const, +}; + +describe("resolveMp4ExportSettings", () => { + it("uses editor defaults when neither menu settings nor smoke settings override them", () => { + expect(resolveMp4ExportSettings(baseOptions)).toEqual({ + quality: "high", + encodingMode: "balanced", + selectedMp4FrameRate: 30, + }); + }); + + it("prefers explicit menu settings over editor defaults for normal exports", () => { + expect( + resolveMp4ExportSettings({ + ...baseOptions, + settings: { + quality: "source", + encodingMode: "quality", + mp4FrameRate: 60, + }, + }), + ).toEqual({ + quality: "source", + encodingMode: "quality", + selectedMp4FrameRate: 60, + }); + }); + + it("prefers smoke URL settings over menu settings when smoke export is enabled", () => { + expect( + resolveMp4ExportSettings({ + ...baseOptions, + smokeExportConfig: { + enabled: true, + quality: "medium", + encodingMode: "fast", + fps: 24, + }, + settings: { + quality: "source", + encodingMode: "quality", + mp4FrameRate: 60, + }, + }), + ).toEqual({ + quality: "medium", + encodingMode: "fast", + selectedMp4FrameRate: 24, + }); + }); + + it("falls back from incomplete smoke settings to menu settings and editor defaults", () => { + expect( + resolveMp4ExportSettings({ + ...baseOptions, + smokeExportConfig: { + enabled: true, + quality: "good", + }, + settings: { + encodingMode: "quality", + }, + }), + ).toEqual({ + quality: "good", + encodingMode: "quality", + selectedMp4FrameRate: 30, + }); + }); +}); diff --git a/src/components/video-editor/mp4ExportSettings.ts b/src/components/video-editor/mp4ExportSettings.ts new file mode 100644 index 00000000..95017a2c --- /dev/null +++ b/src/components/video-editor/mp4ExportSettings.ts @@ -0,0 +1,42 @@ +import type { + ExportEncodingMode, + ExportMp4FrameRate, + ExportQuality, + ExportSettings, +} from "@/lib/exporter"; +import type { SmokeExportConfig } from "./smokeExportConfig"; + +export type ResolvedMp4ExportSettings = { + quality: ExportQuality; + encodingMode: ExportEncodingMode; + selectedMp4FrameRate: ExportMp4FrameRate; +}; + +export function resolveMp4ExportSettings({ + smokeExportConfig, + settings, + exportQuality, + exportEncodingMode, + mp4FrameRate, +}: { + smokeExportConfig: Pick< + SmokeExportConfig, + "enabled" | "quality" | "encodingMode" | "fps" + >; + settings: Pick; + exportQuality: ExportQuality; + exportEncodingMode: ExportEncodingMode; + mp4FrameRate: ExportMp4FrameRate; +}): ResolvedMp4ExportSettings { + return { + quality: smokeExportConfig.enabled + ? (smokeExportConfig.quality ?? settings.quality ?? exportQuality) + : (settings.quality ?? exportQuality), + encodingMode: smokeExportConfig.enabled + ? (smokeExportConfig.encodingMode ?? settings.encodingMode ?? exportEncodingMode) + : (settings.encodingMode ?? exportEncodingMode), + selectedMp4FrameRate: smokeExportConfig.enabled + ? (smokeExportConfig.fps ?? settings.mp4FrameRate ?? mp4FrameRate) + : (settings.mp4FrameRate ?? mp4FrameRate), + }; +}