From 301c8998bfdcac80ad3302e2d2ebe853e2ea6de1 Mon Sep 17 00:00:00 2001 From: Christophe Besson Date: Sat, 5 Sep 2026 08:43:11 +0200 Subject: feat(packaging): bundle ffmpeg in the Windows installer by default winget install ffmpeg was considered and rejected as the mechanism: it needs network access and winget/App Installer present at the exact moment setup runs, and its failure mode is silent -- video just does not stream, with nothing pointing back at ffmpeg. Not viable for a non-technical install. MeshBay transcodes browser-incompatible video to H.264 (-c:v libx264, webrtc_server.py) -- a real encode, not remux -- so this needs a genuine GPL ffmpeg build; no LGPL-only build includes an H.264 encoder, since libx264 itself is GPL. packaging/win/fetch-ffmpeg.ps1 (new) Downloads, checksum-verifies and stages ffmpeg for the build. Source: BtbN/FFmpeg-Builds' Windows x86_64 gpl-shared preset -- shared DLLs rather than two independent static binaries, which is what nearly tripled this: the "full" static build many devs already have via winget is ~220 MB *per executable*. Pinned to one dated release tag (immutable once published) and its own sha256, not the "latest" alias BtbN repoints on every auto-build -- verified by hand first (downloaded, hash matched, ran a real encode+probe with libx264) before pinning. ffplay.exe (an SDL2 player, ~17 MB) is dropped; MeshBay never invokes it. Cached after the first build. Runs its own smoke test (encode + probe a real clip) so a broken fetch fails at build time, not for the first user who tries to watch something. packaging/win/LICENSE-ffmpeg.txt (new) GPLv3 notice + where the corresponding source is, required because this redistributes a GPL binary even though it is unmodified and only ever invoked as a subprocess. Ships alongside ffmpeg.exe in the installer. build-node-runtime.ps1 / build-win.ps1 Bundling is now the DEFAULT, replacing the old opt-in -FfmpegDir (which copied from a local directory and left most builds without ffmpeg at all). -SkipFfmpeg opts out for a smaller, streaming-less local-iteration build. Also fixes a real bug the ffmpeg change exposed rather than caused: the final `--help` smoke test did `$help -notmatch "meshbay-node"` against $help captured as a PowerShell ARRAY (one element per line) -- -notmatch on a collection is a FILTER, not a boolean test, and returns the non-matching elements; any non-empty array is truthy in if() regardless of content. Once --help wrapped past one line (it now does, with autostart/service in the verb list) this threw unconditionally. Fixed by joining to one string before matching, and pinned by a new test so a future edit cannot silently reintroduce the collection-vs-scalar trap. Verified: downloaded and hashed the pinned release by hand (matches), ran a real libx264 encode + ffprobe against the extracted build, fetch-ffmpeg.ps1 end to end (161 MB staged), a full build-node-runtime.ps1 run (308 MB node-runtime/) and a full installer build (MeshBay-Setup- 1.0.0.exe, 210.8 MB with ffmpeg bundled). Node suite 850 pass / 25 skip. Co-Authored-By: Claude Sonnet 5 --- packaging/win/build-win.ps1 | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'packaging/win/build-win.ps1') diff --git a/packaging/win/build-win.ps1 b/packaging/win/build-win.ps1 index 4784071..0a30ad5 100644 --- a/packaging/win/build-win.ps1 +++ b/packaging/win/build-win.ps1 @@ -18,9 +18,10 @@ 5. build-node-runtime.ps1 (PyInstaller freeze of the daemon) 6. electron-builder --win nsis -.PARAMETER FfmpegDir - Passed through to build-node-runtime.ps1 -- directory with ffmpeg.exe / - ffprobe.exe to bundle. Optional; without it the node uses PATH. +.PARAMETER SkipFfmpeg + Passed through to build-node-runtime.ps1 -- skip bundling ffmpeg (fetched + and verified by default; see fetch-ffmpeg.ps1). Smaller, streaming-less + build for local iteration only. .PARAMETER NoElectronBump Keep the pinned Electron instead of upgrading to the latest release. @@ -31,7 +32,7 @@ #> [CmdletBinding()] param( - [string]$FfmpegDir = $env:MESHBAY_FFMPEG_DIR, + [switch]$SkipFfmpeg, [switch]$NoElectronBump, [switch]$SkipNodeRuntime ) @@ -90,7 +91,7 @@ try { } else { Step "building the bundled node (PyInstaller)" $rtArgs = @{} - if ($FfmpegDir) { $rtArgs["FfmpegDir"] = $FfmpegDir } + if ($SkipFfmpeg) { $rtArgs["SkipFfmpeg"] = $true } & (Join-Path $WinDir "build-node-runtime.ps1") @rtArgs if ($LASTEXITCODE -ne 0) { throw "build-node-runtime.ps1 failed" } } -- cgit v1.2.3