Commit Graph
555 Commits
Author SHA1 Message Date
webadderall c6aa98117e Merge pull request #295 from BillLucky/fix/export-large-files-upstream
fix(export): stream MP4 output to disk to unblock >2 GiB exports
2026-04-25 00:45:44 +10:00
webadderall 58e298c250 Merge pull request #321 from meiiie/fix/win10-floating-webcam-preview
fix(launch): disable floating webcam preview without passthrough
2026-04-25 00:44:41 +10:00
webadderall 9bde5df79f Merge pull request #256 from akctba/feature/brazilian-portuguese
Adding Portuguese to languages
2026-04-25 00:42:59 +10:00
大彪 d59e59788b fix(export): address remaining PR #295 review threads
- Include `resolvedWebcamVideoUrl` in the dependency arrays for
  `captureProjectThumbnail` and `handleExport` so thumbnail capture and
  export settings stay in sync when the webcam URL refreshes.
- Clear `VideoMuxer.streamSink` before awaiting `closeIpcExportStream`
  in `finalize()` to close the race where a concurrent `destroy()` →
  `abortStream()` could try to close the same stream ID a second time.
2026-04-24 16:02:37 +08:00
大彪 1280670740 chore(smoke-export): let the smoke harness open .recordly project files
Previously the smoke-export harness only accepted a raw MP4 input path.
Validating the export pipeline on a real editor project (with its own
zoom regions, wallpaper, annotations, and webcam state) required
opening the editor by hand and clicking through the GUI.

This adds three new environment variables that are picked up by the
existing smoke-export query string plumbing:

- RECORDLY_SMOKE_EXPORT_PROJECT  — path to a .recordly project file;
  when set, the editor opens it via openProjectFileAtPath and applies
  the saved state before the auto-export fires.
- RECORDLY_SMOKE_EXPORT_QUALITY  — overrides the hard-coded "good"
  quality used by the auto-export trigger; accepts medium / good /
  high / source.
- RECORDLY_SMOKE_EXPORT_FPS      — overrides the frame rate; accepts
  24 / 30 / 60.

No behavior change for existing RECORDLY_SMOKE_EXPORT_INPUT runs;
the new inputs are strictly additive and optional. The startup log
line prefers the project path over the raw-input path when both are
populated.
2026-04-24 16:02:37 +08:00
大彪 bd8a941c12 fix(export): stream MP4 output to disk to unblock >2 GiB exports
Long recordings (35-minute screencaps were the motivating case) fail at
the 99% "Finalizing" step with a RangeError once the muxed MP4 would
exceed V8's ~2 GiB per-ArrayBuffer limit. Both export paths accumulate
the whole file in renderer memory and round-trip it through IPC, so no
output size past that point can complete:

