Commit Graph
429 Commits
Author SHA1 Message Date
webadderall bbd46b44ac Fix video wallpaper sync and streamline updater UI 2026-04-27 15:48:38 +10:00
Wiii 0e972ba96e feat(editor): add audio region volume control
Expose the existing added-audio volume field in the selected-audio settings panel and keep timeline row hit targets selectable.
2026-04-27 00:16:08 +07:00
Wiii 5238dd79ce fix(editor): allow scrolling all audio tracks
Allow timeline content to grow with additional audio rows so the existing scroll container can reach lower tracks.
2026-04-26 23:48:38 +07:00
webadderall 2d23885bd3 style(ui): use SF Pro globally and add release helper 2026-04-26 20:36:01 +10:00
webadderall ca05a3fcc0 fix(webcam): correct sync offset direction 2026-04-26 20:10:38 +10:00
webadderall 99ea9df18d Promote padding label to section heading 2026-04-26 19:56:40 +10:00
webadderall 21d8f321ec Match macOS cursor height to Tahoe 2026-04-26 19:56:40 +10:00
webadderall 4961cfe33d Merge pull request #351 from webadderallorg/codex/cursor-asset-sets
Wire new cursor asset sets
2026-04-26 19:27:59 +10:00
Wiii f483b0a4a0 fix(editor): align preview timing with presented video frames 2026-04-26 00:02:46 +07:00
webadderall ef636934f2 Wire new cursor asset sets 2026-04-26 00:28:45 +10:00
webadderall 624c3047be Improve HUD and update prompt UI 2026-04-25 21:34:55 +10:00
webadderall aab14e822a 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 66bd91e6a5 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 b7b984d130 Merge pull request #256 from akctba/feature/brazilian-portuguese
Adding Portuguese to languages
2026-04-25 00:42:59 +10:00
大彪 f05dc1f495 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
大彪 f8122bde18 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
大彪 9ac4dbd2e8 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 62f2a52860 Fix companion audio sync for trimmed and long exports 2026-04-24 12:04:21 +10:00
webadderall b63aba99b0 Support drag-and-drop placement across audio rows 2026-04-24 11:49:16 +10:00
webadderall c667f2efe0 Add track-aware audio placement in timeline editor 2026-04-24 11:49:16 +10:00
webadderall 05a6d3f1b6 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 c76e3dc84c Persist crop settings in saved projects 2026-04-24 00:29:43 +10:00
Alex Kayser 42192cd0eb Merge branch 'main' into feature/brazilian-portuguese 2026-04-23 10:25:58 -04:00
webadderall f140096074 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 282ccefedc Add independent padding controls
Co-authored-by: SehajveerSingh2005 <sehajveersingh2005@gmail.com>
2026-04-23 23:58:38 +10:00
Uri 8c7c57aa1c 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 a78f7d4's in-place resize behavior keeps working on Linux.
2026-04-23 14:52:40 +03:00
webadderall 9f3e234f85 Revert "Add audio-row feature to video editor timeline"
This reverts commit 569d9ab5bb.
2026-04-23 17:14:38 +10:00
webadderall 569d9ab5bb Add audio-row feature to video editor timeline 2026-04-23 17:01:51 +10:00
wiiiii123 bac0a0282f fix(launch): disable floating webcam preview without passthrough 2026-04-23 10:52:41 +07:00
webadderall 7b56dfc0d9 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 787241242e 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
webadderall 2e513adef6 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 25f6258f3a Handle rename errors and prompt to save unsaved recordings 2026-04-21 15:14:10 +10:00
webadderall ce970adf5a Cleanup rename and trim handling 2026-04-21 14:58:56 +10:00
webadderall 916307df07 Clean up dependent regions on clip resize 2026-04-21 14:51:12 +10:00
webadderall 1f5a425d34 Protect projectId from overwrite follow-up 2026-04-21 14:44:10 +10:00
webadderall 9a4c5155a9 fix(editor): address PR review feedback 2026-04-21 11:59:09 +10:00
webadderall 337569739c fix(editor): port project save UX and clip cleanup to main 2026-04-21 11:46:07 +10:00
wiiiii123 fcccd1def6 fix(launch): use live HUD bounds after drag 2026-04-21 02:54:00 +07:00
wiiiii123 316c11035c fix(launch): keep HUD interactive after short drags 2026-04-21 02:25:56 +07:00
wiiiii123 a62972239b test(editor): expand auto clip guard coverage 2026-04-21 02:08:20 +07:00
wiiiii123 a6653a5144 fix(editor): preserve full-track duration growth 2026-04-21 01:43:13 +07:00
Ewazer c85031aede Fix: Update error messages for image upload failure 2026-04-20 15:58:06 +02:00
Ewazer 2d0c25e931 Update SettingsPanel.tsx 2026-04-20 14:40:36 +02:00
Rajul Ranga c3497a536b fix: improve video preview quality by deferring filter attachment
The video preview was noticeably blurry/pixelated because PixiJS filters were always attached to the video container, even when inactive (blur=0, no motion). This forced every frame through an intermediate RenderTexture at renderer resolution, downsampling the native video before it even reached the screen.

Now filters are only attached during active zoom transitions when the camera is actually moving, and detached as soon as it settles. Added hysteresis to the motion threshold to prevent filter toggling when intensity hovers near the boundary.
2026-04-20 17:23:37 +05:30
wiiiii123 4f739a058e fix(export): reopen saved videos and default to source quality 2026-04-19 21:42:06 +07: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 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 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