From 2d42f0236e8513facc7d0f0433e2a0312e068ebf Mon Sep 17 00:00:00 2001 From: 4rjunc Date: Sun, 15 Mar 2026 13:47:36 +0530 Subject: [PATCH 01/40] feat: add handlers + preloads --- electron/ipc/handlers.ts | 29 +++++++++++++++++++++++++++++ electron/preload.ts | 3 +++ 2 files changed, 32 insertions(+) diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index 4228ab21..43ed80d9 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -2471,6 +2471,35 @@ export function registerIpcHandlers( } }); + ipcMain.handle('open-audio-file-picker', async () => { + try { + const result = await dialog.showOpenDialog({ + title: 'Select Audio File', + filters: [ + { name: 'Audio Files', extensions: ['mp3', 'wav', 'aac', 'm4a', 'flac', 'ogg'] }, + { name: 'All Files', extensions: ['*'] } + ], + properties: ['openFile'] + }); + + if (result.canceled || result.filePaths.length === 0) { + return { success: false, canceled: true }; + } + + return { + success: true, + path: result.filePaths[0] + }; + } catch (error) { + console.error('Failed to open audio file picker:', error); + return { + success: false, + message: 'Failed to open audio file picker', + error: String(error) + }; + } + }); + ipcMain.handle('reveal-in-folder', async (_, filePath: string) => { try { // shell.showItemInFolder doesn't return a value, it throws on error diff --git a/electron/preload.ts b/electron/preload.ts index ebc4fed1..b98420a9 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -113,6 +113,9 @@ contextBridge.exposeInMainWorld('electronAPI', { openVideoFilePicker: () => { return ipcRenderer.invoke('open-video-file-picker') }, + openAudioFilePicker: () => { + return ipcRenderer.invoke('open-audio-file-picker') + }, setCurrentVideoPath: (path: string) => { return ipcRenderer.invoke('set-current-video-path', path) }, From 1d3d180ad8832b5766c68b579502a06d565b0e96 Mon Sep 17 00:00:00 2001 From: 4rjunc Date: Sun, 15 Mar 2026 13:47:58 +0530 Subject: [PATCH 02/40] feat: add types for audio --- src/components/video-editor/types.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/video-editor/types.ts b/src/components/video-editor/types.ts index fa782ce0..46f66f79 100644 --- a/src/components/video-editor/types.ts +++ b/src/components/video-editor/types.ts @@ -137,6 +137,14 @@ export const DEFAULT_CROP_REGION: CropRegion = { height: 1, }; +export interface AudioRegion { + id: string; + startMs: number; + endMs: number; + audioPath: string; + volume: number; +} + export type PlaybackSpeed = 0.25 | 0.5 | 0.75 | 1.25 | 1.5 | 1.75 | 2; export interface SpeedRegion { From fa9692089aad12e6c137d600a39b1a34d4752962 Mon Sep 17 00:00:00 2001 From: 4rjunc Date: Sun, 15 Mar 2026 13:48:29 +0530 Subject: [PATCH 03/40] feat: add audio option in tools --- src/components/video-editor/VideoEditor.tsx | 216 ++++++++- .../video-editor/projectPersistence.ts | 22 + src/components/video-editor/timeline/Item.tsx | 225 +++++----- .../timeline/ItemGlass.module.css | 30 +- .../video-editor/timeline/TimelineEditor.tsx | 423 ++++++++++++------ 5 files changed, 650 insertions(+), 266 deletions(-) diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index f410b42b..323f34fe 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -7,6 +7,52 @@ import { Toaster } from "@/components/ui/sonner"; import { useI18n } from "@/contexts/I18nContext"; import { SUPPORTED_LOCALES } from "@/i18n/config"; import type { AppLocale } from "@/i18n/config"; + +import VideoPlayback, { VideoPlaybackRef } from "./VideoPlayback"; +import PlaybackControls from "./PlaybackControls"; +import TimelineEditor from "./timeline/TimelineEditor"; +import { SettingsPanel } from "./SettingsPanel"; +import { ExportDialog } from "./ExportDialog"; +import { DEFAULT_WALLPAPER_RELATIVE_PATH, WALLPAPER_PATHS } from "@/lib/wallpapers"; +import { + createProjectData, + deriveNextId, + fromFileUrl, + normalizeProjectEditor, + toFileUrl, + validateProjectData, +} from "./projectPersistence"; + +import type { Span } from "dnd-timeline"; +import { + DEFAULT_CURSOR_CLICK_BOUNCE, + DEFAULT_CURSOR_MOTION_BLUR, + DEFAULT_CURSOR_SIZE, + DEFAULT_CURSOR_SMOOTHING, + DEFAULT_ZOOM_DEPTH, + DEFAULT_ZOOM_MOTION_BLUR, + clampFocusToDepth, + DEFAULT_CROP_REGION, + DEFAULT_ANNOTATION_POSITION, + DEFAULT_ANNOTATION_SIZE, + DEFAULT_ANNOTATION_STYLE, + DEFAULT_FIGURE_DATA, + DEFAULT_PLAYBACK_SPEED, + type ZoomDepth, + type ZoomFocus, + type ZoomRegion, + type CursorTelemetryPoint, + type TrimRegion, + type AnnotationRegion, + type CropRegion, + type FigureData, + type SpeedRegion, + type AudioRegion, + type PlaybackSpeed, +} from "./types"; +import { VideoExporter, GifExporter, type ExportProgress, type ExportQuality, type ExportSettings, type ExportFormat, type GifFrameRate, type GifSizePreset, GIF_SIZE_PRESETS, calculateOutputDimensions } from "@/lib/exporter"; +import { type AspectRatio, getAspectRatioValue } from "@/utils/aspectRatioUtils"; +import { getAssetPath } from "@/lib/assetPath"; import { useShortcuts } from "@/contexts/ShortcutsContext"; import { getAssetPath } from "@/lib/assetPath"; import { @@ -75,14 +121,16 @@ import { findDominantRegion } from "./videoPlayback/zoomRegionUtils"; const LOOP_CURSOR_END_WINDOW_MS = 670; type EditorHistorySnapshot = { - zoomRegions: ZoomRegion[]; - trimRegions: TrimRegion[]; - speedRegions: SpeedRegion[]; - annotationRegions: AnnotationRegion[]; - selectedZoomId: string | null; - selectedTrimId: string | null; - selectedSpeedId: string | null; - selectedAnnotationId: string | null; + zoomRegions: ZoomRegion[]; + trimRegions: TrimRegion[]; + speedRegions: SpeedRegion[]; + annotationRegions: AnnotationRegion[]; + audioRegions: AudioRegion[]; + selectedZoomId: string | null; + selectedTrimId: string | null; + selectedSpeedId: string | null; + selectedAnnotationId: string | null; + selectedAudioId: string | null; }; type PendingExportSave = { @@ -142,6 +190,8 @@ export default function VideoEditor() { const [selectedSpeedId, setSelectedSpeedId] = useState(null); const [annotationRegions, setAnnotationRegions] = useState([]); const [selectedAnnotationId, setSelectedAnnotationId] = useState(null); + const [audioRegions, setAudioRegions] = useState([]); + const [selectedAudioId, setSelectedAudioId] = useState(null); const [isExporting, setIsExporting] = useState(false); const [exportProgress, setExportProgress] = useState(null); const [exportError, setExportError] = useState(null); @@ -160,6 +210,7 @@ export default function VideoEditor() { const nextZoomIdRef = useRef(1); const nextTrimIdRef = useRef(1); const nextSpeedIdRef = useRef(1); + const nextAudioIdRef = useRef(1); const { shortcuts, isMac } = useShortcuts(); const nextAnnotationIdRef = useRef(1); @@ -178,10 +229,12 @@ export default function VideoEditor() { trimRegions: JSON.parse(JSON.stringify(snapshot.trimRegions)), speedRegions: JSON.parse(JSON.stringify(snapshot.speedRegions)), annotationRegions: JSON.parse(JSON.stringify(snapshot.annotationRegions)), + audioRegions: JSON.parse(JSON.stringify(snapshot.audioRegions)), selectedZoomId: snapshot.selectedZoomId, selectedTrimId: snapshot.selectedTrimId, selectedSpeedId: snapshot.selectedSpeedId, selectedAnnotationId: snapshot.selectedAnnotationId, + selectedAudioId: snapshot.selectedAudioId, }; }, []); @@ -191,20 +244,24 @@ export default function VideoEditor() { trimRegions, speedRegions, annotationRegions, + audioRegions, selectedZoomId, selectedTrimId, selectedSpeedId, selectedAnnotationId, + selectedAudioId, }; }, [ zoomRegions, trimRegions, speedRegions, annotationRegions, + audioRegions, selectedZoomId, selectedTrimId, selectedSpeedId, selectedAnnotationId, + selectedAudioId, ]); const applyHistorySnapshot = useCallback((snapshot: EditorHistorySnapshot) => { @@ -214,15 +271,18 @@ export default function VideoEditor() { setTrimRegions(cloned.trimRegions); setSpeedRegions(cloned.speedRegions); setAnnotationRegions(cloned.annotationRegions); + setAudioRegions(cloned.audioRegions); setSelectedZoomId(cloned.selectedZoomId); setSelectedTrimId(cloned.selectedTrimId); setSelectedSpeedId(cloned.selectedSpeedId); setSelectedAnnotationId(cloned.selectedAnnotationId); + setSelectedAudioId(cloned.selectedAudioId); nextZoomIdRef.current = deriveNextId("zoom", cloned.zoomRegions.map((region) => region.id)); nextTrimIdRef.current = deriveNextId("trim", cloned.trimRegions.map((region) => region.id)); nextSpeedIdRef.current = deriveNextId("speed", cloned.speedRegions.map((region) => region.id)); nextAnnotationIdRef.current = deriveNextId("annotation", cloned.annotationRegions.map((region) => region.id)); + nextAudioIdRef.current = deriveNextId("audio", cloned.audioRegions.map((region) => region.id)); nextAnnotationZIndexRef.current = cloned.annotationRegions.reduce((max, region) => Math.max(max, region.zIndex), 0) + 1; }, [cloneSnapshot]); @@ -292,6 +352,7 @@ export default function VideoEditor() { setTrimRegions(normalizedEditor.trimRegions); setSpeedRegions(normalizedEditor.speedRegions); setAnnotationRegions(normalizedEditor.annotationRegions); + setAudioRegions(normalizedEditor.audioRegions); setAspectRatio(normalizedEditor.aspectRatio); setExportQuality(normalizedEditor.exportQuality); setExportFormat(normalizedEditor.exportFormat); @@ -303,10 +364,12 @@ export default function VideoEditor() { setSelectedTrimId(null); setSelectedSpeedId(null); setSelectedAnnotationId(null); + setSelectedAudioId(null); nextZoomIdRef.current = deriveNextId("zoom", normalizedEditor.zoomRegions.map((region) => region.id)); nextTrimIdRef.current = deriveNextId("trim", normalizedEditor.trimRegions.map((region) => region.id)); nextSpeedIdRef.current = deriveNextId("speed", normalizedEditor.speedRegions.map((region) => region.id)); + nextAudioIdRef.current = deriveNextId("audio", normalizedEditor.audioRegions.map((region) => region.id)); nextAnnotationIdRef.current = deriveNextId( "annotation", normalizedEditor.annotationRegions.map((region) => region.id), @@ -343,6 +406,7 @@ export default function VideoEditor() { trimRegions, speedRegions, annotationRegions, + audioRegions, aspectRatio, exportQuality, exportFormat, @@ -371,6 +435,7 @@ export default function VideoEditor() { zoomRegions, trimRegions, speedRegions, + audioRegions, annotationRegions, aspectRatio, exportQuality, @@ -480,6 +545,7 @@ export default function VideoEditor() { trimRegions, speedRegions, annotationRegions, + audioRegions, aspectRatio, exportQuality, exportFormat, @@ -814,7 +880,10 @@ export default function VideoEditor() { const handleSelectZoom = useCallback((id: string | null) => { setSelectedZoomId(id); - if (id) setSelectedTrimId(null); + if (id) { + setSelectedTrimId(null); + setSelectedAudioId(null); + } }, []); const handleSelectTrim = useCallback((id: string | null) => { @@ -822,6 +891,7 @@ export default function VideoEditor() { if (id) { setSelectedZoomId(null); setSelectedAnnotationId(null); + setSelectedAudioId(null); } }, []); @@ -830,6 +900,7 @@ export default function VideoEditor() { if (id) { setSelectedZoomId(null); setSelectedTrimId(null); + setSelectedAudioId(null); } }, []); @@ -952,6 +1023,7 @@ export default function VideoEditor() { setSelectedZoomId(null); setSelectedTrimId(null); setSelectedAnnotationId(null); + setSelectedAudioId(null); } }, []); @@ -991,6 +1063,54 @@ export default function VideoEditor() { } }, [selectedSpeedId]); + const handleSelectAudio = useCallback((id: string | null) => { + setSelectedAudioId(id); + if (id) { + setSelectedZoomId(null); + setSelectedTrimId(null); + setSelectedAnnotationId(null); + setSelectedSpeedId(null); + } + }, []); + + const handleAudioAdded = useCallback((span: Span, audioPath: string) => { + const id = `audio-${nextAudioIdRef.current++}`; + const newRegion: AudioRegion = { + id, + startMs: Math.round(span.start), + endMs: Math.round(span.end), + audioPath, + volume: 1, + }; + setAudioRegions((prev) => [...prev, newRegion]); + setSelectedAudioId(id); + setSelectedZoomId(null); + setSelectedTrimId(null); + setSelectedAnnotationId(null); + setSelectedSpeedId(null); + }, []); + + const handleAudioSpanChange = useCallback((id: string, span: Span) => { + setAudioRegions((prev) => + prev.map((region) => + region.id === id + ? { + ...region, + startMs: Math.round(span.start), + endMs: Math.round(span.end), + } + : region, + ), + ); + }, []); + + const handleAudioDelete = useCallback((id: string) => { + setAudioRegions((prev) => prev.filter((region) => region.id !== id)); + if (selectedAudioId === id) { + setSelectedAudioId(null); + } + }, [selectedAudioId]); + const handleSpeedChange = useCallback((speed: PlaybackSpeed) => { if (!selectedSpeedId) return; setSpeedRegions((prev) => @@ -1210,6 +1330,78 @@ export default function VideoEditor() { } }, [selectedSpeedId, speedRegions]); + useEffect(() => { + if (selectedAudioId && !audioRegions.some((region) => region.id === selectedAudioId)) { + setSelectedAudioId(null); + } + }, [selectedAudioId, audioRegions]); + + // Audio playback sync: manage Audio elements that play in sync with video + const audioElementsRef = useRef>(new Map()); + + useEffect(() => { + const existing = audioElementsRef.current; + const currentIds = new Set(audioRegions.map(r => r.id)); + + // Remove old audio elements + for (const [id, audio] of existing) { + if (!currentIds.has(id)) { + audio.pause(); + audio.src = ''; + existing.delete(id); + } + } + + // Create/update audio elements + for (const region of audioRegions) { + let audio = existing.get(region.id); + if (!audio) { + audio = new Audio(); + audio.preload = 'auto'; + existing.set(region.id, audio); + } + const expectedSrc = toFileUrl(region.audioPath); + if (audio.src !== expectedSrc) { + audio.src = expectedSrc; + } + audio.volume = region.volume; + } + + return () => { + for (const audio of existing.values()) { + audio.pause(); + audio.src = ''; + } + existing.clear(); + }; + }, [audioRegions]); + + // Sync audio playback with video currentTime and isPlaying state + useEffect(() => { + for (const region of audioRegions) { + const audio = audioElementsRef.current.get(region.id); + if (!audio) continue; + + const currentTimeMs = currentTime * 1000; + const isInRegion = currentTimeMs >= region.startMs && currentTimeMs < region.endMs; + + if (isPlaying && isInRegion) { + const audioOffset = (currentTimeMs - region.startMs) / 1000; + // Only seek if significantly out of sync (> 200ms) + if (Math.abs(audio.currentTime - audioOffset) > 0.2) { + audio.currentTime = audioOffset; + } + if (audio.paused) { + audio.play().catch(() => {}); + } + } else { + if (!audio.paused) { + audio.pause(); + } + } + } + }, [isPlaying, currentTime, audioRegions]); + const showExportSuccessToast = useCallback((filePath: string) => { toast.success(`Exported successfully to ${filePath}`, { action: { @@ -1746,6 +1938,12 @@ export default function VideoEditor() { onSpeedDelete={handleSpeedDelete} selectedSpeedId={selectedSpeedId} onSelectSpeed={handleSelectSpeed} + audioRegions={audioRegions} + onAudioAdded={handleAudioAdded} + onAudioSpanChange={handleAudioSpanChange} + onAudioDelete={handleAudioDelete} + selectedAudioId={selectedAudioId} + onSelectAudio={handleSelectAudio} annotationRegions={annotationRegions} onAnnotationAdded={handleAnnotationAdded} onAnnotationSpanChange={handleAnnotationSpanChange} diff --git a/src/components/video-editor/projectPersistence.ts b/src/components/video-editor/projectPersistence.ts index be25b8fd..e7f13bc7 100644 --- a/src/components/video-editor/projectPersistence.ts +++ b/src/components/video-editor/projectPersistence.ts @@ -18,6 +18,7 @@ import { type CropRegion, type SpeedRegion, type TrimRegion, + type AudioRegion, type ZoomRegion, } from "./types"; @@ -42,6 +43,7 @@ export interface ProjectEditorState { trimRegions: TrimRegion[]; speedRegions: SpeedRegion[]; annotationRegions: AnnotationRegion[]; + audioRegions: AudioRegion[]; aspectRatio: AspectRatio; exportQuality: ExportQuality; exportFormat: ExportFormat; @@ -289,6 +291,25 @@ export function normalizeProjectEditor(editor: Partial): Pro }) : []; + const normalizedAudioRegions: AudioRegion[] = Array.isArray((editor as Partial).audioRegions) + ? ((editor as Partial).audioRegions as AudioRegion[]) + .filter((region): region is AudioRegion => Boolean(region && typeof region.id === "string")) + .map((region) => { + const rawStart = isFiniteNumber(region.startMs) ? Math.round(region.startMs) : 0; + const rawEnd = isFiniteNumber(region.endMs) ? Math.round(region.endMs) : rawStart + 1000; + const startMs = Math.max(0, Math.min(rawStart, rawEnd)); + const endMs = Math.max(startMs + 1, rawEnd); + + return { + id: region.id, + startMs, + endMs, + audioPath: typeof region.audioPath === "string" ? region.audioPath : "", + volume: isFiniteNumber(region.volume) ? clamp(region.volume, 0, 2) : 1, + }; + }) + : []; + const rawCropX = isFiniteNumber(editor.cropRegion?.x) ? editor.cropRegion.x : DEFAULT_CROP_REGION.x; const rawCropY = isFiniteNumber(editor.cropRegion?.y) ? editor.cropRegion.y : DEFAULT_CROP_REGION.y; const rawCropWidth = isFiniteNumber(editor.cropRegion?.width) ? editor.cropRegion.width : DEFAULT_CROP_REGION.width; @@ -331,6 +352,7 @@ export function normalizeProjectEditor(editor: Partial): Pro trimRegions: normalizedTrimRegions, speedRegions: normalizedSpeedRegions, annotationRegions: normalizedAnnotationRegions, + audioRegions: normalizedAudioRegions, aspectRatio: typeof editor.aspectRatio === "string" && (validAspectRatios.has(editor.aspectRatio as AspectRatio) || isCustomAspectRatio(editor.aspectRatio)) diff --git a/src/components/video-editor/timeline/Item.tsx b/src/components/video-editor/timeline/Item.tsx index 2870fc92..0b319feb 100644 --- a/src/components/video-editor/timeline/Item.tsx +++ b/src/components/video-editor/timeline/Item.tsx @@ -4,18 +4,19 @@ import { Gauge, MessageSquare, Scissors, ZoomIn } from "lucide-react"; import { useMemo } from "react"; import { useScopedT } from "@/contexts/I18nContext"; import { cn } from "@/lib/utils"; +import { ZoomIn, Scissors, MessageSquare, Gauge, Music } from "lucide-react"; import glassStyles from "./ItemGlass.module.css"; interface ItemProps { - id: string; - span: Span; - rowId: string; - children: React.ReactNode; - isSelected?: boolean; - onSelect?: () => void; - zoomDepth?: number; - speedValue?: number; - variant?: "zoom" | "trim" | "annotation" | "speed"; + id: string; + span: Span; + rowId: string; + children: React.ReactNode; + isSelected?: boolean; + onSelect?: () => void; + zoomDepth?: number; + speedValue?: number; + variant?: 'zoom' | 'trim' | 'annotation' | 'speed' | 'audio'; } // Map zoom depth to multiplier labels @@ -56,19 +57,30 @@ export default function Item({ data: { rowId }, }); - const isZoom = variant === "zoom"; - const isTrim = variant === "trim"; - const isSpeed = variant === "speed"; + const isZoom = variant === 'zoom'; + const isTrim = variant === 'trim'; + const isSpeed = variant === 'speed'; + const isAudio = variant === 'audio'; - const glassClass = isZoom - ? glassStyles.glassGreen - : isTrim - ? glassStyles.glassRed - : isSpeed - ? glassStyles.glassAmber - : glassStyles.glassYellow; + const glassClass = isZoom + ? glassStyles.glassGreen + : isTrim + ? glassStyles.glassRed + : isSpeed + ? glassStyles.glassAmber + : isAudio + ? glassStyles.glassPurple + : glassStyles.glassYellow; - const endCapColor = isZoom ? "#2563EB" : isTrim ? "#ef4444" : isSpeed ? "#d97706" : "#B4A046"; + const endCapColor = isZoom + ? '#2563EB' + : isTrim + ? '#ef4444' + : isSpeed + ? '#d97706' + : isAudio + ? '#a855f7' + : '#B4A046'; const timeLabel = useMemo( () => `${formatMs(span.start)} – ${formatMs(span.end)}`, @@ -78,93 +90,88 @@ export default function Item({ const MIN_ITEM_PX = 6; const safeItemStyle = { ...itemStyle, minWidth: MIN_ITEM_PX }; - return ( -
onSelect?.()} - className="group" - > -
-
{ - event.stopPropagation(); - onSelect?.(); - }} - > -
-
- {/* Content */} -
-
- {isZoom ? ( - <> - - - {ZOOM_LABELS[zoomDepth] || `${zoomDepth}×`} - - - ) : isTrim ? ( - <> - - - {t("trim.label", undefined, { index: "" }).trim()} - - - ) : isSpeed ? ( - <> - - - {speedValue !== undefined ? `${speedValue}×` : t("speed.label")} - - - ) : ( - <> - - - {children} - - - )} -
- - {timeLabel} - -
-
-
-
- ); + return ( +
onSelect?.()} + className="group" + > +
+
{ + event.stopPropagation(); + onSelect?.(); + }} + > +
+
+ {/* Content */} +
+
+ {isZoom ? ( + <> + + + {ZOOM_LABELS[zoomDepth] || `${zoomDepth}×`} + + + ) : isTrim ? ( + <> + + + Trim + + + ) : isSpeed ? ( + <> + + + {speedValue !== undefined ? `${speedValue}×` : 'Speed'} + + + ) : isAudio ? ( + <> + + + {children} + + + ) : ( + <> + + + {children} + + + )} +
+ + {timeLabel} + +
+
+
+
+ ); } diff --git a/src/components/video-editor/timeline/ItemGlass.module.css b/src/components/video-editor/timeline/ItemGlass.module.css index 23754429..9c96ea22 100644 --- a/src/components/video-editor/timeline/ItemGlass.module.css +++ b/src/components/video-editor/timeline/ItemGlass.module.css @@ -102,6 +102,32 @@ z-index: 10; } +.glassPurple { + position: relative; + border-radius: 8px; + -corner-smoothing: antialiased; + background: rgba(168, 85, 247, 0.15); + border: 1px solid rgba(168, 85, 247, 0.3); + box-shadow: 0 2px 12px 0 rgba(168, 85, 247, 0.1) inset; + margin: 2px 0; + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} + +.glassPurple:hover { + background: rgba(168, 85, 247, 0.25); + border-color: rgba(168, 85, 247, 0.5); + box-shadow: 0 4px 20px 0 rgba(168, 85, 247, 0.2) inset; +} + +.glassPurple.selected { + background: rgba(168, 85, 247, 0.35); + border-color: #a855f7; + box-shadow: 0 0 0 1px #a855f7, 0 4px 20px 0 rgba(168, 85, 247, 0.3) inset; + z-index: 10; +} + .zoomEndCap { position: absolute; top: 0; @@ -120,7 +146,9 @@ .glassYellow:hover .zoomEndCap, .glassYellow.selected .zoomEndCap, .glassAmber:hover .zoomEndCap, -.glassAmber.selected .zoomEndCap { +.glassAmber.selected .zoomEndCap, +.glassPurple:hover .zoomEndCap, +.glassPurple.selected .zoomEndCap { opacity: 1; } diff --git a/src/components/video-editor/timeline/TimelineEditor.tsx b/src/components/video-editor/timeline/TimelineEditor.tsx index 13ce0719..31d9c496 100644 --- a/src/components/video-editor/timeline/TimelineEditor.tsx +++ b/src/components/video-editor/timeline/TimelineEditor.tsx @@ -1,5 +1,16 @@ -import type { Range, Span } from "dnd-timeline"; +import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type WheelEvent } from "react"; import { useTimelineContext } from "dnd-timeline"; +import { Button } from "@/components/ui/button"; +import { Plus, Scissors, ZoomIn, MessageSquare, ChevronDown, Check, Gauge, WandSparkles, Music } from "lucide-react"; +import { toast } from "sonner"; +import { cn } from "@/lib/utils"; +import TimelineWrapper from "./TimelineWrapper"; +import Row from "./Row"; +import Item from "./Item"; +import KeyframeMarkers from "./KeyframeMarkers"; +import type { Range, Span } from "dnd-timeline"; +import type { ZoomRegion, TrimRegion, AnnotationRegion, SpeedRegion, AudioRegion, CursorTelemetryPoint, ZoomFocus } from "../types"; +import { v4 as uuidv4 } from 'uuid'; import { Check, ChevronDown, @@ -44,42 +55,49 @@ const ZOOM_ROW_ID = "row-zoom"; const TRIM_ROW_ID = "row-trim"; const ANNOTATION_ROW_ID = "row-annotation"; const SPEED_ROW_ID = "row-speed"; +const AUDIO_ROW_ID = "row-audio"; const FALLBACK_RANGE_MS = 1000; const TARGET_MARKER_COUNT = 12; const SUGGESTION_SPACING_MS = 1800; interface TimelineEditorProps { - videoDuration: number; - currentTime: number; - onSeek?: (time: number) => void; - cursorTelemetry?: CursorTelemetryPoint[]; - zoomRegions: ZoomRegion[]; - onZoomAdded: (span: Span) => void; - onZoomSuggested?: (span: Span, focus: ZoomFocus) => void; - onZoomSpanChange: (id: string, span: Span) => void; - onZoomDelete: (id: string) => void; - selectedZoomId: string | null; - onSelectZoom: (id: string | null) => void; - trimRegions?: TrimRegion[]; - onTrimAdded?: (span: Span) => void; - onTrimSpanChange?: (id: string, span: Span) => void; - onTrimDelete?: (id: string) => void; - selectedTrimId?: string | null; - onSelectTrim?: (id: string | null) => void; - annotationRegions?: AnnotationRegion[]; - onAnnotationAdded?: (span: Span) => void; - onAnnotationSpanChange?: (id: string, span: Span) => void; - onAnnotationDelete?: (id: string) => void; - selectedAnnotationId?: string | null; - onSelectAnnotation?: (id: string | null) => void; - speedRegions?: SpeedRegion[]; - onSpeedAdded?: (span: Span) => void; - onSpeedSpanChange?: (id: string, span: Span) => void; - onSpeedDelete?: (id: string) => void; - selectedSpeedId?: string | null; - onSelectSpeed?: (id: string | null) => void; - aspectRatio: AspectRatio; - onAspectRatioChange: (aspectRatio: AspectRatio) => void; + videoDuration: number; + currentTime: number; + onSeek?: (time: number) => void; + cursorTelemetry?: CursorTelemetryPoint[]; + zoomRegions: ZoomRegion[]; + onZoomAdded: (span: Span) => void; + onZoomSuggested?: (span: Span, focus: ZoomFocus) => void; + onZoomSpanChange: (id: string, span: Span) => void; + onZoomDelete: (id: string) => void; + selectedZoomId: string | null; + onSelectZoom: (id: string | null) => void; + trimRegions?: TrimRegion[]; + onTrimAdded?: (span: Span) => void; + onTrimSpanChange?: (id: string, span: Span) => void; + onTrimDelete?: (id: string) => void; + selectedTrimId?: string | null; + onSelectTrim?: (id: string | null) => void; + annotationRegions?: AnnotationRegion[]; + onAnnotationAdded?: (span: Span) => void; + onAnnotationSpanChange?: (id: string, span: Span) => void; + onAnnotationDelete?: (id: string) => void; + selectedAnnotationId?: string | null; + onSelectAnnotation?: (id: string | null) => void; + speedRegions?: SpeedRegion[]; + onSpeedAdded?: (span: Span) => void; + onSpeedSpanChange?: (id: string, span: Span) => void; + onSpeedDelete?: (id: string) => void; + selectedSpeedId?: string | null; + onSelectSpeed?: (id: string | null) => void; + audioRegions?: AudioRegion[]; + onAudioAdded?: (span: Span, audioPath: string) => void; + onAudioSpanChange?: (id: string, span: Span) => void; + onAudioDelete?: (id: string) => void; + selectedAudioId?: string | null; + onSelectAudio?: (id: string | null) => void; + aspectRatio: AspectRatio; + onAspectRatioChange: (aspectRatio: AspectRatio) => void; } interface TimelineScaleConfig { @@ -89,13 +107,13 @@ interface TimelineScaleConfig { } interface TimelineRenderItem { - id: string; - rowId: string; - span: Span; - label: string; - zoomDepth?: number; - speedValue?: number; - variant: "zoom" | "trim" | "annotation" | "speed"; + id: string; + rowId: string; + span: Span; + label: string; + zoomDepth?: number; + speedValue?: number; + variant: 'zoom' | 'trim' | 'annotation' | 'speed' | 'audio'; } const SCALE_CANDIDATES = [ @@ -443,33 +461,37 @@ function TimelineAxis({ } function Timeline({ - items, - videoDurationMs, - currentTimeMs, - onSeek, - onSelectZoom, - onSelectTrim, - onSelectAnnotation, - onSelectSpeed, - selectedZoomId, - selectedTrimId, - selectedAnnotationId, - selectedSpeedId, - keyframes = [], + items, + videoDurationMs, + currentTimeMs, + onSeek, + onSelectZoom, + onSelectTrim, + onSelectAnnotation, + onSelectSpeed, + onSelectAudio, + selectedZoomId, + selectedTrimId, + selectedAnnotationId, + selectedSpeedId, + selectedAudioId, + keyframes = [], }: { - items: TimelineRenderItem[]; - videoDurationMs: number; - currentTimeMs: number; - onSeek?: (time: number) => void; - onSelectZoom?: (id: string | null) => void; - onSelectTrim?: (id: string | null) => void; - onSelectAnnotation?: (id: string | null) => void; - onSelectSpeed?: (id: string | null) => void; - selectedZoomId: string | null; - selectedTrimId?: string | null; - selectedAnnotationId?: string | null; - selectedSpeedId?: string | null; - keyframes?: { id: string; time: number }[]; + items: TimelineRenderItem[]; + videoDurationMs: number; + currentTimeMs: number; + onSeek?: (time: number) => void; + onSelectZoom?: (id: string | null) => void; + onSelectTrim?: (id: string | null) => void; + onSelectAnnotation?: (id: string | null) => void; + onSelectSpeed?: (id: string | null) => void; + onSelectAudio?: (id: string | null) => void; + selectedZoomId: string | null; + selectedTrimId?: string | null; + selectedAnnotationId?: string | null; + selectedSpeedId?: string | null; + selectedAudioId?: string | null; + keyframes?: { id: string; time: number }[]; }) { const { setTimelineRef, style, sidebarWidth, range, pixelsToValue } = useTimelineContext(); const localTimelineRef = useRef(null); @@ -486,12 +508,13 @@ function Timeline({ (e: React.MouseEvent) => { if (!onSeek || videoDurationMs <= 0) return; - // Only clear selection if clicking on empty space (not on items) - // This is handled by event propagation - items stop propagation - onSelectZoom?.(null); - onSelectTrim?.(null); - onSelectAnnotation?.(null); - onSelectSpeed?.(null); + // Only clear selection if clicking on empty space (not on items) + // This is handled by event propagation - items stop propagation + onSelectZoom?.(null); + onSelectTrim?.(null); + onSelectAnnotation?.(null); + onSelectSpeed?.(null); + onSelectAudio?.(null); const rect = e.currentTarget.getBoundingClientRect(); const clickX = e.clientX - rect.left - sidebarWidth; @@ -502,25 +525,14 @@ function Timeline({ const absoluteMs = Math.max(0, Math.min(range.start + relativeMs, videoDurationMs)); const timeInSeconds = absoluteMs / 1000; - onSeek(timeInSeconds); - }, - [ - onSeek, - onSelectZoom, - onSelectTrim, - onSelectAnnotation, - onSelectSpeed, - videoDurationMs, - sidebarWidth, - range.start, - pixelsToValue, - ], - ); + onSeek(timeInSeconds); + }, [onSeek, onSelectZoom, onSelectTrim, onSelectAnnotation, onSelectSpeed, onSelectAudio, videoDurationMs, sidebarWidth, range.start, pixelsToValue]); - const zoomItems = items.filter((item) => item.rowId === ZOOM_ROW_ID); - const trimItems = items.filter((item) => item.rowId === TRIM_ROW_ID); - const annotationItems = items.filter((item) => item.rowId === ANNOTATION_ROW_ID); - const speedItems = items.filter((item) => item.rowId === SPEED_ROW_ID); + const zoomItems = items.filter(item => item.rowId === ZOOM_ROW_ID); + const trimItems = items.filter(item => item.rowId === TRIM_ROW_ID); + const annotationItems = items.filter(item => item.rowId === ANNOTATION_ROW_ID); + const speedItems = items.filter(item => item.rowId === SPEED_ROW_ID); + const audioItems = items.filter(item => item.rowId === AUDIO_ROW_ID); return (
- - {speedItems.map((item) => ( - onSelectSpeed?.(item.id)} - variant="speed" - speedValue={item.speedValue} - > - {item.label} - - ))} - -
- ); + + {speedItems.map((item) => ( + onSelectSpeed?.(item.id)} + variant="speed" + speedValue={item.speedValue} + > + {item.label} + + ))} + + + + {audioItems.map((item) => ( + onSelectAudio?.(item.id)} + variant="audio" + > + {item.label} + + ))} + +
+ ); } export default function TimelineEditor({ - videoDuration, - currentTime, - onSeek, - cursorTelemetry = [], - zoomRegions, - onZoomAdded, - onZoomSuggested, - onZoomSpanChange, - onZoomDelete, - selectedZoomId, - onSelectZoom, - trimRegions = [], - onTrimAdded, - onTrimSpanChange, - onTrimDelete, - selectedTrimId, - onSelectTrim, - annotationRegions = [], - onAnnotationAdded, - onAnnotationSpanChange, - onAnnotationDelete, - selectedAnnotationId, - onSelectAnnotation, - speedRegions = [], - onSpeedAdded, - onSpeedSpanChange, - onSpeedDelete, - selectedSpeedId, - onSelectSpeed, - aspectRatio, - onAspectRatioChange, + videoDuration, + currentTime, + onSeek, + cursorTelemetry = [], + zoomRegions, + onZoomAdded, + onZoomSuggested, + onZoomSpanChange, + onZoomDelete, + selectedZoomId, + onSelectZoom, + trimRegions = [], + onTrimAdded, + onTrimSpanChange, + onTrimDelete, + selectedTrimId, + onSelectTrim, + annotationRegions = [], + onAnnotationAdded, + onAnnotationSpanChange, + onAnnotationDelete, + selectedAnnotationId, + onSelectAnnotation, + speedRegions = [], + onSpeedAdded, + onSpeedSpanChange, + onSpeedDelete, + selectedSpeedId, + onSelectSpeed, + audioRegions = [], + onAudioAdded, + onAudioSpanChange, + onAudioDelete, + selectedAudioId, + onSelectAudio, + aspectRatio, + onAspectRatioChange, }: TimelineEditorProps) { const totalMs = useMemo(() => Math.max(0, Math.round(videoDuration * 1000)), [videoDuration]); const currentTimeMs = useMemo(() => Math.round(currentTime * 1000), [currentTime]); @@ -749,6 +783,12 @@ export default function TimelineEditor({ onSelectSpeed(null); }, [selectedSpeedId, onSpeedDelete, onSelectSpeed]); + const deleteSelectedAudio = useCallback(() => { + if (!selectedAudioId || !onAudioDelete || !onSelectAudio) return; + onAudioDelete(selectedAudioId); + onSelectAudio(null); + }, [selectedAudioId, onAudioDelete, onSelectAudio]); + useEffect(() => { setRange(createInitialRange(totalMs)); }, [totalMs]); @@ -759,9 +799,11 @@ export default function TimelineEditor({ const zoomRegionsRef = useRef(zoomRegions); const trimRegionsRef = useRef(trimRegions); const speedRegionsRef = useRef(speedRegions); + const audioRegionsRef = useRef(audioRegions); zoomRegionsRef.current = zoomRegions; trimRegionsRef.current = trimRegions; speedRegionsRef.current = speedRegions; + audioRegionsRef.current = audioRegions; useEffect(() => { if (totalMs === 0 || safeMinDurationMs <= 0) { @@ -803,8 +845,20 @@ export default function TimelineEditor({ onSpeedSpanChange?.(region.id, { start: normalizedStart, end: normalizedEnd }); } }); + + audioRegionsRef.current.forEach((region) => { + const clampedStart = Math.max(0, Math.min(region.startMs, totalMs)); + const minEnd = clampedStart + safeMinDurationMs; + const clampedEnd = Math.min(totalMs, Math.max(minEnd, region.endMs)); + const normalizedStart = Math.max(0, Math.min(clampedStart, totalMs - safeMinDurationMs)); + const normalizedEnd = Math.max(minEnd, Math.min(clampedEnd, totalMs)); + + if (normalizedStart !== region.startMs || normalizedEnd !== region.endMs) { + onAudioSpanChange?.(region.id, { start: normalizedStart, end: normalizedEnd }); + } + }); // Only re-run when the timeline scale changes, not on every region edit - }, [totalMs, safeMinDurationMs, onZoomSpanChange, onTrimSpanChange, onSpeedSpanChange]); + }, [totalMs, safeMinDurationMs, onZoomSpanChange, onTrimSpanChange, onSpeedSpanChange, onAudioSpanChange]); const hasOverlap = useCallback((newSpan: Span, excludeId?: string): boolean => { // Determine which row the item belongs to @@ -812,13 +866,14 @@ export default function TimelineEditor({ const isTrimItem = trimRegions.some(r => r.id === excludeId); const isAnnotationItem = annotationRegions.some(r => r.id === excludeId); const isSpeedItem = speedRegions.some(r => r.id === excludeId); + const isAudioItem = audioRegions.some(r => r.id === excludeId); if (isAnnotationItem) { return false; } // Helper to check overlap against a specific set of regions - const checkOverlap = (regions: (ZoomRegion | TrimRegion | SpeedRegion)[]) => { + const checkOverlap = (regions: (ZoomRegion | TrimRegion | SpeedRegion | AudioRegion)[]) => { return regions.some((region) => { if (region.id === excludeId) return false; // True overlap: regions actually intersect (not just adjacent) @@ -838,8 +893,12 @@ export default function TimelineEditor({ return checkOverlap(speedRegions); } + if (isAudioItem) { + return checkOverlap(audioRegions); + } + return false; - }, [zoomRegions, trimRegions, annotationRegions, speedRegions]); + }, [zoomRegions, trimRegions, annotationRegions, speedRegions, audioRegions]); // Keep newly added timeline regions at the original short default instead of // scaling them with the full recording length. @@ -1023,6 +1082,52 @@ export default function TimelineEditor({ onSpeedAdded({ start: startPos, end: startPos + actualDuration }); }, [videoDuration, totalMs, currentTimeMs, speedRegions, onSpeedAdded, defaultRegionDurationMs]); + const handleAddAudio = useCallback(async () => { + if (!videoDuration || videoDuration === 0 || totalMs === 0 || !onAudioAdded) { + return; + } + + const result = await (window as any).electronAPI.openAudioFilePicker(); + if (!result?.success || !result.path) { + return; + } + + // Load the audio file to get its full duration + const audioDurationMs = await new Promise((resolve) => { + const audio = new Audio(`file://${result.path}`); + audio.addEventListener('loadedmetadata', () => { + resolve(Math.round(audio.duration * 1000)); + }); + audio.addEventListener('error', () => { + resolve(0); + }); + }); + + if (audioDurationMs <= 0) { + toast.error("Could not read audio file", { + description: "The selected file may be corrupted or in an unsupported format.", + }); + return; + } + + const startPos = Math.max(0, Math.min(currentTimeMs, totalMs)); + const sorted = [...audioRegions].sort((a, b) => a.startMs - b.startMs); + const nextRegion = sorted.find(region => region.startMs > startPos); + const gapToNext = nextRegion ? nextRegion.startMs - startPos : totalMs - startPos; + + const isOverlapping = sorted.some(region => startPos >= region.startMs && startPos < region.endMs); + if (isOverlapping || gapToNext <= 0) { + toast.error("Cannot place audio here", { + description: "Audio region already exists at this location or not enough space available.", + }); + return; + } + + // Use full audio duration, but clamp to available gap and video length + const actualDuration = Math.min(audioDurationMs, gapToNext, totalMs - startPos); + onAudioAdded({ start: startPos, end: startPos + actualDuration }, result.path); + }, [videoDuration, totalMs, currentTimeMs, audioRegions, onAudioAdded]); + const handleAddAnnotation = useCallback(() => { if (!videoDuration || videoDuration === 0 || totalMs === 0 || !onAnnotationAdded) { return; @@ -1096,12 +1201,14 @@ export default function TimelineEditor({ deleteSelectedAnnotation(); } else if (selectedSpeedId) { deleteSelectedSpeed(); + } else if (selectedAudioId) { + deleteSelectedAudio(); } } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); - }, [addKeyframe, handleAddZoom, handleAddTrim, handleAddAnnotation, handleAddSpeed, deleteSelectedKeyframe, deleteSelectedZoom, deleteSelectedTrim, deleteSelectedAnnotation, deleteSelectedSpeed, selectedKeyframeId, selectedZoomId, selectedTrimId, selectedAnnotationId, selectedSpeedId, annotationRegions, currentTime, onSelectAnnotation, keyShortcuts, isMac]); + }, [addKeyframe, handleAddZoom, handleAddTrim, handleAddAnnotation, handleAddSpeed, deleteSelectedKeyframe, deleteSelectedZoom, deleteSelectedTrim, deleteSelectedAnnotation, deleteSelectedSpeed, deleteSelectedAudio, selectedKeyframeId, selectedZoomId, selectedTrimId, selectedAnnotationId, selectedSpeedId, selectedAudioId, annotationRegions, currentTime, onSelectAnnotation, keyShortcuts, isMac]); const clampedRange = useMemo(() => { if (totalMs === 0) { @@ -1163,16 +1270,25 @@ export default function TimelineEditor({ variant: 'speed', })); - return [...zooms, ...trims, ...annotations, ...speeds]; - }, [zoomRegions, trimRegions, annotationRegions, speedRegions]); + const audios: TimelineRenderItem[] = audioRegions.map((region, index) => ({ + id: region.id, + rowId: AUDIO_ROW_ID, + span: { start: region.startMs, end: region.endMs }, + label: `Audio ${index + 1}`, + variant: 'audio', + })); + + return [...zooms, ...trims, ...annotations, ...speeds, ...audios]; + }, [zoomRegions, trimRegions, annotationRegions, speedRegions, audioRegions]); // Flat list of all non-annotation region spans for neighbour-clamping during drag/resize const allRegionSpans = useMemo(() => { const zooms = zoomRegions.map((r) => ({ id: r.id, start: r.startMs, end: r.endMs })); const trims = trimRegions.map((r) => ({ id: r.id, start: r.startMs, end: r.endMs })); const speeds = speedRegions.map((r) => ({ id: r.id, start: r.startMs, end: r.endMs })); - return [...zooms, ...trims, ...speeds]; - }, [zoomRegions, trimRegions, speedRegions]); + const audios = audioRegions.map((r) => ({ id: r.id, start: r.startMs, end: r.endMs })); + return [...zooms, ...trims, ...speeds, ...audios]; + }, [zoomRegions, trimRegions, speedRegions, audioRegions]); const handleItemSpanChange = useCallback((id: string, span: Span) => { // Check if it's a zoom, trim, speed, or annotation item @@ -1184,8 +1300,10 @@ export default function TimelineEditor({ onSpeedSpanChange?.(id, span); } else if (annotationRegions.some(r => r.id === id)) { onAnnotationSpanChange?.(id, span); + } else if (audioRegions.some(r => r.id === id)) { + onAudioSpanChange?.(id, span); } - }, [zoomRegions, trimRegions, speedRegions, annotationRegions, onZoomSpanChange, onTrimSpanChange, onSpeedSpanChange, onAnnotationSpanChange]); + }, [zoomRegions, trimRegions, speedRegions, annotationRegions, audioRegions, onZoomSpanChange, onTrimSpanChange, onSpeedSpanChange, onAnnotationSpanChange, onAudioSpanChange]); const panTimelineRange = useCallback((deltaMs: number) => { if (!Number.isFinite(deltaMs) || deltaMs === 0 || totalMs <= 0) { @@ -1297,6 +1415,15 @@ export default function TimelineEditor({ > +
@@ -1407,10 +1534,12 @@ export default function TimelineEditor({ onSelectTrim={onSelectTrim} onSelectAnnotation={onSelectAnnotation} onSelectSpeed={onSelectSpeed} + onSelectAudio={onSelectAudio} selectedZoomId={selectedZoomId} selectedTrimId={selectedTrimId} selectedAnnotationId={selectedAnnotationId} selectedSpeedId={selectedSpeedId} + selectedAudioId={selectedAudioId} keyframes={keyframes} /> From 20e6c4776da06f26194c5dc90013b7fc524699bd Mon Sep 17 00:00:00 2001 From: 4rjunc Date: Sun, 15 Mar 2026 14:26:10 +0530 Subject: [PATCH 04/40] fix: after rebase --- src/components/video-editor/VideoEditor.tsx | 68 ++----------------- src/components/video-editor/timeline/Item.tsx | 3 +- .../video-editor/timeline/TimelineEditor.tsx | 44 +++--------- 3 files changed, 14 insertions(+), 101 deletions(-) diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index 323f34fe..f4a1b325 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -4,7 +4,8 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels"; import { toast } from "sonner"; import { Toaster } from "@/components/ui/sonner"; -import { useI18n } from "@/contexts/I18nContext"; +import { useI18n, useScopedT } from "@/contexts/I18nContext"; +import { useShortcuts } from "@/contexts/ShortcutsContext"; import { SUPPORTED_LOCALES } from "@/i18n/config"; import type { AppLocale } from "@/i18n/config"; @@ -23,7 +24,6 @@ import { validateProjectData, } from "./projectPersistence"; -import type { Span } from "dnd-timeline"; import { DEFAULT_CURSOR_CLICK_BOUNCE, DEFAULT_CURSOR_MOTION_BLUR, @@ -53,69 +53,9 @@ import { import { VideoExporter, GifExporter, type ExportProgress, type ExportQuality, type ExportSettings, type ExportFormat, type GifFrameRate, type GifSizePreset, GIF_SIZE_PRESETS, calculateOutputDimensions } from "@/lib/exporter"; import { type AspectRatio, getAspectRatioValue } from "@/utils/aspectRatioUtils"; import { getAssetPath } from "@/lib/assetPath"; -import { useShortcuts } from "@/contexts/ShortcutsContext"; -import { getAssetPath } from "@/lib/assetPath"; -import { - calculateOutputDimensions, - type ExportFormat, - type ExportProgress, - type ExportQuality, - type ExportSettings, - GIF_SIZE_PRESETS, - GifExporter, - type GifFrameRate, - type GifSizePreset, - VideoExporter, -} from "@/lib/exporter"; import { matchesShortcut } from "@/lib/shortcuts"; -import { DEFAULT_WALLPAPER_RELATIVE_PATH, WALLPAPER_PATHS } from "@/lib/wallpapers"; -import { type AspectRatio, getAspectRatioValue } from "@/utils/aspectRatioUtils"; -import { ExportDialog } from "./ExportDialog"; -import PlaybackControls from "./PlaybackControls"; -import { - createProjectData, - deriveNextId, - fromFileUrl, - normalizeProjectEditor, - toFileUrl, - validateProjectData, -} from "./projectPersistence"; -import { SettingsPanel } from "./SettingsPanel"; -import TimelineEditor from "./timeline/TimelineEditor"; -import { - detectInteractionCandidates, - normalizeCursorTelemetry, -} from "./timeline/zoomSuggestionUtils"; -import { - type AnnotationRegion, - type CropRegion, - type CursorTelemetryPoint, - clampFocusToDepth, - DEFAULT_ANNOTATION_POSITION, - DEFAULT_ANNOTATION_SIZE, - DEFAULT_ANNOTATION_STYLE, - DEFAULT_CROP_REGION, - DEFAULT_CURSOR_CLICK_BOUNCE, - DEFAULT_CURSOR_MOTION_BLUR, - DEFAULT_CURSOR_SIZE, - DEFAULT_CURSOR_SMOOTHING, - DEFAULT_FIGURE_DATA, - DEFAULT_PLAYBACK_SPEED, - DEFAULT_ZOOM_DEPTH, - DEFAULT_ZOOM_MOTION_BLUR, - type FigureData, - type PlaybackSpeed, - type SpeedRegion, - type TrimRegion, - type ZoomDepth, - type ZoomFocus, - type ZoomRegion, -} from "./types"; -import VideoPlayback, { VideoPlaybackRef } from "./VideoPlayback"; -import { - buildLoopedCursorTelemetry, - getDisplayedTimelineWindowMs, -} from "./videoPlayback/cursorLoopTelemetry"; +import { detectInteractionCandidates, normalizeCursorTelemetry } from "./timeline/zoomSuggestionUtils"; +import { buildLoopedCursorTelemetry, getDisplayedTimelineWindowMs } from "./videoPlayback/cursorLoopTelemetry"; import { findDominantRegion } from "./videoPlayback/zoomRegionUtils"; const LOOP_CURSOR_END_WINDOW_MS = 670; diff --git a/src/components/video-editor/timeline/Item.tsx b/src/components/video-editor/timeline/Item.tsx index 0b319feb..1f9d3eb8 100644 --- a/src/components/video-editor/timeline/Item.tsx +++ b/src/components/video-editor/timeline/Item.tsx @@ -1,10 +1,9 @@ import type { Span } from "dnd-timeline"; import { useItem } from "dnd-timeline"; -import { Gauge, MessageSquare, Scissors, ZoomIn } from "lucide-react"; +import { Gauge, MessageSquare, Music, Scissors, ZoomIn } from "lucide-react"; import { useMemo } from "react"; import { useScopedT } from "@/contexts/I18nContext"; import { cn } from "@/lib/utils"; -import { ZoomIn, Scissors, MessageSquare, Gauge, Music } from "lucide-react"; import glassStyles from "./ItemGlass.module.css"; interface ItemProps { diff --git a/src/components/video-editor/timeline/TimelineEditor.tsx b/src/components/video-editor/timeline/TimelineEditor.tsx index 31d9c496..4ecad060 100644 --- a/src/components/video-editor/timeline/TimelineEditor.tsx +++ b/src/components/video-editor/timeline/TimelineEditor.tsx @@ -1,54 +1,28 @@ import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type WheelEvent } from "react"; import { useTimelineContext } from "dnd-timeline"; import { Button } from "@/components/ui/button"; -import { Plus, Scissors, ZoomIn, MessageSquare, ChevronDown, Check, Gauge, WandSparkles, Music } from "lucide-react"; -import { toast } from "sonner"; -import { cn } from "@/lib/utils"; -import TimelineWrapper from "./TimelineWrapper"; -import Row from "./Row"; -import Item from "./Item"; -import KeyframeMarkers from "./KeyframeMarkers"; -import type { Range, Span } from "dnd-timeline"; -import type { ZoomRegion, TrimRegion, AnnotationRegion, SpeedRegion, AudioRegion, CursorTelemetryPoint, ZoomFocus } from "../types"; -import { v4 as uuidv4 } from 'uuid'; -import { - Check, - ChevronDown, - Gauge, - MessageSquare, - Plus, - Scissors, - WandSparkles, - ZoomIn, -} from "lucide-react"; -import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type WheelEvent } from "react"; -import { toast } from "sonner"; -import { v4 as uuidv4 } from "uuid"; -import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; +import { Plus, Scissors, ZoomIn, MessageSquare, ChevronDown, Check, Gauge, WandSparkles, Music } from "lucide-react"; +import { toast } from "sonner"; +import { cn } from "@/lib/utils"; +import { v4 as uuidv4 } from 'uuid'; +import { useScopedT } from "@/contexts/I18nContext"; import { useShortcuts } from "@/contexts/ShortcutsContext"; import { matchesShortcut } from "@/lib/shortcuts"; -import { cn } from "@/lib/utils"; import { ASPECT_RATIOS, type AspectRatio, getAspectRatioLabel, isCustomAspectRatio } from "@/utils/aspectRatioUtils"; import { formatShortcut } from "@/utils/platformUtils"; import { TutorialHelp } from "../TutorialHelp"; -import type { - AnnotationRegion, - CursorTelemetryPoint, - SpeedRegion, - TrimRegion, - ZoomFocus, - ZoomRegion, -} from "../types"; +import TimelineWrapper from "./TimelineWrapper"; +import Row from "./Row"; import Item from "./Item"; import KeyframeMarkers from "./KeyframeMarkers"; -import Row from "./Row"; -import TimelineWrapper from "./TimelineWrapper"; +import type { Range, Span } from "dnd-timeline"; +import type { ZoomRegion, TrimRegion, AnnotationRegion, SpeedRegion, AudioRegion, CursorTelemetryPoint, ZoomFocus } from "../types"; import { detectInteractionCandidates, normalizeCursorTelemetry } from "./zoomSuggestionUtils"; const ZOOM_ROW_ID = "row-zoom"; From 89038ae7a24fb261f68d5f45fced5a1cf7b5400b Mon Sep 17 00:00:00 2001 From: 4rjunc Date: Sun, 15 Mar 2026 14:31:44 +0530 Subject: [PATCH 05/40] feat: add safe file URL --- src/components/video-editor/timeline/TimelineEditor.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/video-editor/timeline/TimelineEditor.tsx b/src/components/video-editor/timeline/TimelineEditor.tsx index 4ecad060..4dfceaf0 100644 --- a/src/components/video-editor/timeline/TimelineEditor.tsx +++ b/src/components/video-editor/timeline/TimelineEditor.tsx @@ -23,6 +23,7 @@ import Item from "./Item"; import KeyframeMarkers from "./KeyframeMarkers"; import type { Range, Span } from "dnd-timeline"; import type { ZoomRegion, TrimRegion, AnnotationRegion, SpeedRegion, AudioRegion, CursorTelemetryPoint, ZoomFocus } from "../types"; +import { toFileUrl } from "../projectPersistence"; import { detectInteractionCandidates, normalizeCursorTelemetry } from "./zoomSuggestionUtils"; const ZOOM_ROW_ID = "row-zoom"; @@ -1068,7 +1069,7 @@ export default function TimelineEditor({ // Load the audio file to get its full duration const audioDurationMs = await new Promise((resolve) => { - const audio = new Audio(`file://${result.path}`); + const audio = new Audio(toFileUrl(result.path)); audio.addEventListener('loadedmetadata', () => { resolve(Math.round(audio.duration * 1000)); }); From 98ff361fa16ea0da42901347ae51d9306d5b6a9e Mon Sep 17 00:00:00 2001 From: 4rjunc Date: Sun, 15 Mar 2026 14:32:48 +0530 Subject: [PATCH 06/40] feat: add audio volume --- src/components/video-editor/VideoEditor.tsx | 2 +- src/components/video-editor/projectPersistence.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index f4a1b325..b7b87649 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -1304,7 +1304,7 @@ export default function VideoEditor() { if (audio.src !== expectedSrc) { audio.src = expectedSrc; } - audio.volume = region.volume; + audio.volume = Math.max(0, Math.min(1, region.volume)); } return () => { diff --git a/src/components/video-editor/projectPersistence.ts b/src/components/video-editor/projectPersistence.ts index e7f13bc7..0985fc72 100644 --- a/src/components/video-editor/projectPersistence.ts +++ b/src/components/video-editor/projectPersistence.ts @@ -305,7 +305,7 @@ export function normalizeProjectEditor(editor: Partial): Pro startMs, endMs, audioPath: typeof region.audioPath === "string" ? region.audioPath : "", - volume: isFiniteNumber(region.volume) ? clamp(region.volume, 0, 2) : 1, + volume: isFiniteNumber(region.volume) ? clamp(region.volume, 0, 1) : 1, }; }) : []; From f0fbfef23faa34cce3c88064287f3c14820f2616 Mon Sep 17 00:00:00 2001 From: 4rjunc Date: Sun, 15 Mar 2026 14:47:20 +0530 Subject: [PATCH 07/40] test: focused tests for audio path --- src/components/video-editor/audio.test.ts | 208 ++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 src/components/video-editor/audio.test.ts diff --git a/src/components/video-editor/audio.test.ts b/src/components/video-editor/audio.test.ts new file mode 100644 index 00000000..c4578df8 --- /dev/null +++ b/src/components/video-editor/audio.test.ts @@ -0,0 +1,208 @@ +import { describe, it, expect } from "vitest"; +import * as fc from "fast-check"; +import { toFileUrl, fromFileUrl, normalizeProjectEditor } from "./projectPersistence"; + +describe("Audio path handling", () => { + describe("toFileUrl produces valid file:// URLs for audio paths", () => { + it("should handle Unix absolute paths", () => { + expect(toFileUrl("/Users/music/song.mp3")).toBe("file:///Users/music/song.mp3"); + }); + + it("should handle Windows drive paths", () => { + expect(toFileUrl("C:/Users/music/song.mp3")).toBe("file:///C:/Users/music/song.mp3"); + }); + + it("should handle backslash Windows paths", () => { + const result = toFileUrl("C:\\Users\\music\\song.mp3"); + expect(result).toMatch(/^file:\/\//); + expect(result).toContain("C:"); + expect(result).toContain("song.mp3"); + }); + + it("should encode spaces in path segments", () => { + const result = toFileUrl("/Users/my music/my song.mp3"); + expect(result).toContain("my%20music"); + expect(result).toContain("my%20song.mp3"); + }); + + it("should encode special characters like spaces", () => { + const result = toFileUrl("/Users/music/song file.mp3"); + expect(result).toContain("song%20file.mp3"); + // Result should be a valid file:// URL + expect(result).toMatch(/^file:\/\//); + }); + + it("should roundtrip through fromFileUrl for simple paths", () => { + const paths = [ + "/Users/music/song.mp3", + "/tmp/audio.wav", + "/home/user/my-file.aac", + "/data/recordings/track_01.flac", + ]; + for (const originalPath of paths) { + const fileUrl = toFileUrl(originalPath); + const recovered = fromFileUrl(fileUrl); + expect(recovered).toBe(originalPath); + } + }); + + it("should roundtrip paths with spaces through fromFileUrl", () => { + const originalPath = "/Users/my user/my music/song file.mp3"; + const fileUrl = toFileUrl(originalPath); + const recovered = fromFileUrl(fileUrl); + expect(recovered).toBe(originalPath); + }); + }); +}); + +describe("Audio region normalization", () => { + describe("volume is clamped to [0, 1]", () => { + it("should clamp volume > 1 down to 1", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: 0, endMs: 1000, audioPath: "/test.mp3", volume: 5 }, + ], + } as any); + expect(result.audioRegions[0].volume).toBe(1); + }); + + it("should clamp negative volume to 0", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: 0, endMs: 1000, audioPath: "/test.mp3", volume: -0.5 }, + ], + } as any); + expect(result.audioRegions[0].volume).toBe(0); + }); + + it("should preserve valid volume values in [0, 1]", () => { + fc.assert( + fc.property( + fc.double({ min: 0, max: 1, noNaN: true }), + (volume) => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: 0, endMs: 1000, audioPath: "/test.mp3", volume }, + ], + } as any); + expect(result.audioRegions[0].volume).toBeCloseTo(volume, 10); + }, + ), + ); + }); + + it("should default to 1 when volume is NaN", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: 0, endMs: 1000, audioPath: "/test.mp3", volume: NaN }, + ], + } as any); + expect(result.audioRegions[0].volume).toBe(1); + }); + + it("should default to 1 when volume is undefined", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: 0, endMs: 1000, audioPath: "/test.mp3" }, + ], + } as any); + expect(result.audioRegions[0].volume).toBe(1); + }); + }); + + describe("startMs and endMs boundaries", () => { + it("should clamp negative startMs to 0", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: -500, endMs: 1000, audioPath: "/test.mp3", volume: 1 }, + ], + } as any); + expect(result.audioRegions[0].startMs).toBe(0); + }); + + it("should ensure endMs > startMs when endMs < startMs", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: 1000, endMs: 500, audioPath: "/test.mp3", volume: 1 }, + ], + } as any); + expect(result.audioRegions[0].endMs).toBeGreaterThan(result.audioRegions[0].startMs); + }); + + it("should handle equal startMs and endMs by ensuring minimum gap", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: 1000, endMs: 1000, audioPath: "/test.mp3", volume: 1 }, + ], + } as any); + expect(result.audioRegions[0].endMs).toBeGreaterThan(result.audioRegions[0].startMs); + }); + + it("should preserve valid startMs/endMs for arbitrary non-negative values", () => { + fc.assert( + fc.property( + fc.nat({ max: 100000 }), + fc.integer({ min: 1, max: 100000 }), + (startMs, duration) => { + const endMs = startMs + duration; + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs, endMs, audioPath: "/test.mp3", volume: 0.5 }, + ], + } as any); + expect(result.audioRegions[0].startMs).toBe(startMs); + expect(result.audioRegions[0].endMs).toBe(endMs); + }, + ), + ); + }); + }); + + describe("audioPath normalization", () => { + it("should preserve a valid string path", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: 0, endMs: 1000, audioPath: "/Users/music/song.mp3", volume: 1 }, + ], + } as any); + expect(result.audioRegions[0].audioPath).toBe("/Users/music/song.mp3"); + }); + + it("should default to empty string for missing audioPath", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { id: "audio-1", startMs: 0, endMs: 1000, volume: 1 }, + ], + } as any); + expect(result.audioRegions[0].audioPath).toBe(""); + }); + + it("should filter out regions without a valid id", () => { + const result = normalizeProjectEditor({ + audioRegions: [ + { startMs: 0, endMs: 1000, audioPath: "/test.mp3", volume: 1 }, + { id: "audio-1", startMs: 0, endMs: 1000, audioPath: "/test.mp3", volume: 1 }, + ], + } as any); + expect(result.audioRegions).toHaveLength(1); + expect(result.audioRegions[0].id).toBe("audio-1"); + }); + }); + + describe("empty or missing audioRegions", () => { + it("should return empty array when audioRegions is undefined", () => { + const result = normalizeProjectEditor({} as any); + expect(result.audioRegions).toEqual([]); + }); + + it("should return empty array when audioRegions is not an array", () => { + const result = normalizeProjectEditor({ audioRegions: "invalid" } as any); + expect(result.audioRegions).toEqual([]); + }); + + it("should return empty array when audioRegions is null", () => { + const result = normalizeProjectEditor({ audioRegions: null } as any); + expect(result.audioRegions).toEqual([]); + }); + }); +}); From 97104a3f1b50c65a14efdfbfd3c199c1cc239d76 Mon Sep 17 00:00:00 2001 From: 4rjunc Date: Sun, 15 Mar 2026 14:47:30 +0530 Subject: [PATCH 08/40] fix: add name display for audio files --- src/components/video-editor/timeline/Item.tsx | 2 +- .../video-editor/timeline/TimelineEditor.tsx | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/components/video-editor/timeline/Item.tsx b/src/components/video-editor/timeline/Item.tsx index 1f9d3eb8..b68f2127 100644 --- a/src/components/video-editor/timeline/Item.tsx +++ b/src/components/video-editor/timeline/Item.tsx @@ -148,7 +148,7 @@ export default function Item({ ) : isAudio ? ( <> - + {children} diff --git a/src/components/video-editor/timeline/TimelineEditor.tsx b/src/components/video-editor/timeline/TimelineEditor.tsx index 4dfceaf0..66a397e6 100644 --- a/src/components/video-editor/timeline/TimelineEditor.tsx +++ b/src/components/video-editor/timeline/TimelineEditor.tsx @@ -1245,13 +1245,16 @@ export default function TimelineEditor({ variant: 'speed', })); - const audios: TimelineRenderItem[] = audioRegions.map((region, index) => ({ - id: region.id, - rowId: AUDIO_ROW_ID, - span: { start: region.startMs, end: region.endMs }, - label: `Audio ${index + 1}`, - variant: 'audio', - })); + const audios: TimelineRenderItem[] = audioRegions.map((region) => { + const fileName = region.audioPath.split(/[\\/]/).pop()?.replace(/\.[^.]+$/, '') || 'Audio'; + return { + id: region.id, + rowId: AUDIO_ROW_ID, + span: { start: region.startMs, end: region.endMs }, + label: fileName, + variant: 'audio', + }; + }); return [...zooms, ...trims, ...annotations, ...speeds, ...audios]; }, [zoomRegions, trimRegions, annotationRegions, speedRegions, audioRegions]); From ff8d75b07416864b98563fbd7af2662772c8694e Mon Sep 17 00:00:00 2001 From: 4rjunc Date: Sun, 15 Mar 2026 18:55:26 +0530 Subject: [PATCH 09/40] fix: audio in export, add audioRegion --- src/components/video-editor/VideoEditor.tsx | 1 + src/lib/exporter/audioEncoder.ts | 85 ++++++++++++++++++--- src/lib/exporter/videoExporter.ts | 12 ++- 3 files changed, 84 insertions(+), 14 deletions(-) diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index b7b87649..97c3a3bf 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -1569,6 +1569,7 @@ export default function VideoEditor() { cursorSmoothing, cursorMotionBlur, cursorClickBounce, + audioRegions, previewWidth, previewHeight, onProgress: (progress: ExportProgress) => { diff --git a/src/lib/exporter/audioEncoder.ts b/src/lib/exporter/audioEncoder.ts index 09407801..bd1c20cd 100644 --- a/src/lib/exporter/audioEncoder.ts +++ b/src/lib/exporter/audioEncoder.ts @@ -1,5 +1,6 @@ import { WebDemuxer } from 'web-demuxer' -import type { SpeedRegion, TrimRegion } from '@/components/video-editor/types' +import type { SpeedRegion, TrimRegion, AudioRegion } from '@/components/video-editor/types' +import { toFileUrl } from '@/components/video-editor/projectPersistence' import type { VideoMuxer } from './muxer' const AUDIO_BITRATE = 128_000 @@ -21,6 +22,7 @@ export class AudioProcessor { trimRegions?: TrimRegion[], speedRegions?: SpeedRegion[], readEndSec?: number, + audioRegions?: AudioRegion[], ): Promise { const sortedTrims = trimRegions ? [...trimRegions].sort((a, b) => a.startMs - b.startMs) : [] const sortedSpeedRegions = speedRegions @@ -28,13 +30,17 @@ export class AudioProcessor { .filter((region) => region.endMs - region.startMs > MIN_SPEED_REGION_DELTA_MS) .sort((a, b) => a.startMs - b.startMs) : [] + const sortedAudioRegions = audioRegions + ? [...audioRegions].sort((a, b) => a.startMs - b.startMs) + : [] - // Speed edits must use timeline playback to preserve pitch. - if (sortedSpeedRegions.length > 0) { - const renderedAudioBlob = await this.renderPitchPreservedTimelineAudio( + // When audio regions or speed edits are present, use AudioContext mixing path. + if (sortedSpeedRegions.length > 0 || sortedAudioRegions.length > 0) { + const renderedAudioBlob = await this.renderMixedTimelineAudio( videoUrl, sortedTrims, sortedSpeedRegions, + sortedAudioRegions, ) if (!this.cancelled) { await this.muxRenderedAudioBlob(renderedAudioBlob, muxer) @@ -42,7 +48,7 @@ export class AudioProcessor { } } - // No speed edits: keep the original demux/decode/encode path with trim timestamp remap. + // No speed edits or audio regions: keep the original demux/decode/encode path with trim timestamp remap. await this.processTrimOnlyAudio(demuxer, muxer, sortedTrims, readEndSec) } @@ -158,12 +164,13 @@ export class AudioProcessor { } } - // Speed-aware path that mirrors preview semantics (trim skipping + playbackRate regions) - // and preserves pitch through browser media playback behavior. - private async renderPitchPreservedTimelineAudio( + // Renders mixed audio: original video audio (with speed/trim) + external audio regions. + // Uses AudioContext to mix all sources into a single recorded stream. + private async renderMixedTimelineAudio( videoUrl: string, trimRegions: TrimRegion[], speedRegions: SpeedRegion[], + audioRegions: AudioRegion[], ): Promise { const media = document.createElement('audio') media.src = videoUrl @@ -184,10 +191,41 @@ export class AudioProcessor { } const audioContext = new AudioContext() - const sourceNode = audioContext.createMediaElementSource(media) const destinationNode = audioContext.createMediaStreamDestination() + + // Connect original video audio + const sourceNode = audioContext.createMediaElementSource(media) sourceNode.connect(destinationNode) + // Prepare external audio region elements + const audioRegionElements: { + media: HTMLAudioElement + sourceNode: MediaElementAudioSourceNode + gainNode: GainNode + region: AudioRegion + }[] = [] + + for (const region of audioRegions) { + const audioEl = document.createElement('audio') + audioEl.src = toFileUrl(region.audioPath) + audioEl.preload = 'auto' + try { + await this.waitForLoadedMetadata(audioEl) + } catch { + console.warn('[AudioProcessor] Failed to load audio region:', region.audioPath) + continue + } + if (this.cancelled) throw new Error('Export cancelled') + + const regionSource = audioContext.createMediaElementSource(audioEl) + const gainNode = audioContext.createGain() + gainNode.gain.value = Math.max(0, Math.min(1, region.volume)) + regionSource.connect(gainNode) + gainNode.connect(destinationNode) + + audioRegionElements.push({ media: audioEl, sourceNode: regionSource, gainNode, region }) + } + const { recorder, recordedBlobPromise } = this.startAudioRecording(destinationNode.stream) let rafId: number | null = null @@ -211,7 +249,7 @@ export class AudioProcessor { const onError = () => { cleanup() - reject(new Error('Failed while rendering speed-adjusted audio timeline')) + reject(new Error('Failed while rendering mixed audio timeline')) } const onEnded = () => { @@ -246,6 +284,26 @@ export class AudioProcessor { } } + // Sync external audio regions with the video timeline position + for (const entry of audioRegionElements) { + const { media: audioEl, region } = entry + const isInRegion = currentTimeMs >= region.startMs && currentTimeMs < region.endMs + + if (isInRegion) { + const audioOffset = (currentTimeMs - region.startMs) / 1000 + if (audioEl.paused) { + audioEl.currentTime = audioOffset + audioEl.play().catch(() => {}) + } else if (Math.abs(audioEl.currentTime - audioOffset) > 0.3) { + audioEl.currentTime = audioOffset + } + } else { + if (!audioEl.paused) { + audioEl.pause() + } + } + } + if (!media.paused && !media.ended) { rafId = requestAnimationFrame(tick) } else { @@ -263,6 +321,13 @@ export class AudioProcessor { cancelAnimationFrame(rafId) } media.pause() + for (const entry of audioRegionElements) { + entry.media.pause() + entry.sourceNode.disconnect() + entry.gainNode.disconnect() + entry.media.src = '' + entry.media.load() + } if (recorder.state !== 'inactive') { recorder.stop() } diff --git a/src/lib/exporter/videoExporter.ts b/src/lib/exporter/videoExporter.ts index 9eee91ea..cc266e62 100644 --- a/src/lib/exporter/videoExporter.ts +++ b/src/lib/exporter/videoExporter.ts @@ -3,7 +3,7 @@ import { AudioProcessor } from './audioEncoder'; import { StreamingVideoDecoder } from './streamingDecoder'; import { FrameRenderer } from './frameRenderer'; import { VideoMuxer } from './muxer'; -import type { ZoomRegion, CropRegion, TrimRegion, AnnotationRegion, SpeedRegion, CursorTelemetryPoint } from '@/components/video-editor/types'; +import type { ZoomRegion, CropRegion, TrimRegion, AnnotationRegion, SpeedRegion, AudioRegion, CursorTelemetryPoint } from '@/components/video-editor/types'; interface VideoExporterConfig extends ExportConfig { videoUrl: string; @@ -27,6 +27,7 @@ interface VideoExporterConfig extends ExportConfig { cursorSmoothing?: number; cursorMotionBlur?: number; cursorClickBounce?: number; + audioRegions?: AudioRegion[]; previewWidth?: number; previewHeight?: number; onProgress?: (progress: ExportProgress) => void; @@ -94,7 +95,8 @@ export class VideoExporter { // Initialize video encoder await this.initializeEncoder(); - const hasAudio = videoInfo.hasAudio; + const hasAudioRegions = (this.config.audioRegions ?? []).length > 0; + const hasAudio = videoInfo.hasAudio || hasAudioRegions; // Initialize muxer this.muxer = new VideoMuxer(this.config, hasAudio); @@ -148,15 +150,17 @@ export class VideoExporter { if (hasAudio && !this.cancelled) { const demuxer = this.streamingDecoder.getDemuxer(); - if (demuxer) { + if (demuxer || hasAudioRegions) { this.audioProcessor = new AudioProcessor(); await this.awaitWithWindowsTimeout( this.audioProcessor.process( - demuxer, + demuxer!, this.muxer!, this.config.videoUrl, this.config.trimRegions, this.config.speedRegions, + undefined, + this.config.audioRegions, ), 'audio processing', ); From b3423c39dd0a575f58b5642e7591563fe8b8cca6 Mon Sep 17 00:00:00 2001 From: aras Date: Sun, 15 Mar 2026 18:01:14 +0300 Subject: [PATCH 10/40] fix(macos): add explicit target architecture to Swift helper builds Added `-target` flag to swiftc compilation to explicitly specify arm64-apple-macos14.0 or x86_64-apple-macos14.0 based on process architecture, ensuring proper binary compilation for darwin-arm64 native helpers. --- .../openscreen-native-cursor-monitor | Bin 95824 -> 96896 bytes .../openscreen-screencapturekit-helper | Bin 186176 -> 187488 bytes .../darwin-arm64/openscreen-system-cursors | Bin 99768 -> 101144 bytes .../bin/darwin-arm64/openscreen-window-list | Bin 95880 -> 96808 bytes package-lock.json | 6 +++--- scripts/build-native-helpers.mjs | 7 ++++++- 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/electron/native/bin/darwin-arm64/openscreen-native-cursor-monitor b/electron/native/bin/darwin-arm64/openscreen-native-cursor-monitor index 9b3e16e14fd37a5060cc59e07b7bbbd31ffa3ed2..77d85ce87013dc7463171f918454c13df3082e98 100755 GIT binary patch literal 96896 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 M4F2RhUU*6V57O<(ZU6uP literal 95824 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 Q&70Fad$-Kp=LHkxKMDvc(f|Me diff --git a/electron/native/bin/darwin-arm64/openscreen-screencapturekit-helper b/electron/native/bin/darwin-arm64/openscreen-screencapturekit-helper index 2f5bda23bcc7e91f2d0673d064ca4b8ae1772cf6..447588fd587fa8a36800bc1c8f398e20fcd4121b 100755 GIT binary patch literal 187488 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%0ATSwpHS8*w!%a7Tdbif;VmJA0*z~$JMg#f~;9> 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 literal 186176 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�AZLM`1#%Y1 zSs-VDoCR_g$XOs~ft&?$7RXs3XMvmrau�AZLM`1#%Y1Ss-VDoCR_g$XOs~ft&?$ z7RXs3XMvmrau�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 literal 95880 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 Leu7YUbh>{5m17X) diff --git a/package-lock.json b/package-lock.json index 09d8925f..74cf3d25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,13 @@ { "name": "recordly", - "version": "1.1.3", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "recordly", - "version": "1.1.3", + "version": "1.0.0", + "hasInstallScript": true, "dependencies": { "@fix-webm-duration/fix": "^1.0.1", "@pixi/filter-drop-shadow": "^5.2.0", @@ -14118,4 +14119,3 @@ } } } - diff --git a/scripts/build-native-helpers.mjs b/scripts/build-native-helpers.mjs index fc703007..032ae2f3 100644 --- a/scripts/build-native-helpers.mjs +++ b/scripts/build-native-helpers.mjs @@ -44,7 +44,12 @@ for (const helper of helpers) { const sourcePath = path.join(nativeRoot, helper.source); const outputPath = path.join(outputDir, helper.output); - const result = spawnSync('swiftc', ['-O', sourcePath, '-o', outputPath], { + const result = spawnSync('swiftc', [ + '-O', + '-target', process.arch === 'arm64' ? 'arm64-apple-macos14.0' : 'x86_64-apple-macos14.0', + sourcePath, + '-o', outputPath + ], { encoding: 'utf8', timeout: 120000, }); From 7d03040642e104afaeed9adae0208d90795c0c51 Mon Sep 17 00:00:00 2001 From: aras Date: Sun, 15 Mar 2026 18:06:10 +0300 Subject: [PATCH 11/40] fix(windows): prevent window flash on startup by deferring show until ready --- electron/windows.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/electron/windows.ts b/electron/windows.ts index d2f7466d..232571d0 100644 --- a/electron/windows.ts +++ b/electron/windows.ts @@ -49,6 +49,7 @@ export function createHudOverlayWindow(): BrowserWindow { alwaysOnTop: true, skipTaskbar: true, hasShadow: false, + show: false, webPreferences: { preload: path.join(__dirname, 'preload.mjs'), nodeIntegration: false, @@ -60,6 +61,11 @@ export function createHudOverlayWindow(): BrowserWindow { win.webContents.on('did-finish-load', () => { win?.webContents.send('main-process-message', (new Date).toLocaleString()) + setTimeout(() => { + if (!win.isDestroyed()) { + win.show() + } + }, 100) }) hudOverlayWindow = win; @@ -102,6 +108,7 @@ export function createEditorWindow(): BrowserWindow { alwaysOnTop: false, skipTaskbar: false, title: 'Recordly', + show: false, backgroundColor: '#000000', webPreferences: { preload: path.join(__dirname, 'preload.mjs'), @@ -112,8 +119,10 @@ export function createEditorWindow(): BrowserWindow { }, }) - // Maximize the window by default - win.maximize(); + win.once('ready-to-show', () => { + win.show() + win.maximize() + }) win.webContents.on('did-finish-load', () => { win?.webContents.send('main-process-message', (new Date).toLocaleString()) @@ -144,6 +153,7 @@ export function createSourceSelectorWindow(): BrowserWindow { resizable: false, alwaysOnTop: true, transparent: true, + show: false, ...(process.platform !== 'darwin' && { icon: WINDOW_ICON_PATH, }), @@ -155,6 +165,14 @@ export function createSourceSelectorWindow(): BrowserWindow { }, }) + win.webContents.on('did-finish-load', () => { + setTimeout(() => { + if (!win.isDestroyed()) { + win.show() + } + }, 100) + }) + if (VITE_DEV_SERVER_URL) { win.loadURL(VITE_DEV_SERVER_URL + '?windowType=source-selector') } else { From 04dcbc32b82d9059887c798635d8edfc01a16a61 Mon Sep 17 00:00:00 2001 From: Varun Kumar Date: Mon, 16 Mar 2026 00:11:48 +0530 Subject: [PATCH 12/40] feat(recording): add configurable countdown timer before recording starts - Add countdown delay setting (None, 3s, 5s, 10s) in HUD bar - Show centered 200x200 countdown overlay visible on all workspaces - Persist countdown delay preference across sessions - Add i18n translations for countdown feature (en, es, zh-CN) - Click or press ESC to cancel countdown --- electron/electron-env.d.ts | 6 ++ electron/ipc/handlers.ts | 83 +++++++++++++++++++ electron/preload.ts | 10 +++ electron/windows.ts | 77 +++++++++++++++-- src/App.tsx | 5 +- src/components/countdown/CountdownOverlay.tsx | 64 ++++++++++++++ src/components/launch/LaunchWindow.tsx | 36 +++++++- src/hooks/useScreenRecorder.ts | 40 ++++++++- src/i18n/locales/en/launch.json | 2 + src/i18n/locales/es/launch.json | 2 + src/i18n/locales/zh-CN/launch.json | 2 + 11 files changed, 315 insertions(+), 12 deletions(-) create mode 100644 src/components/countdown/CountdownOverlay.tsx diff --git a/electron/electron-env.d.ts b/electron/electron-env.d.ts index f859957d..371ea789 100644 --- a/electron/electron-env.d.ts +++ b/electron/electron-env.d.ts @@ -83,6 +83,12 @@ interface Window { muxWgcRecording: () => Promise<{ success: boolean; path?: string; message?: string; error?: string }> /** Hide the OS cursor before browser capture starts. */ hideOsCursor: () => Promise<{ success: boolean }> + /** Countdown timer before recording */ + getCountdownDelay: () => Promise<{ success: boolean; delay: number }> + setCountdownDelay: (delay: number) => Promise<{ success: boolean; error?: string }> + startCountdown: (seconds: number) => Promise<{ success: boolean; cancelled?: boolean }> + cancelCountdown: () => Promise<{ success: boolean }> + onCountdownTick: (callback: (seconds: number) => void) => () => void } } diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index 3c3430dc..0942dc1f 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -9,6 +9,7 @@ import path from 'node:path' import { fileURLToPath, pathToFileURL } from 'node:url' import { promisify } from 'node:util' import { RECORDINGS_DIR } from '../main' +import { createCountdownWindow, getCountdownWindow, closeCountdownWindow } from '../windows' const execFileAsync = promisify(execFile) const nodeRequire = createRequire(import.meta.url) @@ -17,6 +18,7 @@ const PROJECT_FILE_EXTENSION = 'recordly' const LEGACY_PROJECT_FILE_EXTENSIONS = ['openscreen'] const SHORTCUTS_FILE = path.join(app.getPath('userData'), 'shortcuts.json') const RECORDINGS_SETTINGS_FILE = path.join(app.getPath('userData'), 'recordings-settings.json') +const COUNTDOWN_SETTINGS_FILE = path.join(app.getPath('userData'), 'countdown-settings.json') const AUTO_RECORDING_PREFIX = 'recording-' const AUTO_RECORDING_RETENTION_COUNT = 20 const AUTO_RECORDING_MAX_AGE_MS = 14 * 24 * 60 * 60 * 1000 @@ -77,6 +79,8 @@ let customRecordingsDir: string | null = null let recordingsDirLoaded = false let cachedSystemCursorAssets: Record | null = null let cachedSystemCursorAssetsSourceMtimeMs: number | null = null +let countdownTimer: ReturnType | null = null +let countdownCancelled = false type SystemCursorAsset = { dataUrl: string @@ -2738,5 +2742,84 @@ export function registerIpcHandlers( return { success: false, error: String(error) }; } }); + + // --------------------------------------------------------------------------- + // Countdown timer before recording + // --------------------------------------------------------------------------- + ipcMain.handle('get-countdown-delay', async () => { + try { + const content = await fs.readFile(COUNTDOWN_SETTINGS_FILE, 'utf-8') + const parsed = JSON.parse(content) as { delay?: number } + return { success: true, delay: parsed.delay ?? 3 } + } catch { + return { success: true, delay: 3 } + } + }) + + ipcMain.handle('set-countdown-delay', async (_, delay: number) => { + try { + await fs.writeFile(COUNTDOWN_SETTINGS_FILE, JSON.stringify({ delay }, null, 2), 'utf-8') + return { success: true } + } catch (error) { + console.error('Failed to save countdown delay:', error) + return { success: false, error: String(error) } + } + }) + + ipcMain.handle('start-countdown', async (_, seconds: number) => { + countdownCancelled = false + + const countdownWin = createCountdownWindow() + + await new Promise((resolve) => { + countdownWin.webContents.once('did-finish-load', () => { + resolve() + }) + }) + + return new Promise<{ success: boolean; cancelled?: boolean }>((resolve) => { + let remaining = seconds + + countdownWin.webContents.send('countdown-tick', remaining) + + countdownTimer = setInterval(() => { + if (countdownCancelled) { + if (countdownTimer) { + clearInterval(countdownTimer) + countdownTimer = null + } + closeCountdownWindow() + resolve({ success: false, cancelled: true }) + return + } + + remaining-- + + if (remaining <= 0) { + if (countdownTimer) { + clearInterval(countdownTimer) + countdownTimer = null + } + closeCountdownWindow() + resolve({ success: true }) + } else { + const win = getCountdownWindow() + if (win && !win.isDestroyed()) { + win.webContents.send('countdown-tick', remaining) + } + } + }, 1000) + }) + }) + + ipcMain.handle('cancel-countdown', () => { + countdownCancelled = true + if (countdownTimer) { + clearInterval(countdownTimer) + countdownTimer = null + } + closeCountdownWindow() + return { success: true } + }) } diff --git a/electron/preload.ts b/electron/preload.ts index ebc4fed1..dab2abd0 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -182,5 +182,15 @@ contextBridge.exposeInMainWorld('electronAPI', { muxWgcRecording: () => ipcRenderer.invoke('mux-wgc-recording'), // Cursor visibility control for cursor-free browser capture fallback hideOsCursor: () => ipcRenderer.invoke('hide-cursor'), + // Countdown timer before recording + getCountdownDelay: () => ipcRenderer.invoke('get-countdown-delay'), + setCountdownDelay: (delay: number) => ipcRenderer.invoke('set-countdown-delay', delay), + startCountdown: (seconds: number) => ipcRenderer.invoke('start-countdown', seconds), + cancelCountdown: () => ipcRenderer.invoke('cancel-countdown'), + onCountdownTick: (callback: (seconds: number) => void) => { + const listener = (_event: Electron.IpcRendererEvent, seconds: number) => callback(seconds) + ipcRenderer.on('countdown-tick', listener) + return () => ipcRenderer.removeListener('countdown-tick', listener) + }, }) diff --git a/electron/windows.ts b/electron/windows.ts index d2f7466d..fe3c2040 100644 --- a/electron/windows.ts +++ b/electron/windows.ts @@ -12,6 +12,7 @@ const RENDERER_DIST = path.join(APP_ROOT, 'dist') const WINDOW_ICON_PATH = path.join(process.env.VITE_PUBLIC || RENDERER_DIST, 'app-icons', 'recordly-512.png') let hudOverlayWindow: BrowserWindow | null = null; +let countdownWindow: BrowserWindow | null = null; function getScreen() { return nodeRequire('electron').screen as typeof import('electron').screen @@ -28,8 +29,8 @@ export function createHudOverlayWindow(): BrowserWindow { const { workArea } = primaryDisplay; - const windowWidth = 600; - const windowHeight = 155; + const windowWidth = 660; + const windowHeight = 170; const x = Math.floor(workArea.x + (workArea.width - windowWidth) / 2); const y = Math.floor(workArea.y + workArea.height - windowHeight - 5); @@ -37,10 +38,10 @@ export function createHudOverlayWindow(): BrowserWindow { const win = new BrowserWindow({ width: windowWidth, height: windowHeight, - minWidth: 600, - maxWidth: 600, - minHeight: 155, - maxHeight: 155, + minWidth: 660, + maxWidth: 660, + minHeight: 170, + maxHeight: 170, x: x, y: y, frame: false, @@ -158,11 +159,71 @@ export function createSourceSelectorWindow(): BrowserWindow { if (VITE_DEV_SERVER_URL) { win.loadURL(VITE_DEV_SERVER_URL + '?windowType=source-selector') } else { - win.loadFile(path.join(RENDERER_DIST, 'index.html'), { - query: { windowType: 'source-selector' } + win.loadFile(path.join(RENDERER_DIST, 'index.html'), { + query: { windowType: 'source-selector' } }) } return win } +export function createCountdownWindow(): BrowserWindow { + const primaryDisplay = getScreen().getPrimaryDisplay(); + const { width, height } = primaryDisplay.workAreaSize; + + const windowSize = 200; + const x = Math.floor((width - windowSize) / 2); + const y = Math.floor((height - windowSize) / 2); + + const win = new BrowserWindow({ + width: windowSize, + height: windowSize, + x: x, + y: y, + frame: false, + transparent: true, + resizable: false, + alwaysOnTop: true, + skipTaskbar: true, + hasShadow: false, + focusable: true, + webPreferences: { + preload: path.join(__dirname, 'preload.mjs'), + nodeIntegration: false, + contextIsolation: true, + }, + }) + + countdownWindow = win; + + // Show on all workspaces/spaces so it follows the user + win.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true }); + + win.on('closed', () => { + if (countdownWindow === win) { + countdownWindow = null; + } + }); + + if (VITE_DEV_SERVER_URL) { + win.loadURL(VITE_DEV_SERVER_URL + '?windowType=countdown') + } else { + win.loadFile(path.join(RENDERER_DIST, 'index.html'), { + query: { windowType: 'countdown' } + }) + } + + return win +} + +export function getCountdownWindow(): BrowserWindow | null { + return countdownWindow; +} + +export function closeCountdownWindow(): void { + if (countdownWindow && !countdownWindow.isDestroyed()) { + countdownWindow.close(); + countdownWindow = null; + } +} + diff --git a/src/App.tsx b/src/App.tsx index 2a471f1f..2418ce53 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from "react"; +import { CountdownOverlay } from "./components/countdown/CountdownOverlay"; import { LaunchWindow } from "./components/launch/LaunchWindow"; import { SourceSelector } from "./components/launch/SourceSelector"; import VideoEditor from "./components/video-editor/VideoEditor"; @@ -16,7 +17,7 @@ export default function App() { const type = params.get('windowType') || ''; setWindowType(type); - if (type === 'hud-overlay' || type === 'source-selector') { + if (type === 'hud-overlay' || type === 'source-selector' || type === 'countdown') { document.body.style.background = 'transparent'; document.documentElement.style.background = 'transparent'; document.getElementById('root')?.style.setProperty('background', 'transparent'); @@ -39,6 +40,8 @@ export default function App() { return ; case 'source-selector': return ; + case 'countdown': + return ; case 'editor': return ( diff --git a/src/components/countdown/CountdownOverlay.tsx b/src/components/countdown/CountdownOverlay.tsx new file mode 100644 index 00000000..50c68e29 --- /dev/null +++ b/src/components/countdown/CountdownOverlay.tsx @@ -0,0 +1,64 @@ +import { useCallback, useEffect, useState } from "react"; + +export function CountdownOverlay() { + const [countdown, setCountdown] = useState(null); + + useEffect(() => { + const cleanup = window.electronAPI.onCountdownTick((seconds: number) => { + setCountdown(seconds); + }); + + return cleanup; + }, []); + + const handleCancel = useCallback(() => { + window.electronAPI.cancelCountdown(); + }, []); + + const handleKeyDown = useCallback( + (event: KeyboardEvent) => { + if (event.key === "Escape") { + handleCancel(); + } + }, + [handleCancel], + ); + + useEffect(() => { + window.addEventListener("keydown", handleKeyDown); + return () => window.removeEventListener("keydown", handleKeyDown); + }, [handleKeyDown]); + + if (countdown === null) { + return null; + } + + return ( +
e.key === "Escape" && handleCancel()} + > +
+ + {countdown} + +
+
+ ); +} diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx index 20d121b0..f0489abc 100644 --- a/src/components/launch/LaunchWindow.tsx +++ b/src/components/launch/LaunchWindow.tsx @@ -4,7 +4,7 @@ import { FaRegStopCircle } from "react-icons/fa"; import { FaFolderOpen } from "react-icons/fa6"; import { FiMinus, FiX } from "react-icons/fi"; import { MdMic, MdMicOff, MdMonitor, MdVideoFile, MdVolumeOff, MdVolumeUp } from "react-icons/md"; -import { Languages } from "lucide-react"; +import { Languages, Timer } from "lucide-react"; import { RxDragHandleDots2 } from "react-icons/rx"; import { useAudioLevelMeter } from "../../hooks/useAudioLevelMeter"; import { useMicrophoneDevices } from "../../hooks/useMicrophoneDevices"; @@ -38,6 +38,8 @@ export function LaunchWindow() { setMicrophoneDeviceId, systemAudioEnabled, setSystemAudioEnabled, + countdownDelay, + setCountdownDelay, } = useScreenRecorder(); const [recordingStart, setRecordingStart] = useState(null); const [elapsed, setElapsed] = useState(0); @@ -245,6 +247,38 @@ export function LaunchWindow() {
+ + + + + + {[0, 3, 5, 10].map((delay) => ( + setCountdownDelay(delay)} + className={`text-xs cursor-pointer ${ + countdownDelay === delay ? "text-white font-medium" : "text-white/60" + }`} + > + {delay === 0 ? t('recording.noDelay') : `${delay}s`} + + ))} + + +
{exportFormat === 'mp4' && ( -
+
+
)} diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index 97c3a3bf..e61af90d 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -1525,12 +1525,21 @@ export default function VideoEditor() { bitrate = 80_000_000; } } else { - // Use quality-based target resolution - const targetHeight = quality === 'medium' ? 720 : 1080; + // Use source-relative quality scaling. + // "source" is handled above; this branch maps the remaining tiers. + const qualityScale = + quality === 'medium' ? 0.6 : quality === 'good' ? 0.75 : 0.9; + const maxWidth = Math.max(2, Math.floor((sourceWidth * qualityScale) / 2) * 2); + const maxHeight = Math.max(2, Math.floor((sourceHeight * qualityScale) / 2) * 2); + const maxAspect = maxWidth / maxHeight; - // Calculate dimensions maintaining aspect ratio - exportHeight = Math.floor(targetHeight / 2) * 2; - exportWidth = Math.floor((exportHeight * aspectRatioValue) / 2) * 2; + if (aspectRatioValue >= maxAspect) { + exportWidth = maxWidth; + exportHeight = Math.max(2, Math.floor((exportWidth / aspectRatioValue) / 2) * 2); + } else { + exportHeight = maxHeight; + exportWidth = Math.max(2, Math.floor((exportHeight * aspectRatioValue) / 2) * 2); + } // Adjust bitrate for lower resolutions const totalPixels = exportWidth * exportHeight; diff --git a/src/components/video-editor/projectPersistence.ts b/src/components/video-editor/projectPersistence.ts index 0985fc72..af4e1aff 100644 --- a/src/components/video-editor/projectPersistence.ts +++ b/src/components/video-editor/projectPersistence.ts @@ -358,7 +358,13 @@ export function normalizeProjectEditor(editor: Partial): Pro (validAspectRatios.has(editor.aspectRatio as AspectRatio) || isCustomAspectRatio(editor.aspectRatio)) ? (editor.aspectRatio as AspectRatio) : "16:9", - exportQuality: editor.exportQuality === "medium" || editor.exportQuality === "source" ? editor.exportQuality : "good", + exportQuality: + editor.exportQuality === "medium" || + editor.exportQuality === "good" || + editor.exportQuality === "high" || + editor.exportQuality === "source" + ? editor.exportQuality + : "good", exportFormat: editor.exportFormat === "gif" ? "gif" : "mp4", gifFrameRate: editor.gifFrameRate === 15 || diff --git a/src/i18n/locales/en/settings.json b/src/i18n/locales/en/settings.json index 2405ce5f..2ffb67f0 100644 --- a/src/i18n/locales/en/settings.json +++ b/src/i18n/locales/en/settings.json @@ -47,7 +47,8 @@ "quality": { "low": "Low", "medium": "Medium", - "high": "High" + "high": "High", + "original": "Original" }, "loop": "Loop", "outputDimensions": "Output: {{dimensions}}px", diff --git a/src/i18n/locales/es/settings.json b/src/i18n/locales/es/settings.json index 7b3a1379..335bb00d 100644 --- a/src/i18n/locales/es/settings.json +++ b/src/i18n/locales/es/settings.json @@ -47,7 +47,8 @@ "quality": { "low": "Baja", "medium": "Media", - "high": "Alta" + "high": "Alta", + "original": "Original" }, "loop": "Bucle", "outputDimensions": "Salida: {{dimensions}}px", diff --git a/src/i18n/locales/zh-CN/settings.json b/src/i18n/locales/zh-CN/settings.json index 46106e60..5e2ef5bb 100644 --- a/src/i18n/locales/zh-CN/settings.json +++ b/src/i18n/locales/zh-CN/settings.json @@ -47,7 +47,8 @@ "quality": { "low": "低", "medium": "中", - "high": "高" + "high": "高", + "original": "原始" }, "loop": "循环", "outputDimensions": "输出:{{dimensions}}px", diff --git a/src/lib/exporter/types.ts b/src/lib/exporter/types.ts index fa0d4eaa..812d850d 100644 --- a/src/lib/exporter/types.ts +++ b/src/lib/exporter/types.ts @@ -27,7 +27,7 @@ export interface VideoFrameData { duration: number; // in microseconds } -export type ExportQuality = 'medium' | 'good' | 'source'; +export type ExportQuality = 'medium' | 'good' | 'high' | 'source'; // GIF Export Types export type ExportFormat = 'mp4' | 'gif'; From 75835362a3536706ea41257ccdc9af13fd4af41b Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:06:30 +1100 Subject: [PATCH 27/40] fix(ci): unblock release builds on Windows/Linux/macOS - Rename invalid .github instructions filename for Windows checkout compatibility - Remove unused i18n symbols causing TypeScript/lint build failures --- .github/instructions/general.instructions.md | 1 + src/components/video-editor/VideoEditor.tsx | 2 +- src/components/video-editor/timeline/Item.tsx | 2 -- src/components/video-editor/timeline/TimelineEditor.tsx | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) create mode 100644 .github/instructions/general.instructions.md diff --git a/.github/instructions/general.instructions.md b/.github/instructions/general.instructions.md new file mode 100644 index 00000000..79eba3df --- /dev/null +++ b/.github/instructions/general.instructions.md @@ -0,0 +1 @@ +Review this PR. Do not leave line comments. Provide exactly one summary comment including: 1. A letter grade (A-F), 2. Major shortcomings blocking merge 3. Nice-to-have shortcomings 4. Merge readiness (Yes/No). \ No newline at end of file diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index e61af90d..34bec02c 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -4,7 +4,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels"; import { toast } from "sonner"; import { Toaster } from "@/components/ui/sonner"; -import { useI18n, useScopedT } from "@/contexts/I18nContext"; +import { useI18n } from "@/contexts/I18nContext"; import { useShortcuts } from "@/contexts/ShortcutsContext"; import { SUPPORTED_LOCALES } from "@/i18n/config"; import type { AppLocale } from "@/i18n/config"; diff --git a/src/components/video-editor/timeline/Item.tsx b/src/components/video-editor/timeline/Item.tsx index b68f2127..50670f4c 100644 --- a/src/components/video-editor/timeline/Item.tsx +++ b/src/components/video-editor/timeline/Item.tsx @@ -2,7 +2,6 @@ import type { Span } from "dnd-timeline"; import { useItem } from "dnd-timeline"; import { Gauge, MessageSquare, Music, Scissors, ZoomIn } from "lucide-react"; import { useMemo } from "react"; -import { useScopedT } from "@/contexts/I18nContext"; import { cn } from "@/lib/utils"; import glassStyles from "./ItemGlass.module.css"; @@ -49,7 +48,6 @@ export default function Item({ variant = "zoom", children, }: ItemProps) { - const t = useScopedT("timeline"); const { setNodeRef, attributes, listeners, itemStyle, itemContentStyle } = useItem({ id, span, diff --git a/src/components/video-editor/timeline/TimelineEditor.tsx b/src/components/video-editor/timeline/TimelineEditor.tsx index 66a397e6..27d02dce 100644 --- a/src/components/video-editor/timeline/TimelineEditor.tsx +++ b/src/components/video-editor/timeline/TimelineEditor.tsx @@ -11,7 +11,6 @@ import { Plus, Scissors, ZoomIn, MessageSquare, ChevronDown, Check, Gauge, WandS import { toast } from "sonner"; import { cn } from "@/lib/utils"; import { v4 as uuidv4 } from 'uuid'; -import { useScopedT } from "@/contexts/I18nContext"; import { useShortcuts } from "@/contexts/ShortcutsContext"; import { matchesShortcut } from "@/lib/shortcuts"; import { ASPECT_RATIOS, type AspectRatio, getAspectRatioLabel, isCustomAspectRatio } from "@/utils/aspectRatioUtils"; From c4cb8f74ad7bd2e84aa8f14d7ffc93bf8b9a02f2 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:06:47 +1100 Subject: [PATCH 28/40] fix(ci): remove invalid wildcard instructions filename --- .github/instructions/*.instructions.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .github/instructions/*.instructions.md diff --git a/.github/instructions/*.instructions.md b/.github/instructions/*.instructions.md deleted file mode 100644 index 7a4b843e..00000000 --- a/.github/instructions/*.instructions.md +++ /dev/null @@ -1 +0,0 @@ -Review this PR. Do not leave line comments. Provide exactly one summary comment including: 1. A letter grade (A-F), 2. Major shortcomings blocking merge 3. Nice-to-have shortcomings 4. Merge readiness (Yes/No). From 4290e4584168f9ac44ac2d8e1439bf1bd48e0558 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:18:21 +1100 Subject: [PATCH 29/40] fix(comment): correct hide-cursor handler explanation for WGC/SCK/Linux --- electron/ipc/handlers.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index 44fcda9e..772e5ff9 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -2748,9 +2748,11 @@ export function registerIpcHandlers( // The IPC promise resolves only after the cursor hide attempt completes. // --------------------------------------------------------------------------- ipcMain.handle('hide-cursor', () => { - // No-op: macOS uses native ScreenCaptureKit (cursor excluded at capture - // level), and Win/Linux use Electron desktopCapturer where cursor hiding - // is not reliably supported. + // No-op: macOS excludes the cursor at the ScreenCaptureKit capture level. + // Windows excludes the cursor via IsCursorCaptureEnabled(false) in wgc_session.cpp. + // Linux uses Electron desktopCapturer which does not support cursor hiding; + // if WGC is unavailable on Windows the call also falls back to browser capture + // where cursor hiding is unsupported — those users may see the real cursor. return { success: true } }) From 1cde1806d060de9da0acf8010a783a0394e706e2 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:23:17 +1100 Subject: [PATCH 30/40] docs: add system requirements and clarify per-platform cursor capture in README - Add System Requirements table (macOS 12.3+, Windows 10 Build 19041+, Linux) - Update platform intro to include minimum versions - Replace 'Linux Cursor Capture' section with full per-platform breakdown - Clarify Windows WGC fallback to Electron capture on older builds - Add Build 19041+ requirement to Windows system audio section --- README.md | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d109ac90..202b3702 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,11 @@ Recordly lets you record your screen and automatically transform it into a polis Recordly runs on: -- **macOS** -- **Windows** -- **Linux** +- **macOS** 12.3+ +- **Windows** 10 Build 19041+ +- **Linux** (modern distros) -Linux currently use Electron's capture path, which means the OS cursor cannot always be hidden during recording. +On Windows, builds older than 19041 fall back to Electron capture and the cursor cannot be hidden. On Linux, cursor hiding is not supported. @@ -158,6 +158,19 @@ xattr -rd com.apple.quarantine /Applications/Recordly.app --- +# System Requirements + +| Platform | Minimum version | Notes | +|---|---|---| +| **macOS** | macOS 12.3 (Monterey) | Required for ScreenCaptureKit. Recording and cursor hiding will not work on older versions. | +| **Windows** | Windows 10 20H1 (Build 19041, May 2020) | Required for Windows Graphics Capture (`IsCursorCaptureEnabled`). Older builds fall back to Electron browser capture — cursor will be visible in recordings. | +| **Linux** | Any modern distro | Recording works via Electron capture. Cursor is always visible in recordings. System audio requires PipeWire (Ubuntu 22.04+, Fedora 34+). | + +> [!IMPORTANT] +> On Windows, if your build is older than 19041, recording will still work but **the cursor cannot be hidden** from the captured video. + +--- + # Usage ## Record @@ -203,11 +216,13 @@ Adjust: # Limitations -### Linux Cursor Capture +### Cursor Capture -Electron’s desktop capture API does not allow hiding the system cursor during recording. +**macOS**: Cursor is excluded from the recording at the ScreenCaptureKit level — always clean. -If you enable the animated cursor layer, recordings may contain **two cursors**. +**Windows**: Cursor is excluded via Windows Graphics Capture (`IsCursorCaptureEnabled(false)`) — requires **Windows 10 Build 19041+**. On older builds the app falls back to Electron’s browser capture and the real cursor will be visible in the recording. + +**Linux**: Electron’s desktop capture API does not support cursor hiding. The real OS cursor will always be visible in recordings. If you also enable the animated cursor overlay in the editor, you may see **two cursors** in the output. Improving cross-platform cursor capture is an area where contributions are welcome. @@ -218,7 +233,8 @@ Improving cross-platform cursor capture is an area where contributions are welco System audio capture depends on platform support. **Windows** -- Works out of the box +- Works out of the box via native WASAPI +- Requires Windows 10 Build 19041+ **Linux** - Requires PipeWire (Ubuntu 22.04+, Fedora 34+) From a648c3fecaab290be8b96d412053b9a23f1937e5 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:34:39 +1100 Subject: [PATCH 31/40] fix(linux): restore cursor follow with linux bounds + hook mouse cache --- electron/ipc/handlers.ts | 57 +++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index 772e5ff9..00f0da6e 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -1224,6 +1224,7 @@ let isCursorCaptureActive = false let interactionCaptureCleanup: (() => void) | null = null let hasLoggedInteractionHookFailure = false let lastLeftClick: { timeMs: number; cx: number; cy: number } | null = null +let linuxCursorScreenPoint: { x: number; y: number; updatedAt: number } | null = null let selectedWindowBounds: WindowBounds | null = null let windowBoundsCaptureInterval: NodeJS.Timeout | null = null @@ -1318,21 +1319,26 @@ async function resolveMacWindowBounds(source: SelectedSource): Promise { + if (process.platform !== 'linux' || !isCursorCaptureActive) { + return + } + + const point = getHookCursorScreenPoint(event) + if (!point) { + return + } + + linuxCursorScreenPoint = { x: point.x, y: point.y, updatedAt: Date.now() } + } + hook.on('mousedown', onMouseDown) hook.on('mouseup', onMouseUp) + hook.on('mousemove', onMouseMove) hook.start() @@ -1522,9 +1561,11 @@ async function startInteractionCapture() { if (typeof hook.off === 'function') { hook.off('mousedown', onMouseDown) hook.off('mouseup', onMouseUp) + hook.off('mousemove', onMouseMove) } else if (typeof hook.removeListener === 'function') { hook.removeListener('mousedown', onMouseDown) hook.removeListener('mouseup', onMouseUp) + hook.removeListener('mousemove', onMouseMove) } } catch { // ignore listener cleanup errors @@ -2229,6 +2270,7 @@ export function registerIpcHandlers( activeCursorSamples = [] pendingCursorSamples = [] cursorCaptureStartTimeMs = Date.now() + linuxCursorScreenPoint = null lastLeftClick = null sampleCursorPoint() cursorCaptureInterval = setInterval(sampleCursorPoint, CURSOR_SAMPLE_INTERVAL_MS) @@ -2239,6 +2281,7 @@ export function registerIpcHandlers( stopInteractionCapture() stopWindowBoundsCapture() stopNativeCursorMonitor() + linuxCursorScreenPoint = null snapshotCursorTelemetryForPersistence() activeCursorSamples = [] } From cc08288e231decd55e9acd5ea6f53fce74aab270 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:38:39 +1100 Subject: [PATCH 32/40] fix(cursor): prefer bundled mac-style SVG for not-allowed cursor --- .../video-editor/videoPlayback/uploadedCursorAssets.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts b/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts index f37d4587..8daff10f 100644 --- a/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts +++ b/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts @@ -32,6 +32,13 @@ export const uploadedCursorAssets: Partial Date: Mon, 16 Mar 2026 22:41:16 +1100 Subject: [PATCH 33/40] fix(cursor/linux): force bundled mac-style SVG pack for show-cursor --- .../video-editor/videoPlayback/cursorRenderer.ts | 5 ++++- .../video-editor/videoPlayback/uploadedCursorAssets.ts | 7 ------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/components/video-editor/videoPlayback/cursorRenderer.ts b/src/components/video-editor/videoPlayback/cursorRenderer.ts index 974a0844..3b8f29d6 100644 --- a/src/components/video-editor/videoPlayback/cursorRenderer.ts +++ b/src/components/video-editor/videoPlayback/cursorRenderer.ts @@ -167,6 +167,7 @@ function getAvailableCursorKeys(): CursorAssetKey[] { export async function preloadCursorAssets() { if (!cursorAssetsPromise) { cursorAssetsPromise = (async () => { + const isLinux = typeof navigator !== 'undefined' && /linux/i.test(navigator.platform); let systemCursors: Record = {}; try { @@ -182,7 +183,9 @@ export async function preloadCursorAssets() { SUPPORTED_CURSOR_KEYS.map(async (key) => { const systemAsset = systemCursors[key]; const uploadedAsset = uploadedCursorAssets[key]; - const assetUrl = uploadedAsset?.url ?? systemAsset?.dataUrl; + const assetUrl = isLinux + ? uploadedAsset?.url + : uploadedAsset?.url ?? systemAsset?.dataUrl; if (!assetUrl) { console.warn(`[CursorRenderer] No cursor image for: ${key}`); diff --git a/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts b/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts index 8daff10f..f37d4587 100644 --- a/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts +++ b/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts @@ -32,13 +32,6 @@ export const uploadedCursorAssets: Partial Date: Mon, 16 Mar 2026 22:49:29 +1100 Subject: [PATCH 34/40] fix(i18n): default app language to English on first launch --- src/contexts/I18nContext.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/contexts/I18nContext.tsx b/src/contexts/I18nContext.tsx index 77670801..dda55641 100644 --- a/src/contexts/I18nContext.tsx +++ b/src/contexts/I18nContext.tsx @@ -123,7 +123,9 @@ function getInitialLocale(): AppLocale { return storedLocale } - return normalizeLocale(window.navigator.language) + // Product default must be English on first launch unless user explicitly + // selected another locale and we persisted it in localStorage. + return DEFAULT_LOCALE } function getMessageValue(source: unknown, key: string): string | undefined { From 1274c31e7254c484f63d038647e994114815e91e Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:49:40 +1100 Subject: [PATCH 35/40] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 202b3702..af3b6d94 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Recordly runs on: - **Windows** 10 Build 19041+ - **Linux** (modern distros) -On Windows, builds older than 19041 fall back to Electron capture and the cursor cannot be hidden. On Linux, cursor hiding is not supported. +On Windows, builds older than 19041 fall back to Electron capture and the cursor cannot be hidden. On Linux, cursor hiding is not supported (contribute). From f3dca8a2bb771fc14d3861129e426fd4b355080e Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:53:02 +1100 Subject: [PATCH 36/40] fix(macos): keep sources visible when thumbnails are unavailable --- electron/ipc/handlers.ts | 11 +++++------ src/components/launch/SourceSelector.tsx | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index 00f0da6e..1416238a 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -1634,7 +1634,6 @@ export function registerIpcHandlers( if (process.platform !== 'darwin' || !includeWindows) { const windowSources = electronSources .filter((source) => source.id.startsWith('window:')) - .filter((source) => hasUsableSourceThumbnail(source.thumbnail)) .filter((source) => { const normalizedName = normalizeDesktopSourceName(source.name) if (!normalizedName) { @@ -1658,7 +1657,7 @@ export function registerIpcHandlers( id: source.id, name: source.name, display_id: source.display_id, - thumbnail: source.thumbnail ? source.thumbnail.toDataURL() : null, + thumbnail: hasUsableSourceThumbnail(source.thumbnail) ? source.thumbnail!.toDataURL() : null, appIcon: source.appIcon ? source.appIcon.toDataURL() : null, })) @@ -1705,13 +1704,14 @@ export function registerIpcHandlers( id: source.id, name: source.name, display_id: source.display_id ?? electronWindowSource?.display_id ?? '', - thumbnail: electronWindowSource?.thumbnail ? electronWindowSource.thumbnail.toDataURL() : null, + thumbnail: hasUsableSourceThumbnail(electronWindowSource?.thumbnail) + ? electronWindowSource!.thumbnail.toDataURL() + : null, appIcon: source.appIcon ?? (electronWindowSource?.appIcon ? electronWindowSource.appIcon.toDataURL() : null), appName: source.appName, windowTitle: source.windowTitle, } }) - .filter((source) => Boolean(source.thumbnail)) return [...screenSources, ...mergedWindowSources] } catch (error) { @@ -1719,7 +1719,6 @@ export function registerIpcHandlers( const windowSources = electronSources .filter((source) => source.id.startsWith('window:')) - .filter((source) => hasUsableSourceThumbnail(source.thumbnail)) .filter((source) => { const normalizedName = normalizeDesktopSourceName(source.name) if (!normalizedName) { @@ -1743,7 +1742,7 @@ export function registerIpcHandlers( id: source.id, name: source.name, display_id: source.display_id, - thumbnail: source.thumbnail ? source.thumbnail.toDataURL() : null, + thumbnail: hasUsableSourceThumbnail(source.thumbnail) ? source.thumbnail!.toDataURL() : null, appIcon: source.appIcon ? source.appIcon.toDataURL() : null, })) diff --git a/src/components/launch/SourceSelector.tsx b/src/components/launch/SourceSelector.tsx index 9b98e329..9d7b4037 100644 --- a/src/components/launch/SourceSelector.tsx +++ b/src/components/launch/SourceSelector.tsx @@ -153,11 +153,18 @@ export function SourceSelector() { >
- {source.name} + {source.thumbnail ? ( + {source.name} + ) : ( +
+
+
{t('sourceSelector.screens')}
+
+ )} {selectedSource?.id === source.id && (
From b711fd20f235eba624afdbe34d50de4435d57dd7 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:54:59 +1100 Subject: [PATCH 37/40] Revert "fix(macos): keep sources visible when thumbnails are unavailable" This reverts commit f3dca8a2bb771fc14d3861129e426fd4b355080e. --- electron/ipc/handlers.ts | 11 ++++++----- src/components/launch/SourceSelector.tsx | 17 +++++------------ 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index 1416238a..00f0da6e 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -1634,6 +1634,7 @@ export function registerIpcHandlers( if (process.platform !== 'darwin' || !includeWindows) { const windowSources = electronSources .filter((source) => source.id.startsWith('window:')) + .filter((source) => hasUsableSourceThumbnail(source.thumbnail)) .filter((source) => { const normalizedName = normalizeDesktopSourceName(source.name) if (!normalizedName) { @@ -1657,7 +1658,7 @@ export function registerIpcHandlers( id: source.id, name: source.name, display_id: source.display_id, - thumbnail: hasUsableSourceThumbnail(source.thumbnail) ? source.thumbnail!.toDataURL() : null, + thumbnail: source.thumbnail ? source.thumbnail.toDataURL() : null, appIcon: source.appIcon ? source.appIcon.toDataURL() : null, })) @@ -1704,14 +1705,13 @@ export function registerIpcHandlers( id: source.id, name: source.name, display_id: source.display_id ?? electronWindowSource?.display_id ?? '', - thumbnail: hasUsableSourceThumbnail(electronWindowSource?.thumbnail) - ? electronWindowSource!.thumbnail.toDataURL() - : null, + thumbnail: electronWindowSource?.thumbnail ? electronWindowSource.thumbnail.toDataURL() : null, appIcon: source.appIcon ?? (electronWindowSource?.appIcon ? electronWindowSource.appIcon.toDataURL() : null), appName: source.appName, windowTitle: source.windowTitle, } }) + .filter((source) => Boolean(source.thumbnail)) return [...screenSources, ...mergedWindowSources] } catch (error) { @@ -1719,6 +1719,7 @@ export function registerIpcHandlers( const windowSources = electronSources .filter((source) => source.id.startsWith('window:')) + .filter((source) => hasUsableSourceThumbnail(source.thumbnail)) .filter((source) => { const normalizedName = normalizeDesktopSourceName(source.name) if (!normalizedName) { @@ -1742,7 +1743,7 @@ export function registerIpcHandlers( id: source.id, name: source.name, display_id: source.display_id, - thumbnail: hasUsableSourceThumbnail(source.thumbnail) ? source.thumbnail!.toDataURL() : null, + thumbnail: source.thumbnail ? source.thumbnail.toDataURL() : null, appIcon: source.appIcon ? source.appIcon.toDataURL() : null, })) diff --git a/src/components/launch/SourceSelector.tsx b/src/components/launch/SourceSelector.tsx index 9d7b4037..9b98e329 100644 --- a/src/components/launch/SourceSelector.tsx +++ b/src/components/launch/SourceSelector.tsx @@ -153,18 +153,11 @@ export function SourceSelector() { >
- {source.thumbnail ? ( - {source.name} - ) : ( -
-
-
{t('sourceSelector.screens')}
-
- )} + {source.name} {selectedSource?.id === source.id && (
From ae9b7d91ab87c1748c2c1fd0fc3278679773d7f4 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:58:22 +1100 Subject: [PATCH 38/40] fix(ui): reset shadow slider to 67% default --- src/components/video-editor/SettingsPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/video-editor/SettingsPanel.tsx b/src/components/video-editor/SettingsPanel.tsx index c0498cdc..f5f15cf6 100644 --- a/src/components/video-editor/SettingsPanel.tsx +++ b/src/components/video-editor/SettingsPanel.tsx @@ -559,7 +559,7 @@ export function SettingsPanel({ Date: Mon, 16 Mar 2026 23:07:37 +1100 Subject: [PATCH 39/40] Remove Product Hunt link from README.zh-CN.md Removed Product Hunt link from the README. --- README.zh-CN.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 0d2dfbb4..3387b380 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -2,8 +2,6 @@ 语言: [English](README.md) | 简体中文 -[Product Hunt 页面 - 欢迎支持!](https://www.producthunt.com/products/recordly-make-stunning-product-demos?launch=recordly-2) -

Recordly logo

From 405946a1c89f219c38fd69a11f68a1819a42caea Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Mon, 16 Mar 2026 23:08:27 +1100 Subject: [PATCH 40/40] Update CONTRIBUTING.md --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index af256133..d386d2ff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,6 +10,7 @@ Areas where help is especially valuable: - German localisation - Code optimisation/refactoring - Auto-zoom suggestion logic improvements +- Regular updating of Chinese Readme ## How to Contribute