diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index 7b522b5..c0a038e 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -438,42 +438,6 @@ export default function VideoEditor() { } }, [selectedAnnotationId, annotationRegions]); - const handleOpenExportDialog = useCallback(() => { - if (!videoPath) { - toast.error('No video loaded'); - return; - } - - const video = videoPlaybackRef.current?.video; - if (!video) { - toast.error('Video not ready'); - return; - } - - // Build export settings from current state - const sourceWidth = video.videoWidth || 1920; - const sourceHeight = video.videoHeight || 1080; - const gifDimensions = calculateOutputDimensions(sourceWidth, sourceHeight, gifSizePreset, GIF_SIZE_PRESETS); - - const settings: ExportSettings = { - format: exportFormat, - quality: exportFormat === 'mp4' ? exportQuality : undefined, - gifConfig: exportFormat === 'gif' ? { - frameRate: gifFrameRate, - loop: gifLoop, - sizePreset: gifSizePreset, - width: gifDimensions.width, - height: gifDimensions.height, - } : undefined, - }; - - setShowExportDialog(true); - setExportError(null); - - // Start export immediately - handleExport(settings); - }, [videoPath, exportFormat, exportQuality, gifFrameRate, gifLoop, gifSizePreset]); - const handleExport = useCallback(async (settings: ExportSettings) => { if (!videoPath) { toast.error('No video loaded'); @@ -496,17 +460,10 @@ export default function VideoEditor() { videoPlaybackRef.current?.pause(); } - // Get actual video dimensions to match recording resolution - const video = videoPlaybackRef.current?.video; - if (!video) { - toast.error('Video not ready'); - return; - } - const aspectRatioValue = getAspectRatioValue(aspectRatio); const sourceWidth = video.videoWidth || 1920; const sourceHeight = video.videoHeight || 1080; - + // Get preview CONTAINER dimensions for scaling const playbackRef = videoPlaybackRef.current; const containerElement = playbackRef?.containerRef?.current; @@ -548,9 +505,9 @@ export default function VideoEditor() { const arrayBuffer = await result.blob.arrayBuffer(); const timestamp = Date.now(); const fileName = `export-${timestamp}.gif`; - + const saveResult = await window.electronAPI.saveExportedVideo(arrayBuffer, fileName); - + if (saveResult.cancelled) { toast.info('Export cancelled'); } else if (saveResult.success) { @@ -625,11 +582,11 @@ export default function VideoEditor() { } else { // Use quality-based target resolution const targetHeight = quality === 'medium' ? 720 : 1080; - + // Calculate dimensions maintaining aspect ratio exportHeight = Math.floor(targetHeight / 2) * 2; exportWidth = Math.floor((exportHeight * aspectRatioValue) / 2) * 2; - + // Adjust bitrate for lower resolutions const totalPixels = exportWidth * exportHeight; if (totalPixels <= 1280 * 720) { @@ -673,9 +630,9 @@ export default function VideoEditor() { const arrayBuffer = await result.blob.arrayBuffer(); const timestamp = Date.now(); const fileName = `export-${timestamp}.mp4`; - + const saveResult = await window.electronAPI.saveExportedVideo(arrayBuffer, fileName); - + if (saveResult.cancelled) { toast.info('Export cancelled'); } else if (saveResult.success) { @@ -708,6 +665,42 @@ export default function VideoEditor() { } }, [videoPath, wallpaper, zoomRegions, trimRegions, shadowIntensity, showBlur, motionBlurEnabled, borderRadius, padding, cropRegion, annotationRegions, isPlaying, aspectRatio, exportQuality]); + const handleOpenExportDialog = useCallback(() => { + if (!videoPath) { + toast.error('No video loaded'); + return; + } + + const video = videoPlaybackRef.current?.video; + if (!video) { + toast.error('Video not ready'); + return; + } + + // Build export settings from current state + const sourceWidth = video.videoWidth || 1920; + const sourceHeight = video.videoHeight || 1080; + const gifDimensions = calculateOutputDimensions(sourceWidth, sourceHeight, gifSizePreset, GIF_SIZE_PRESETS); + + const settings: ExportSettings = { + format: exportFormat, + quality: exportFormat === 'mp4' ? exportQuality : undefined, + gifConfig: exportFormat === 'gif' ? { + frameRate: gifFrameRate, + loop: gifLoop, + sizePreset: gifSizePreset, + width: gifDimensions.width, + height: gifDimensions.height, + } : undefined, + }; + + setShowExportDialog(true); + setExportError(null); + + // Start export immediately + handleExport(settings); + }, [videoPath, exportFormat, exportQuality, gifFrameRate, gifLoop, gifSizePreset, handleExport]); + const handleCancelExport = useCallback(() => { if (exporterRef.current) { exporterRef.current.cancel();