Commit Graph
927 Commits
Author SHA1 Message Date
webadderall 1d8b4bc5c0 fix(editor): restore inline project save and preview playback stability 2026-04-21 11:12:49 +10:00
webadderall 02880b2a60 Merge branch 'refactor/split-part1' into refactor/split-part2 2026-04-21 11:11:36 +10:00
webadderall 9469b30a4f fix(project): add named save IPC and stabilize recorder lifecycle 2026-04-21 11:10:31 +10:00
webadderall da66e25faf fix: correct malformed JSX props in RecordingControls
The toggleMicrophone and resumeRecording props were on the same line
as microphoneEnabled, causing the recording HUD buttons to break.
2026-04-20 23:02:52 +10:00
webadderall 735ebe189b fix: wire mic toggle in recording HUD, make dimension memos reactive, localize account button
- RecordingControls now accepts and wires toggleMicrophone so the mic
  button actually works during recording
- gifOutputDimensions and desiredMp4SourceDimensions now use a reactive
  videoDimensions state (set on loadedmetadata) instead of reading from
  a ref in useMemo, fixing stale 1920x1080 fallback on first render
- Account button text now goes through i18n with translations for all
  5 locales
2026-04-20 22:32:03 +10:00
webadderall 99f8ef0ae9 fix: don't let webcam teardown block native stop IPC
Start webcam stop as a guarded promise so a rejection can't prevent
stopNativeScreenRecording from running. The webcam result is awaited
only after the native stop path completes.
2026-04-20 22:29:28 +10:00
webadderall 2df47c9c7e fix: keep export dropdown open on save-failure branches too
GIF save-failure and MP4 save-failure paths had the same bug as the
export-failure paths: dropdown closes hiding the exportError UI. Now
keepExportDialogOpen = true in all non-smoke failure branches.
2026-04-20 22:20:51 +10:00
webadderall ce2f7147c4 fix: keep export dropdown open on failure, fix cancel during setup, fix Windows paths, translate i18n
- Export dropdown now stays open on GIF/MP4 failure and top-level catch so
  the exportError UI remains visible (previously dismissed by finally block)
- handleCancelExport always resets UI state even before exporter is constructed,
  so Cancel works during the async setup phase
- fromFileUrl() now converts forward slashes to backslashes for Windows drive
  paths (both primary and fallback parsing paths)
