3779 Commits

Author SHA1 Message Date
Mikael Finstad e1f4348637 enable appimage artifact 2026-08-21 11:03:12 +02:00
Claude 9820b32856 Detect missing source file when extracting frames and tracks too
Follow-up to #2797. `cutMultiple` already calls `assertFileExists` before
spawning ffmpeg, so a source file that was moved or deleted after being
opened produces a clear "Source file no longer exists or is not
accessible" message instead of a raw ExecaError plus the generic "Unable
to export this file" checklist (change output format, try keyframe cut,
change working directory...), none of which can help.

The other export paths had no such guard, so they still fail with a bare
ffmpeg "No such file or directory". Add the same check to:

- `captureFramesRange` (export segment frames as images)
- `captureFrameFromFfmpeg` (capture snapshot)
- `extractStreams` (extract all tracks / extract single track)

`extractAllStreams`/`extractSingleStream` swallowed the error message and
showed a generic toast, so let UserFacingError through there as well,
matching how the export and merge flows already handle it.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqUn6Bh7hWqPqWejqR8p7u
2026-08-19 21:07:48 +02:00
Claude 20c6b9ea62 Only pass muxer private options to the muxer they belong to
`-movflags` (mov/mp4 family) and `-default_mode` (matroska family) were
added to every ffmpeg command regardless of the output format, so e.g.
exporting to matroska produced:

    ... -movflags "+faststart" -default_mode infer_no_subs -f matroska ...

ffmpeg tolerates private options belonging to a different muxer, so this
was harmless, but it adds noise to the command line we log, show under
"Last commands" and include in problem reports, which makes
troubleshooting harder than it needs to be.

Gate each set of flags on the output format. The format lists are derived
from ffmpeg's movenc.c and matroskaenc.c rather than the existing
util/streams.ts `isMov`/`isMatroska` helpers, because those are narrower
UI oriented lists that omit movenc formats we can output (3gp, 3g2, f4v,
psp) - reusing them would have silently dropped +faststart for those.

When the output format is unknown, ffmpeg infers the muxer from the file
extension, so the flags are kept as before.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqUn6Bh7hWqPqWejqR8p7u
2026-08-19 21:07:48 +02:00
Claude 1c3f75be36 Revert snap base to electron-builder's default
Setting `base: core22` left the snap declaring a core22 base while still
plugging the core18-era gnome-3-28-1804 content snap for its GNOME platform.
Mesa's DRI drivers in that platform cannot resolve their dependencies against
core22, so every GL/EGL path fails including the swrast software fallback, the
GPU process exits, and the main process segfaults before a window appears.

The base override never moved the platform. electron-builder's snap template
pairs `base: core20` with a hardcoded `gnome-3-28-1804` plug, and its legacy
snap path rewrites only the `base` field, leaving the plugs block untouched.
The two halves have to match, so the fix is to stop overriding the base and
let the template stay self-consistent.

Dropping the key rather than pinning core20 explicitly means the snap keeps
following whatever electron-builder's template ships.

This restores the pre-3.68 behaviour, which reopens #2614 for very new GPUs
whose hardware needs a newer Mesa than the platform provides. That trade is
deliberate: #2614 affected some GPUs, this affects every user.

Fixes #3002

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KboMatXCuTgjD6KfC1ik12
2026-08-19 20:53:36 +02:00
Claude 631572910e Build AppImage with the static (libfuse2-free) runtime
electron-builder's default AppImage toolset ("0.0.0") uses the legacy
AppImageKit runtime, which dlopens libfuse.so.2 at startup and fails on
distros that no longer ship libfuse2.

Opting into toolset appimage 1.0.3 uses AppImage/type2-runtime 20251108,
a static-pie runtime with libfuse/squashfuse linked in, so the AppImage
runs without any FUSE packages installed.

