Commit Graph
100 Commits
Author SHA1 Message Date
Alan Trebugeais b10f0bf4c3 fix: webcam recording, now it works, alongside the microphone etc 2026-05-10 23:37:07 +02:00
Alan Trebugeais fce2c0e75a add: video editor use screen recorder fix code rabbits 2026-05-10 21:36:52 +02:00
Alan Trebugeais 6c1a561273 fix screenrecorder webcam 2026-05-10 18:05:29 +02:00
Alan Trebugeais 288dc37aee fix: editor loads instantly 2026-05-10 13:18:26 +02:00
Alan Trebugeais 8da8984d07 add: 20 seconds -> 2 seconds fix, for now behind a flag to be sure to be able to revert. 2026-05-10 13:01:45 +02:00
wiiiii123 d7e27d3152 fix(recording): clamp cursor samples at pause boundary 2026-05-09 12:57:05 +07:00
wiiiii123 26cfeacd50 test(recording): cover paused recorder flush order 2026-05-09 09:01:39 +07:00
wiiiii123 7f5084387f fix(recording): stop browser recorder before cleanup 2026-05-09 08:53:53 +07:00
wiiiii123 3d6668fd60 fix(recording): account for mic pause gaps 2026-05-08 01:35:17 +07:00
wiiiii123 678ece2f4a fix(export): harden native beta pipeline 2026-05-07 22:37:27 +07:00
wiiiii123 3f57899a98 fix(recording): quiet browser mic processing notice 2026-05-07 05:10:28 +07:00
wiiiii123 45f05e78c4 fix(recording): default windows mic to browser processing 2026-05-07 04:51:30 +07:00
wiiiii123 5bb36ca5fa fix(recording): add windows mic diagnostics fallback 2026-05-07 04:00:46 +07:00
wiiiii123 3ab66c9057 feat(export): prepare native GPU beta candidate
Add validated native CUDA/D3D11 timeline retime, pause-aware capture timing, webcam source-time sampling, edited-track audio duration padding, packaged helper updates, and focused tests for PR #410 tester branch.
2026-05-06 01:50:12 +07:00
wiiiii123 762a5ba895 Merge remote-tracking branch 'origin/main' into perf/native-chunked-export-fastpath
# Conflicts:
#	electron/ipc/register/recording.ts
#	src/components/video-editor/VideoEditor.tsx
#	src/components/video-editor/VideoPlayback.tsx
#	src/hooks/useScreenRecorder.ts
#	src/lib/exporter/modernFrameRenderer.ts
#	src/lib/exporter/modernVideoExporter.ts
2026-05-05 16:59:32 +07:00
webadderall f65e0090dc fix: address review issues and preserve editor rollback 2026-05-05 16:18:47 +10:00
webadderall 0ffbcff9b2 fix: address PR feedback regressions 2026-05-05 16:17:47 +10:00
webadderall 248a5db8c1 Reapply "feat: bundle cursor motion and temporal blur updates"
This reverts commit 132c77a5cc.
2026-05-05 16:16:56 +10:00
webadderall 132c77a5cc Revert "feat: bundle cursor motion and temporal blur updates" 2026-05-04 18:17:04 +10:00
webadderall 7660bedeb4 feat: bundle cursor motion and temporal blur updates 2026-05-04 18:12:47 +10:00
wiiiii123 b1433f9836 Add NVIDIA CUDA export compositor 2026-05-04 09:59:41 +07:00
wiiiii123 05327a12ce Add native GPU static layout export path 2026-05-03 22:43:23 +07:00
webadderall 1c461734d8 [codex] Fix cursor sync after recording pause (#399)
* Fix cursor sync after recording pause

* Align recorder and cursor pause boundaries
2026-05-01 17:18:35 +10:00
Amaan 9c4cb60974 fix(linux): move fallback out of audio-only branch and surface audio downgrade 2026-04-27 17:10:12 +05:30
Amaan 11c82c18a4 fix(linux): fallback to desktop capture when getDisplayMedia fails 2026-04-27 16:09:00 +05:30
webadderall cd4ea8fc05 Improve HUD and update prompt UI 2026-04-25 21:34:55 +10:00
webadderall 3283ee9213 Fix companion audio sync for trimmed and long exports 2026-04-24 12:04:21 +10:00
webadderall f056a22afc Fix embedded audio fallback handling and audio diagnostics (#309)
* Fix embedded audio fallback handling and audio diagnostics

* Add recording fallback diagnostics toasts

* Fix Windows audio fallback cleanup and path matching

* Format rebased recording fallback changes

* Fix embedded audio preview and export fallback handling
2026-04-24 11:30:10 +10:00
webadderall e6f5243e11 Merge pull request #314 from soufian3hm/fix/windows-recording-validation
Fix invalid Windows recording finalization
2026-04-22 17:19:56 +10:00
soufian3hm 87ae990b22 Fix invalid Windows recording finalization 2026-04-21 17:38:37 +01:00
wiiiii123 0f1e04a547 fix(recording): always clean up failed starts 2026-04-21 21:05:36 +07:00
wiiiii123 4207664c4a fix(recording): recover from fullscreen countdown failures 2026-04-21 20:46:37 +07:00
webadderallandmeiiie b8e46623cd fix(recording): prefer playable browser capture codecs (#275)
Verifies the selected recording MIME type can also be decoded by the
in-app <video> element via canPlayType(), so that codecs like av1 —
which MediaRecorder.isTypeSupported() reports as supported for encoding
but are not decodable on fresh Windows installs without the AV1 Video
Extension — are not chosen.

Also passes undefined (not an unsupported fallback string) into
new MediaRecorder() when no preferred type is supported, letting the
browser pick a default instead of throwing NotSupportedError.

Replaces the previous 'as ProcessedDesktopSource' cast with a properly
typed LINUX_PORTAL_SOURCE constant.

Co-authored-by: meiiie <meiiie@users.noreply.github.com>
2026-04-20 01:08:12 +10:00
webadderall d2f5bbc9a6 fix: cast Linux portal sentinel as ProcessedDesktopSource to fix TS build error 2026-04-20 00:42:36 +10:00
Uri 186b08aa83 fix(linux/wayland): address PR review feedback
- electron/main.ts: treat missing sourceId on linux as portal sentinel
  so the request handler never calls getSources() (which itself opens
  an extra portal dialog) on fresh sessions.
- useScreenRecorder.ts: persist the synthesized portal sentinel via
  selectSource() so main has the source set before getDisplayMedia.
  Extract acquireLinuxPortalStream() helper to dedupe the three
  duplicated getDisplayMedia constraint blocks.
- LaunchWindow.tsx: hide the screen-source selector button (and its
  separator) on Linux so users cannot trigger an extra portal dialog
  via the dropdown.
2026-04-18 16:38:52 +03:00
Uri b6d2aaf5c6 fix(linux/wayland): collapse 3-step capture flow into a single portal dialog
Previously on Linux/Wayland, starting a fullscreen recording required three
separate picker interactions: an in-app source dropdown plus two xdg-desktop-portal
dialogs. The duplicate portal dialogs were caused by:

1. resolveBrowserCaptureSource() calling desktopCapturer.getSources() in the
   renderer, which itself triggers the portal on Wayland.
2. setDisplayMediaRequestHandler() in main also calling getSources(), which
   triggers another portal.
3. Returning a pre-enumerated source id to Chromium, which on Wayland is stale
   and forces Chromium to re-prompt via the portal during MediaStream creation.

Additionally, the editor window failed to appear after recording on some
Wayland sessions because 'ready-to-show' did not fire reliably.

Changes:
- LaunchWindow: skip the in-app source dropdown on Linux and start recording
  directly; the OS portal becomes the source picker.
- useScreenRecorder: introduce a 'screen:linux-portal' sentinel source. When
  set, route capture through navigator.mediaDevices.getDisplayMedia() so the
  portal handles selection in a single dialog. Skip resolveBrowserCaptureSource
  for the sentinel to avoid an extra getSources() call.
- electron/main: in setDisplayMediaRequestHandler, when the sentinel is set,
  skip desktopCapturer.getSources() entirely and return a synthetic source so
  Chromium opens the portal exactly once for the actual capture.
- electron/windows: in createEditorWindow, also call win.show() from
  did-finish-load as a fallback for Linux/Wayland where ready-to-show may
  not fire.
2026-04-18 16:17:08 +03:00
webadderall d39b9a4e32 fix: address CodeRabbit review feedback
- Fix telemetry drift reset: use nextExpectedMs - now for delay instead
  of stale drift value after baseline reset (avoids 1ms rapid sample)
- Use RECORDER_TIMESLICE_MS for mic fallback recorder (was hardcoded 1000)
- Return requested timeMs in extensionHost getCursorAt boundary clamps
- Remove premature null of webcam URL to prevent flicker on path change
- Use fs.realpath in IPC get-local-media-url to match media server check
2026-04-18 19:03:36 +10:00
webadderall c4ada3505c fix: always apply aresample sync filter and tighten audio sync tolerances
- Always route audio through aresample=async=1:first_pts=0 filter during
  muxing on both macOS and Windows, even when duration delta is small.
  Previously skipped when delta ≤50ms, which left progressive clock drift
  (from CPU load) completely uncorrected.
- Lower sync detection threshold from 50ms to 20ms so tempo correction
  kicks in earlier.
- Use explicit 48kHz AudioContext sample rate in both browser recording
  and export rendering to prevent sample rate mismatch drift.
- Reduce MediaRecorder timeslice from 1000ms to 250ms to reduce chunk
  loss under CPU pressure.
- Tighten export audio sync: seek threshold 300ms→150ms, tolerance
  15ms→8ms, correction window 2s→0.5s, max adjustment ±8%→±12%.
- Lower companion audio start delay threshold from 50ms to 25ms.
2026-04-18 19:03:36 +10:00
webadderall 16c6204af2 Merge remote-tracking branch 'origin/main' into feat/settings-extensions
# Conflicts:
#	src/components/video-editor/timeline/TimelineEditor.tsx
2026-04-17 14:07:46 +10:00
webadderall 63bfa13a05 fix: address remaining timeline review feedback 2026-04-17 00:23:52 +10:00
webadderall 290db18e6e fix: address timeline editor review feedback 2026-04-16 19:34:02 +10:00
webadderall e5dd20bf82 fix: address settings and extensions review feedback 2026-04-16 19:16:20 +10:00
webadderall 949b9381f6 feat: overhaul timeline drag/resize, zoom playback, and recording hooks
- TimelineEditor: rewrite drag/resize with neighbour clamping — items cannot
  overlap; drag preserves original duration; resize clamps to adjacent item
  boundaries instead of rejecting; floating drag/resize tooltip via direct
  DOM (no re-renders)
- TimelineWrapper: new wrapper component for cleaner TimelineContext wiring
- Track: extract Track component with empty-row hint slot
- AudioWaveform, Row, Subrow, KeyframeMarkers, Timeline.module.css: dark
  theme timeline overhaul
- zoomSuggestionUtils: smarter auto-zoom region suggestion from cursor telemetry
- videoPlayback (zoom): fix zoomRegionUtils edge cases at timeline bounds;
  rework zoomTransform for cursor-follow camera
- videoPlayback (cursor): cursorFollowCamera, cursorSway, cursorLoopTelemetry,
  cursorViewport — new cursor motion and snapping pipeline
- videoPlayback (layout): layoutUtils, overlayUtils, focusUtils, motionSmoothing
- useScreenRecorder: hardened recording lifecycle, pause segment tracking,
  improved WGC and SCK integration
- useVideoDevices / useMicrophoneDevices / useAudioLevelMeter improvements
2026-04-16 17:53:51 +10:00
webadderall 781cb4c38d feat: settings tab with language picker, extension fixes, and i18n expansion
- SettingsPanel: new 'settings' section — in-app language picker (all 5
  locales), auto-apply fresh recording zooms toggle, connect-neighboring-
  zooms toggle, keybinds shortcut into KeyboardShortcutsDialog
- VideoEditor: wire autoApplyFreshRecordingAutoZooms preference through to
  SettingsPanel; connect zoom settings into new section
- editorPreferences: add autoApplyFreshRecordingAutoZooms field; update tests
- extensionMarketplace: filter __MACOSX sidecar dirs when unzipping extensions
  uploaded from macOS Finder (fixes manifest-not-found on Finder zips)
- useExtensions: guard window.electronAPI for SSR safety; reformat to tabs
- I18nContext: expose setLocale; persist locale preference
- ShortcutsContext: shortcut registration improvements
- lib/extensions: renderHooks, extensionHost, fileUrls, cursorCoordinates
  updated for new extension capability surface
- i18n: expand extension locale strings across all 5 supported languages
2026-04-16 17:52:53 +10:00
webadderall 8396b89d60 feat(editor): full-width timeline, extension i18n, lifecycle fixes
- Move timeline below preview+settings so it spans full editor width
- Remove react-resizable-panels vertical split
- Add scoped i18n for ExtensionManager (en/zh/ko/ja/es)
- Fix stale extension activation cleanup and deactivation on uninstall
- Cache-bust extension module URLs on reinstall
- Move bundled cursor packs to extension-sources/ for marketplace upload
- Track marketplace download counts (fire-and-forget POST)
2026-04-12 16:59:07 +10:00
webadderall 20f42d3fca fix(audio): add browser microphone fallback for macOS < 14
On macOS versions before Sonoma (14.0), SCStreamConfiguration does not
support the captureMicrophone/microphoneCaptureDeviceID selectors. The
native helper was throwing a fatal error, blocking recording entirely
when microphone was enabled.

Now the Swift helper logs MICROPHONE_CAPTURE_UNAVAILABLE and continues
capture without microphone. The Node handler detects this signal and
returns microphoneFallbackRequired to the renderer, which starts a
browser-side MediaRecorder capturing the mic via getUserMedia. On stop,
the audio blob is saved as a .mic.webm sidecar alongside the native
recording, where the existing companion audio detection picks it up.

Fixes: 'Native microphone capture is unavailable on this macOS/Xcode
runtime' error on older macOS versions.
2026-04-12 16:59:06 +10:00
webadderall 18d5a091f8 feat: extension system with marketplace, permissions, and security hardening
- Extension loader with manifest validation, ID sanitization, and path traversal protection
- Permission-gated runtime API (render, cursor, audio, timeline, ui, assets, export)
- Extension host with lifecycle management (activate/deactivate)
- Marketplace client for browsing, downloading, and installing extensions
- Extension Manager UI panel with enable/disable/uninstall
- IPC bridge for extension discovery, management, and marketplace operations
- Proxy guard on window.electronAPI to block extension access to privileged IPC
- Zip-slip protection via post-extraction directory traversal validation
- Safe PowerShell invocation for Windows zip extraction (no string interpolation)
- File URL resolution with path escape prevention
2026-04-12 01:37:28 +10:00
webadderall 91c5331a21 revert(recording): remove editor finalization phase 2026-04-04 22:26:25 +11:00
webadderall f322f78c19 fix(recording): improve post-capture handoff 2026-04-04 22:14:15 +11:00
webadderall 54b5227712 open editor during recording finalization 2026-04-04 13:07:49 +11:00