- Legacy: src/lib/exporter/muxer.ts uses mediabunny's BufferTarget,
  which holds the entire MP4 in a single ArrayBuffer. finalize() → Blob
  → blob.arrayBuffer() → ipcRenderer.invoke('write-exported-video-to-
  path', arrayBuffer, path) — every step wants a ≥2 GiB contiguous
  allocation.
- Lightning: native-video-export-finish did fs.readFile(finalizedPath)
  and shipped the bytes back to the renderer, which re-serialized them
  again. Same ceiling.

This change moves the finished MP4 across the renderer↔main boundary
via a temp file instead of an ArrayBuffer:

- New electron/ipc/export/exportStream.ts manages streaming temp files
  via fh.write(buf, 0, len, position) so out-of-order writes (moov box
  rewrites, etc.) stay safe. Each session lives in a 0700 mkdtemp()
  directory opened with O_CREAT | O_EXCL so a hostile local user on a
  shared tempdir cannot pre-plant a symlink at the predicted path.
- New renderer-facing IPCs: export-stream-open/write/close,
  finalize-exported-video (renames temp to final path, copy+unlink
  fallback on EXDEV/EPERM/ENOTEMPTY with console.warn on leaked bytes),
  mux-exported-video-audio-from-path (FFmpeg audio fallback that takes
  a path instead of an ArrayBuffer), and discard-exported-temp. Every
  handler validates the caller-supplied path against an owned-export-
  paths registry before touching disk, so a compromised renderer cannot
  route arbitrary filesystem paths into main-process deletes/moves.
- The muxer now picks mediabunny's StreamTarget automatically when the
  Electron bridge is available (BufferTarget stays for tests and any
  non-Electron callers). finalize() returns { mode, tempFilePath,
  bytesWritten } or { mode, blob } so the exporter can branch.
- Exporters forward tempFilePath through ExportResult. Lightning's
  finish returns the ffmpeg temp path directly; the FFmpeg audio
  fallback forks on the muxer result type. modernVideoExporter's
  Lightning success branch now accepts tempFilePath (previously it
  checked blob only, which regressed every native export).
- VideoEditor.tsx dispatches on tempFilePath: finalize via the new IPC,
  keep the temp in place when the save dialog is canceled so "Save
  Again" still works without re-rendering, keep the pending-save entry
  alive on non-canceled save failures, and discard the temp on unmount
  or explicit clear. GIF and smoke-test code paths still use the
  legacy Blob path unchanged.
- app.on('before-quit') also reaps any open streaming sessions via
  cleanupAllExportStreams().

Chunk size is 16 MiB — well under Electron/Mojo IPC message limits
while keeping total writes low (~160 for a 2.5 GB export).

Tested locally: exported a 35:13 source (~2.7 GiB H.264 input) at
Original 1920×1080 + Balanced. Previously failed on finalize with a
RangeError; with this patch the Legacy pipeline produced a valid 3.7
GiB MP4 whose ffmpeg -i duration/streams match the source.

Addresses #194.
2026-04-24 16:02:37 +08:00
webadderall 3283ee9213 Fix companion audio sync for trimmed and long exports 2026-04-24 12:04:21 +10:00
webadderall c807ef823f Support drag-and-drop placement across audio rows 2026-04-24 11:49:16 +10:00
webadderall e4d958b365 Add track-aware audio placement in timeline editor 2026-04-24 11:49:16 +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
Alex KayserandCopilot 61ae12c8af diacritics review
Co-authored-by: Copilot <copilot@github.com>
2026-04-23 10:41:46 -04:00
webadderall 0199d55656 Persist crop settings in saved projects 2026-04-24 00:29:43 +10:00
Alex Kayser 620e74d3b9 Merge branch 'main' into feature/brazilian-portuguese 2026-04-23 10:25:58 -04:00
webadderall 9ca49f6ffb Merge pull request #327 from uriva/fix/linux-wayland-hud-drag
fix(linux): allow dragging HUD overlay on Wayland
2026-04-24 00:18:56 +10:00
webadderallandSehajveerSingh2005 7789a4d01e Add independent padding controls
Co-authored-by: SehajveerSingh2005 <sehajveersingh2005@gmail.com>
2026-04-23 23:58:38 +10:00
Uri 782324f9af fix(linux): allow dragging HUD overlay on Wayland via native OS drag
BrowserWindow.setBounds() with x/y is silently ignored on Wayland (the
compositor owns window placement), so the IPC-driven HUD drag never
moved the window \u2014 it stayed put even though pointer events fired and
the cursor changed to grabbing.

Mark the drag handle as -webkit-app-region: drag on Linux (only in the
IPC/overlay mode; webcam-preview mode still uses the in-window CSS
transform) so the OS performs a real xdg_toplevel.move. Mirror the
resulting bounds into hudUserPosition via the window 'moved' event so
commit 224a480's in-place resize behavior keeps working on Linux.
2026-04-23 14:52:40 +03:00
webadderall 00547560fe Revert "Add audio-row feature to video editor timeline"
This reverts commit cfaa7209ae.
2026-04-23 17:14:38 +10:00
webadderall cfaa7209ae Add audio-row feature to video editor timeline 2026-04-23 17:01:51 +10:00
wiiiii123 82e7a698f6 fix(launch): disable floating webcam preview without passthrough 2026-04-23 10:52:41 +07:00
webadderall d115447053 Merge pull request #300 from meiiie/fix/hud-short-drag-passthrough
fix(launch): keep HUD interactive after short drags
2026-04-22 17:26:49 +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
webadderall 75700be9d5 Merge pull request #313 from meiiie/fix/fullscreen-countdown-recovery
fix(recording): recover from fullscreen countdown failures
2026-04-22 17:19:11 +10:00
webadderall 98973b9a8f Merge pull request #297 from meiiie/fix/export-edited-track-filtergraph
fix(export): fast-path simple edited audio tracks
2026-04-22 17:18:14 +10:00
webadderall b1fd9597d8 Merge pull request #299 from meiiie/fix/editor-duration-cutoff
fix(editor): extend auto full-track clips when duration grows
2026-04-22 11:17:51 +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
wiiiii123 ff3dac70c0 fix(export): validate edited-track fast-path inputs 2026-04-21 18:09:23 +07:00
wiiiii123 c8431c1f26 fix(export): fast-path simple edited audio tracks 2026-04-21 18:09:23 +07:00
webadderall b00e32dfb6 fix(export): handle loopback media URLs during export 2026-04-21 19:22:05 +10:00
webadderall f64267e2ec Merge pull request #292 from sp00kid/fix/preview-quality
fix: improve video preview quality by deferring filter attachment
2026-04-21 18:32:04 +10:00
webadderall 709b86bb90 Merge pull request #284 from meiiie/research/export-pipeline-profiling
chore(export): expand finalization profiling
2026-04-21 18:26:03 +10:00
webadderall 2872681ea6 Handle rename errors and prompt to save unsaved recordings 2026-04-21 15:14:10 +10:00
webadderall e8afbecb9f Cleanup rename and trim handling 2026-04-21 14:58:56 +10:00
webadderall ebd7e0d3ba Clean up dependent regions on clip resize 2026-04-21 14:51:12 +10:00
webadderall cdd2378992 Protect projectId from overwrite follow-up 2026-04-21 14:44:10 +10:00
webadderall 482134a03b fix(editor): address PR review feedback 2026-04-21 11:59:09 +10:00
webadderall e89b4e1317 fix(editor): port project save UX and clip cleanup to main 2026-04-21 11:46:07 +10:00
wiiiii123 02f6ac2621 fix(launch): use live HUD bounds after drag 2026-04-21 02:54:00 +07:00
wiiiii123 2c36bc8243 fix(launch): keep HUD interactive after short drags 2026-04-21 02:25:56 +07:00
wiiiii123 8e2a69574d test(editor): expand auto clip guard coverage 2026-04-21 02:08:20 +07:00
wiiiii123 2a958c3514 fix(editor): preserve full-track duration growth 2026-04-21 01:43:13 +07:00
Ewazer 7349b3ae15 Fix: Update error messages for image upload failure 2026-04-20 15:58:06 +02:00
Ewazerandcoderabbitai[bot] 5d6e70cae2 Update src/i18n/locales/fr/timeline.json
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-04-20 15:51:31 +02:00
Ewazer c9e6f74c93 update 2026-04-20 13:24:20 +00:00
Ewazer b3fc91e9cf Update dialogs.json 2026-04-20 15:22:03 +02:00
wiiiii123 87c83eb8d4 fix(export): clean telemetry profiling rebase 2026-04-20 20:11:58 +07:00
wiiiii123 3c1923178b chore(export): add ffmpeg mux timing breakdown 2026-04-20 20:09:54 +07:00
wiiiii123 5ad4fee100 chore(export): add finalization stage profiling 2026-04-20 20:09:21 +07:00
Ewazer ff9bb9cb65 Update SettingsPanel.tsx 2026-04-20 14:40:36 +02:00