tonhowtf/omniget · error

FFmpeg not found. Install FFmpeg to download this format.

Error message

FFmpeg not found. Install FFmpeg to download this format.

What it means

This error is raised when yt-dlp's stderr indicates FFmpeg is missing: it matches 'ffmpeg' plus 'not found' or 'no such file'. yt-dlp requires FFmpeg for merging separate video/audio streams (DASH formats) and post-processing, so downloads of such formats fail without it.

Solutions

  1. Install FFmpeg (apt/brew/choco or download static build) and ensure it is on PATH
  2. Verify with `ffmpeg -version` in the same environment the app runs in
  3. Point the app/bundle to a valid ffmpeg binary path if configurable
  4. Update yt-dlp in Settings → Dependencies if the app manages dependencies

Example fix

// before
// download bestvideo+bestaudio without ffmpeg -> subprocess fails
// after
if lower.contains("ffmpeg") && (lower.contains("not found") || lower.contains("no such file")) {
    return anyhow!("FFmpeg not found. Install FFmpeg to download this format.");
}
Defensive patterns

Strategy: validation

Validate before calling

// ensure ffmpeg is resolvable before requesting merge formats
let ok = tokio::process::Command::new("ffmpeg").arg("-version").output().await.is_ok();
if !ok { eprintln!("FFmpeg missing; install it before downloading merged formats"); }

Try / catch

match result {
    Err(e) if e.to_string().contains("FFmpeg not found") => show_ffmpeg_install_dialog(),
    other => other?,
}

Prevention

When it happens

Trigger: Selecting a format that requires merging (separate video+audio, e.g. YouTube bestvideo+bestaudio) while the ffmpeg binary is absent from PATH or the configured location.

Common situations: Fresh installs where only yt-dlp was installed, Docker/minimal images without ffmpeg, Windows users who never added ffmpeg to PATH, or a bundled ffmpeg path that changed after an app update.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12). Data as JSON: /api/errors/1435094c5fcd8431. Report an issue: GitHub.

Appendix: source

Thrown at src-tauri/omniget-core/src/core/ytdlp.rs:4483

        );
    }
    if lower.contains("video unavailable") || lower.contains("not available") {
        return anyhow!("Video unavailable or removed.");
    }
    if lower.contains("private video") {
        return anyhow!("This video is private.");
    }
    if lower.contains("copyright") {
        return anyhow!("Video blocked due to copyright.");
    }
    if lower.contains("geo") && lower.contains("block") {
        return anyhow!("Video restricted in your region.");
    }
    if lower.contains("timed out") || lower.contains("timeout") {
        return anyhow!("Connection timed out. Check your internet and try again.");
    }
    if lower.contains("ffmpeg") && (lower.contains("not found") || lower.contains("no such file")) {
        return anyhow!("FFmpeg not found. Install FFmpeg to download this format.");
    }
    if lower.contains("unsupported url") || lower.contains("no suitable infojson") {
        return anyhow!("Unsupported URL. Check that the link is correct.");
    }
    if lower.contains("unable to download") && lower.contains("webpage") {
        return anyhow!("Failed to access the page. Check the link and your connection.");
    }
    if lower.contains("is not a valid url") || lower.contains("no video formats") {
        return anyhow!("No video formats found for this link.");
    }

    let last_error_line = stderr
        .lines()
        .rev()
        .find(|l| {
            let t = l.trim().to_lowercase();
            t.starts_with("error:") || t.starts_with("error ")
        })

View on GitHub (pinned to 8600b91f42)