tonhowtf/omniget · error

yt-dlp not found — install it in Settings

Error message

yt-dlp not found — install it in Settings

What it means

get_media_info_via_ytdlp delegates fetching to an external yt-dlp binary located via find_ytdlp_cached(). When no yt-dlp executable can be found on disk or in PATH, this error is thrown, telling the user to install it through the app's Settings screen.

Solutions

  1. Install yt-dlp from the app's Settings screen.
  2. Install yt-dlp manually (pip install yt-dlp or download the binary) and ensure it is on PATH.
  3. Point the app's ytdlp_path setting to an explicit yt-dlp executable location.
  4. Restart the app to refresh the cached lookup if yt-dlp was just installed.

Example fix

// before
let ytdlp_path = crate::core::ytdlp::find_ytdlp_cached()
    .await
    .ok_or_else(|| anyhow!("yt-dlp not found — install it in Settings"))?;
// after
let ytdlp_path = opts.ytdlp_path.clone()
    .or_else(crate::core::ytdlp::find_ytdlp_cached().await)
    .ok_or_else(|| anyhow!("yt-dlp not found — install it in Settings or set a custom path"))?;
Defensive patterns

Strategy: validation

Validate before calling

// Check availability before relying on the yt-dlp path
if crate::core::ytdlp::find_ytdlp_cached().await.is_none() {
    eprintln!("yt-dlp missing: install via Settings or PATH");
}

Try / catch

match get_media_info(url).await {
    Err(e) if e.to_string().contains("yt-dlp not found") => prompt_ytdlp_install(),
    other => other,
}

Prevention

When it happens

Trigger: Calling get_media_info which falls back to get_media_info_via_ytdlp when the native scraper fails, while opts/settings have no configured yt-dlp path and find_ytdlp_cached() finds no installed binary.

Common situations: Fresh install without yt-dlp; yt-dlp removed from PATH; corrupted download of the bundled binary; native TikTok scraper failed (blocked) so the fallback runs.

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/4693f8b82f32c47b. Report an issue: GitHub.

Appendix: source

Thrown at src-tauri/src/platforms/tiktok/mod.rs:320

        ];
        let json = crate::core::ytdlp::get_video_info(&ytdlp_path, url, &extra_flags).await?;
        let mut info =
            crate::platforms::generic_ytdlp::GenericYtdlpDownloader::parse_video_info(&json)?;
        for q in &mut info.available_qualities {
            q.url = url.to_string();
            q.format = "ytdlp".to_string();
        }
        Ok(info)
    }

    async fn get_media_info_via_ytdlp(
        &self,
        url: &str,
        post_id: &str,
    ) -> anyhow::Result<MediaInfo> {
        let ytdlp_path = crate::core::ytdlp::find_ytdlp_cached()
            .await
            .ok_or_else(|| anyhow!("yt-dlp not found — install it in Settings"))?;

        let extra_flags = vec![
            "--referer".to_string(),
            "https://www.tiktok.com/".to_string(),
        ];

        let json = crate::core::ytdlp::get_video_info(&ytdlp_path, url, &extra_flags).await?;

        let title = json
            .get("title")
            .and_then(|v| v.as_str())
            .map(|s| format!("tiktok_{}", sanitize_filename::sanitize(s)))
            .unwrap_or_else(|| format!("tiktok_{}", post_id));

        let author = json
            .get("uploader")
            .or_else(|| json.get("creator"))
            .and_then(|v| v.as_str())

View on GitHub (pinned to 8600b91f42)