Fixes #3022

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmsuZZPx6pFKSjN6UZmGcJ
2026-08-19 20:44:43 +02:00
dependabot[bot] 08bcf877d9 Bump js-yaml from 4.3.0 to 4.3.1
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.3.0 to 4.3.1.
- [Changelog](https://github.com/nodeca/js-yaml/blob/4.3.1/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.3.0...4.3.1)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.3.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-15 00:07:17 +02:00
Mikael Finstad 3b9a59c288 Revise Linux installation details in README
remove flathub because not maintained by me
2026-08-07 18:14:52 +02:00
dependabot[bot] 2085739660 Bump undici from 6.27.0 to 6.28.0
Bumps [undici](https://github.com/nodejs/undici) from 6.27.0 to 6.28.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.27.0...v6.28.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 6.28.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-04 12:31:55 +02:00
dependabot[bot] 2271c18fff Bump fast-uri from 3.1.4 to 3.1.5
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.4 to 3.1.5.
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.4...v3.1.5)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-04 12:31:44 +02:00
dependabot[bot] 8279200c33 Bump ip-address from 10.2.0 to 10.4.0
Bumps [ip-address](https://github.com/beaugunderson/ip-address) from 10.2.0 to 10.4.0.
- [Release notes](https://github.com/beaugunderson/ip-address/releases)
- [Commits](https://github.com/beaugunderson/ip-address/compare/v10.2.0...v10.4.0)

---
updated-dependencies:
- dependency-name: ip-address
  dependency-version: 10.4.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-04 02:46:16 +02:00
Mikael Finstad d14422c91b Update LosslessCut link in README 2026-08-03 15:34:08 +02:00
Claude d7e2ecd042 fail fast in startup check when ffmpeg executable is missing
On Windows, when the ffmpeg/ffprobe executable does not exist (e.g. a
custom FFmpeg directory pointing to a location without ffmpeg.exe),
cross-spawn (used by execa) falls back to running the command through
cmd.exe, which fails with exit code 1 and a confusing
"'...' is not recognized as an internal or external command" error
instead of ENOENT. This bypassed the "FFmpeg executable not found"
dialog and instead triggered the error report dialog.

Now check that the executables exist as part of the startup check
(which also re-runs whenever the custom FFmpeg directory setting
changes), so a missing executable yields a proper ENOENT. Also mention
the custom FFmpeg directory setting in the error dialog when one is
configured.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PE6aFnysh85Ryndeu6zXYG
2026-08-02 23:54:28 +02:00
Mikael Finstad 260802b810 update contributing 2026-08-02 22:35:09 +02:00
Mikael Finstad 260802195b add doc about hardening 2026-08-02 21:36:24 +02:00
Mikael Finstad 2608023489 harden http server 2026-08-02 21:32:53 +02:00
Claude b0eb2b980e Use runner.arch instead of runner image names in Windows conditions
Gating steps on the exact matrix image name (windows-latest,
windows-11-arm) breaks silently whenever the image in the matrix is
renamed, as happened with the windows-2022 switch. runner.os and
runner.arch describe what we actually care about and are independent
of the image label.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PWvFPqUcXUzsYf3DY7RziJ
2026-07-29 20:26:00 +02:00
Claude 7da03ebdad Fix skipped Windows x64 build steps after windows-2022 matrix change
The matrix was switched from windows-latest to windows-2022, but the
Windows x64 ffmpeg download, electron-builder, e2e and screenshot upload
steps were still gated on matrix.os == 'windows-latest', so they never
ran and the artifact upload failed with
'File dist/LosslessCut-win-x64.7z does not exist'.

Gate them on runner.os == 'Windows' && matrix.os != 'windows-11-arm'
instead, so they are independent of the exact Windows runner image.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PWvFPqUcXUzsYf3DY7RziJ
2026-07-29 20:26:00 +02:00
slrslr a2f7bc61b2 Translated using Weblate (Czech)
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/cs/
2026-07-29 00:52:34 +02:00
Pa Di 0d93075ec3 Translated using Weblate (Slovak)
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/sk/
2026-07-29 00:52:34 +02:00
slrslr 3cb8ebf0df Translated using Weblate (Czech)
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/cs/
2026-07-29 00:52:34 +02:00
Hosted Weblate user 54392 26c84882b9 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 96.1% (871 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/zh_Hans/
2026-07-29 00:52:34 +02:00
Roland Reck 85874a2af5 Translated using Weblate (German)
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/de/
2026-07-29 00:52:34 +02:00
John Fowler 7222a65099 Translated using Weblate (Hungarian)
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/hu/
2026-07-29 00:52:34 +02:00
slrslr e925feff89 Translated using Weblate (Czech)
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/cs/
2026-07-29 00:52:34 +02:00
Igor Rückert 88c89137ef Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/pt_BR/
2026-07-29 00:52:34 +02:00
Oğuz Ersen 7d7c43652d Translated using Weblate (Turkish)
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/tr/
2026-07-29 00:52:34 +02:00
bovirus 34f52f9f98 Translated using Weblate (Italian)
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/it/
2026-07-29 00:52:34 +02:00
Hosted Weblate user 54392 49dc0bf408 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 96.1% (871 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/zh_Hans/
2026-07-29 00:52:34 +02:00
Kuzmich55 7a436ed588 Translated using Weblate (Russian)
Currently translated at 100.0% (906 of 906 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/ru/
2026-07-29 00:52:34 +02:00
Ngo Lam Bao An 52d7e01bdc Translated using Weblate (Vietnamese)
Currently translated at 76.1% (689 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/vi/
2026-07-29 00:52:34 +02:00
JaeHyung Lee f6668bede9 Translated using Weblate (Korean)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/ko/
2026-07-29 00:52:34 +02:00
Kuzmich55 fbd6efbd4c Translated using Weblate (Russian)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/ru/
2026-07-29 00:52:34 +02:00
John Fowler dc474f4708 Translated using Weblate (Hungarian)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/hu/
2026-07-29 00:52:34 +02:00
bovirus 7d60c4783f Translated using Weblate (Italian)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/it/
2026-07-29 00:52:34 +02:00
slrslr fffb37f2d9 Translated using Weblate (Czech)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/cs/
2026-07-29 00:52:34 +02:00
Ahadiat Lamid 155966507b Translated using Weblate (Indonesian)
Currently translated at 97.5% (883 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/id/
2026-07-29 00:52:34 +02:00
Oğuz Ersen 2423500e17 Translated using Weblate (Turkish)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/tr/
2026-07-29 00:52:34 +02:00
JaeHyung Lee 8d49edbab1 Translated using Weblate (Korean)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/ko/
2026-07-29 00:52:34 +02:00
ssantos 5c16bdb314 Translated using Weblate (Portuguese)
Currently translated at 96.3% (872 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/pt/
2026-07-29 00:52:34 +02:00
bovirus ccb407ddec Translated using Weblate (Italian)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/it/
2026-07-29 00:52:34 +02:00
Hotripak 6f07a8a65c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/uk/
2026-07-29 00:52:34 +02:00
Kuzmich55 0e8b365c80 Translated using Weblate (Russian)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/ru/
2026-07-29 00:52:34 +02:00
John Fowler c6951ae97f Translated using Weblate (Hungarian)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/hu/
2026-07-29 00:52:34 +02:00
slrslr 191adfe6df Translated using Weblate (Czech)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/cs/
2026-07-29 00:52:34 +02:00
Igor Rückert 26951ea115 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/pt_BR/
2026-07-29 00:52:34 +02:00
JaeHyung Lee 79a64f407e Translated using Weblate (Korean)
Currently translated at 99.7% (903 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/ko/
2026-07-29 00:52:34 +02:00
Mr-Update f00ceecc86 Translated using Weblate (German)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/de/
2026-07-29 00:52:34 +02:00
Matthias 1a91d270a4 Translated using Weblate (German)
Currently translated at 100.0% (905 of 905 strings)

Translation: LosslessCut/LosslessCut
Translate-URL: https://hosted.weblate.org/projects/losslesscut/losslesscut/de/
2026-07-29 00:52:34 +02:00
Mikael Finstad 2607294bed dedupe 2026-07-29 00:51:17 +02:00
Chris Rode 25900d146d Fix invalid character range in filename sanitizer 2026-07-29 00:50:59 +02:00