- Translated customFonts and color keys in es/ko/nl/zh-CN locales
2026-04-20 22:07:24 +10:00
webadderall 66a5ef3e27 fix: wrap native recording IPC calls in try/catch for resilient error handling
stopNativeScreenRecording and muxNativeWindowsRecording can reject if IPC
fails or the bridge is disposed. Without try/catch, setRecordingState(false)
is never called, the finalization toast stays up indefinitely, and no failure
UI is shown to the user. Now exceptions are caught and routed through the
existing diagnostics/recovery paths.
2026-04-20 22:07:03 +10:00
webadderall 25426fe702 revert: restore focus-visible:outline-none on sidebar buttons
UI decision — removes default focus ring to avoid ugly yellow selection ring.
2026-04-20 22:03:41 +10:00
webadderall c38b07073b fix: address CodeRabbit review feedback (round 2)
- Reorder recorder.stop() before cleanupCapturedMedia to avoid dropping final chunk (recordingStopHelpers)
- Guard speed region divisor against 0/NaN/Infinity (audioEncoder shared)
2026-04-20 21:52:39 +10:00
webadderall 5caafa95d6 fix: address CodeRabbit review feedback (round 2)
- Gate audio level meter to selected mic device only (helperComponents)
- Clear webcam deviceId when 'Default' selected (LaunchWindow)
- Wire i18n for 'Custom Fonts' and 'Color' labels (AnnotationTextTab)
- Restore keyboard focus ring on sidebar buttons (EditorSidebar)
- Add visually-hidden DialogTitle for a11y (ExtensionDetailModal)
- Make extension cards keyboard-accessible with role/tabIndex (ExtensionManagerCards)
- Write smoke export reports for GIF exports before closing (editorExportWorkflow)
- Guard GIF export against zero video dimensions (useEditorExport)
- Allow 'Save Again' before requiring loaded video (useEditorExport)
2026-04-20 21:52:07 +10:00
webadderall 6b9d4d8189 fix: add checkout step before local action in release workflow
The merge-macos-update-metadata job uses a local composite action at
./.github/actions/merge-macos-metadata but was missing a checkout step,
so the runner wouldn't have the action files.
2026-04-20 21:24:48 +10:00
webadderall 5dd5dbccf0 fix: address CodeRabbit review feedback
- AnnotationTextTab: use ?? instead of || so empty text can be cleared
- ExtensionManager: add catch block for marketplace install failures
- useEditorExport: wrap retry save in try/catch for unhandled rejections
- editorExportWorkflow: move playback restore to finally block
2026-04-20 21:23:58 +10:00
webadderall a9a019482d refactor: split large files (components) 2026-04-20 21:01:00 +10:00
webadderall 8a22033a50 refactor: split large files (electron, lib, hooks, scripts) 2026-04-20 21:00:34 +10:00
webadderall 2c00f18770 Merge pull request #283 from meiiie/fix/export-finalization-timeouts
fix(export): make audio finalization timeouts progress-aware
2026-04-20 20:56:28 +10:00
webadderall 09f487d069 Merge pull request #282 from meiiie/fix/protect-project-recordings-from-prune
fix(recordings): preserve media referenced by saved projects
2026-04-20 20:37:07 +10:00
webadderall 0ccdc449e8 Merge pull request #278 from meiiie/fix/export-media-paths
fix(export): reopen saved videos and default to source quality
2026-04-20 20:35:21 +10:00
webadderall bfe0cbe0e5 Merge pull request #280 from meiiie/fix/microphone-companion-audio
fix(recording): preserve mic companion audio in editor/export
2026-04-20 20:33:07 +10:00
wiiiii123 19486c7a44 fix(export): cancel timed out finalization work 2026-04-20 11:21:52 +07:00
wiiiii123 04e013cbbf fix(export): only refresh watchdog on progress 2026-04-20 10:39:10 +07:00
wiiiii123 6783eeb55c test(export): share finalization watchdog logic 2026-04-20 10:19:25 +07:00
wiiiii123 271dddcc32 fix(export): make audio timeouts progress-aware 2026-04-20 10:01:42 +07:00
wiiiii123 dc60a8e6e5 fix(export): scale audio finalization timeouts 2026-04-20 02:37:21 +07:00
wiiiii123 3509ecf21c fix(recordings): fail closed during prune project scans 2026-04-20 02:03:45 +07:00
wiiiii123 f7e3494ee3 fix(recordings): preserve media referenced by saved projects 2026-04-20 01:49:40 +07:00
wiiiii123 cf676487b2 fix(recording): preserve mic companion audio when source has audio 2026-04-19 23:54:40 +07:00
wiiiii123 cac33005e3 test(export): tighten media path regression coverage 2026-04-19 23:44:10 +07:00
webadderallandmeiiie daf99c0387 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>
v1.1.24
2026-04-20 01:08:12 +10:00
webadderall 92bb1065a2 fix: cast Linux portal sentinel as ProcessedDesktopSource to fix TS build error 2026-04-20 00:42:36 +10:00
wiiiii123 4f739a058e fix(export): reopen saved videos and default to source quality 2026-04-19 21:42:06 +07:00
webadderall 8d5a702cad Merge pull request #277 from webadderall/revert-276-fix/windows-wgc-recording-timestamps
Revert "fix(windows): normalize WGC sample timestamps"
2026-04-20 00:15:36 +10:00
webadderall 7bf94ed309 Revert "fix(windows): normalize WGC sample timestamps" 2026-04-20 00:12:32 +10:00
webadderall 7e4f469d92 bump ver 2026-04-19 23:59:02 +10:00
webadderall a39bc14342 Merge pull request #276 from meiiie/fix/windows-wgc-recording-timestamps
fix(windows): normalize WGC sample timestamps
2026-04-19 23:48:48 +10:00
wiiiii123 16e9a63eb6 fix(windows): normalize WGC sample timestamps 2026-04-19 20:20:06 +07:00
webadderall e4a780a7d4 Merge pull request #269 from uriva/fix/linux-wayland-single-portal
fix(linux/wayland): collapse 3-step capture flow into a single portal dialog (closes #268)
2026-04-19 00:30:44 +10:00
Uri b200deddca 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 571bbb9434 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 8cefcea816 Merge pull request #267 from webadderall/fix/linux-x11-fullscreen-capture
fix(linux): allow full-screen capture by position if IDs do not match
2026-04-18 22:38:07 +10:00
webadderall fa97c94411 fix(linux): allow full-screen capture by matching display sources by position if IDs do not match (fixes #265) 2026-04-18 22:34:54 +10:00
webadderall c8db3f890f Merge pull request #264 from webadderall/fix/linux-gpu-hud-fallback
fix: Linux GPU fallback and HUD window show safety net
2026-04-18 22:12:25 +10:00
webadderall e82e4bc2c2 Merge pull request #262 from webadderall/fix/export-pipeline-streaming-chunked
fix: streaming decode + chunked offline audio rendering for export
2026-04-18 22:12:10 +10:00
webadderall 41249a9a19 refactor: remove redundant Linux platform guard in GPU config 2026-04-18 22:05:05 +10:00
webadderall 681bc70c13 fix: clear video src on timeout path in getMediaDurationSec 2026-04-18 22:04:40 +10:00
webadderall a0668696bc fix: address CodeRabbit review — fallback, i18n, return type cleanup
- Change ?? 99 fallback to ?? 100 in finalizing progress label
- Add editor.export.processingAudioEdits i18n key to all 5 locales
- Tighten sourceTimeToOutputTime return type to number (was number|null)
- Remove now-unused totalOutputDurationMs param from scheduleRegionForChunk
- Remove ?? fallbacks at call sites (function always returns a number)
2026-04-18 21:38:05 +10:00
webadderall d4a7c863e8 fix: Linux GPU fallback and HUD window show safety net
- Add Linux GPU config: use EGL (better Wayland compat), disable VAAPI
  video decoder/encoder (many distros ship broken drivers causing
  'vaInitialize failed' and preventing renderer from loading)
- Add ready-to-show fallback for HUD window: if did-finish-load never
  fires (GPU failure), show the window after 500ms via ready-to-show

Ref #261
2026-04-18 21:32:18 +10:00
webadderall 20231fbd71 Merge pull request #263 from webadderall/fix/remove-extension-sources-fix-lucide
fix: remove extension-sources, replace lucide-react with phosphor icons
2026-04-18 21:29:58 +10:00
webadderall 9b6744a85c fix: remove extension-sources, replace lucide-react with phosphor icons
- Remove extension-sources/ directory (91MB of bundled extension assets)
- Add extension-sources/ to .gitignore
- Replace all lucide-react imports with @phosphor-icons/react equivalents
  in TutorialHelp, ExtensionManager, and TimelineEditor
- Fixes #261 (missing lucide-react dependency + Twitter icon crash)

Closes #261
2026-04-18 21:18:12 +10:00