Repository navigation
fix: make libvorbis optional so FFmpeg setup stops failing on Macs - #829
Merged
Merged
Conversation
… Intel Macs - REQUIRED_FFMPEG_ENCODERS is now pcm_s16le, flac, libmp3lame, aac. libvorbis moves to OPTIONAL_FFMPEG_ENCODERS: only OGG export uses it, and neither the shaka-project primary nor Homebrew's plain ffmpeg has it, so every fresh Mac failed first launch. - macOS installed-pair search per architecture: Apple Silicon /opt/homebrew/bin, /opt/homebrew/opt/ffmpeg-full/bin, /usr/local/bin, /opt/local/bin; Intel /usr/local/bin, /usr/local/opt/ffmpeg-full/bin, /opt/local/bin; then PATH. A pair with libvorbis wins over one without. - Download sources come from one pure function; the evermeet fallback only where its Intel build can run. Each source is staged on its own. - Errors say whether the server was reached (HTTP 429 and other HTTP errors named, with the URL) or the binary was rejected, and end with the next step (brew install ffmpeg, ffmpeg-full for OGG, STEMDECK_FFMPEG). curl runs with --silent so no progress meter lands in the message. - Windows and Linux: a system FFmpeg on PATH still has to include libvorbis to win over the download, as before. - The macOS decision functions build under test on every host.
…t libvorbis
- app/pipeline/audio_encoders.py: one probe of `ffmpeg -encoders`, cached
against ffmpeg_identity(), maps wav/mp3/flac/ogg to their encoders.
Unknown (no ffmpeg, failed listing) is null, not "unavailable".
- /api/health gains export_formats: {wav, mp3, flac, ogg: bool} or null.
Booleans only, no path.
- mixdown.<ext> and stems/all.zip answer 422 with an actionable message
when the ffmpeg lacks the format's encoder, after the job checks (an
unknown job still 404s) and before any render or archive starts.
- Tests: the five OGG renders skip with a reason when libvorbis is
absent (skip_without_vorbis); new tests cover the parser, the cache,
the health field and the refused exports on any machine.
- The export menu reads export_formats from /api/health. With ogg false the OGG button stays visible but aria-disabled, with a tooltip and a line in the menu giving the reason. A click does nothing, and a selected OGG falls back to WAV. Unknown leaves OGG offered. - New string export.oggUnavailable and an extended help.exportFormat Guide sentence in all ten tables (and the pt-PT variant). - tests/e2e/export-ogg.spec.mjs: disabled with its reason without libvorbis, enabled with it, offered when unknown. stubExportFormats in helpers.mjs fixes the capability; spec-map.json maps the new module. Closes #824
The candidate-path test now runs on Linux and Windows too, and the test module only imported env on macOS, so those test targets did not compile.
On Windows ffprobe_beside looks for ffprobe.exe, so the test wrote a file the code never read.
thcp
marked this pull request as ready for review
October 21, 2026 23:17
thcp
added a commit
that referenced
this pull request
Oct 22, 2026
…g-release (#836) Closes #835 ## What changed - **PR to `main`, push to `main`, release:** full suite, as before. - **PR to any other base:** smoke + changed specs + mapped specs. A hub module (former `full` source entries: `main.js`, `state.js`, `mixer.js`, `catalog.js`, `index.html`, `app/api/jobs.py`, `stems.py`, `app/core/**`, ...) or an unmapped file under `static/` or `app/` now adds a fixed **core set** (17 specs) instead of everything. `uv.lock` and `pyproject.toml` add core too. - **Full suite on a non-main PR** only for a change to how the suite runs: `playwright.config.mjs`, `tests/e2e/helpers*`, `serve.sh`, `seed.py`, `package*.json`, the three e2e workflows, the selector, `spec-map.json`, or unmapped code under `tests/e2e/`. - **New `e2e-full.yml`:** full suite on every push to `big-release`, nightly (04:17 UTC) on `big-release`, and `workflow_dispatch` with a `ref` input. - **New reusable `e2e.yml`** (`workflow_call`, inputs `mode`, `base-ref`, `checkout-ref`) holds the steps once. Same pinned SHAs, `permissions: {}`, no secrets. - **Concurrency:** a new push to a PR cancels that PR's older e2e run. Pushes, releases, nightly and manual runs are never cancelled. `timeout-minutes: 30` per shard. ## What did not change - Application code, specs, `uv.lock`, package files. Three shards, `--pass-with-no-tests`. - Check names gain a prefix: `frontend-e2e / frontend-e2e (1)` to `(3)`. A reusable workflow always prefixes the caller job. No branch protection or ruleset requires these names today (checked). ## Real diffs, before and after | Diff | Files | Before | After | |---|---|---|---| | #806 (queue.js, catalog.js) | 5 | FULL 105 | 30 (core), includes queue-progress | | #820 | 7 | FULL 105 | 59 (core) | | #821 | 2 | 47 | 47 | | #823 | 8 | 5 | 5 | | #828 (uv.lock) | 4 | 5 | 22 (core) | | #819, #830, #831 | 7 to 19 | FULL 105 | FULL 105 (edit `spec-map.json`) | | #829 | 19 | FULL 105 | FULL 105 (edits `helpers.mjs`) | | #822 | 33 | FULL 105 | FULL 105 (edits `seed.py`) | | `main...big-release` | 331 | FULL | FULL (PR to main) | `npx playwright test --list <selected>` matches the selector exactly for #806 (30 files, 200 tests) and #820 (59 files, 465 tests). Full suite: 724 tests in 105 files. Core + smoke alone: 159 tests in 22 files. ## Trade-off A non-main PR can pass while a spec outside its core and mapped sets breaks. The push to `big-release` run catches it on the merge commit, minutes later. ## Limits - **The nightly schedule only starts once `e2e-full.yml` reaches `main`.** GitHub runs scheduled workflows from the default branch, and the job checks out `big-release` explicitly for that reason. - Neither concurrency nor the timeout helps a hosted runner GitHub never assigns (queue time does not count toward the timeout). Fix by hand: re-run the job, or `gh run cancel <id>` then `gh run rerun <id> --failed`. - This PR changes `ci.yml`, so its own CI runs the full suite. Expected.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #824
Product change (flagged)
mixdown.ogg,stems/all.zip?format=ogg) answers 422 with an actionable message, no render started.What changed
REQUIRED_FFMPEG_ENCODERS= pcm_s16le, flac, libmp3lame, aac. libvorbis moves toOPTIONAL_FFMPEG_ENCODERS.app/pipeline/audio_encoders.pyprobesffmpeg -encodersonce per binary (cached onffmpeg_identity())./api/healthgainsexport_formats:{"wav","mp3","flac","ogg": bool}ornullwhen unknown. No paths.--silent, so no progress meter in the message.brew install ffmpeg,ffmpeg-fullfor OGG,STEMDECK_FFMPEG, Rosetta where relevant.help.exportFormatmentions the greyed-out OGG, all ten tables plus pt-PT.New macOS order (Apple Silicon and Intel)
STEMDECK_FFMPEG(error if it fails).STEMDECK_FFMPEG_URLskips step 3 and downloads only from that URL./opt/homebrew/bin,/opt/homebrew/opt/ffmpeg-full/bin,/usr/local/bin,/opt/local/bin, PATH. Intel-only binaries skipped./usr/local/bin,/usr/local/opt/ffmpeg-full/bin,/opt/local/bin, PATH.What did not change
uv.lockuntouched, runtime id unchanged. No new dependencies.Risks
ffmpeg-fulland delete the data-folder pair. Setup does not re-run once a pair passes./usr/local/bin, MacPorts).Checks (macOS arm64, ffmpeg 9.0.2 without libvorbis)
cargo fmt --check,cargo test(179 passed), clippy with the macos-check flags: pass.clippy --tests -D warnings: only the 4 existing errors.export-ogg(new),export-menu,help-modepass. Local full suite: 690 passed, 11 failed. Every failure passes on rerun or also fails on plain big-release (trash-restore x3, footer-time, karaoke, grid-value-box). PR CI e2e shards: green.ogg: false, WAV/MP3/FLAC mixdowns and the MP3 zip export, OGG returns 422.Not tested
/usr/local/bin, and the Rosetta cases. The decision logic is unit-tested for each.