tonhowtf/omniget · error

Vimeo requires yt-dlp. Failed to get yt-dlp: {}

Error message

Vimeo requires yt-dlp. Failed to get yt-dlp: {}

What it means

Vimeo's `get_media_info` (src-tauri/omniget-core/src/platforms/vimeo.rs:131) does not implement a native API path; it delegates entirely to an external `yt-dlp` binary obtained via `ytdlp::ensure_ytdlp()`. If that setup step fails (download of the binary fails, no network, Python missing, unsupported platform, etc.), the error is wrapped with this 'Vimeo requires yt-dlp' prefix so the user knows the external tool is mandatory.

Solutions

  1. Ensure network access to the yt-dlp release host (GitHub releases) or pre-install yt-dlp so ensure_ytdlp finds it on PATH.
  2. Manually install yt-dlp (pip install yt-dlp or package manager) and confirm `yt-dlp --version` runs from the shell.
  3. On Unix, chmod +x the yt-dlp binary if the downloaded executable lacks the permission bit.
  4. Update yt-dlp to the latest release — Vimeo extraction breaks often with old versions.
  5. Check disk space and antivirus/Defender logs if ensure_ytdlp's wrapped inner error indicates the download itself failed.

Example fix

// before: hard failure when yt-dlp can't be ensured
let ytdlp_path = ytdlp::ensure_ytdlp()
    .await
    .map_err(|e| anyhow!("Vimeo requires yt-dlp. Failed to get yt-dlp: {}", e))?;

// after: fall back to a system-installed yt-dlp
let ytdlp_path = match ytdlp::ensure_ytdlp().await {
    Ok(p) => p,
    Err(e) => ytdlp::find_system_ytdlp()
        .ok_or_else(|| anyhow!("Vimeo requires yt-dlp. Failed to get yt-dlp: {}", e))?,
};
Defensive patterns

Strategy: validation

Validate before calling

// Verify yt-dlp availability before calling any Vimeo API
let ytdlp_ready = tokio::process::Command::new("yt-dlp")
    .arg("--version")
    .output()
    .await
    .map(|o| o.status.success())
    .unwrap_or(false);
if !ytdlp_ready {
    eprintln!("yt-dlp missing or not executable — install it (pip install yt-dlp) before fetching Vimeo media");
}

Type guard

fn ytdlp_available(path: &std::path::Path) -> bool {
    path.exists() && {
        #[cfg(unix)]
        { std::os::unix::fs::PermissionsExt::mode(&path.metadata().unwrap().permissions()) & 0o111 != 0 }
        #[cfg(not(unix))]
        { path.is_file() }
    }
}

Try / catch

match vimeo.get_media_info(url).await {
    Ok(info) => use_media(info),
    Err(e) if e.to_string().starts_with("Vimeo requires yt-dlp") => {
        // install/repair yt-dlp, then retry once
        ytdlp::ensure_ytdlp().await.unwrap_or_else(|ie| {
            panic!("cannot auto-provision yt-dlp: {ie}; install manually");
        });
        retry_once(vimeo.get_media_info(url)).await
    }
    Err(e) => report(e),
}

Prevention

When it happens

Trigger: Any call to native_get_media_info with a Vimeo URL where ytdlp::ensure_ytdlp() fails: yt-dlp binary not present and auto-download blocked (offline, proxy, disk permissions), download URL unreachable, checksum/location invalid, or the binary is present but not executable.

Common situations: First run on an air-gapped or firewalled machine that can't download yt-dlp, antivirus quarantining the downloaded binary, Linux/macOS binary lacking +x permission, unsupported CPU/arch build, or a stale pinned yt-dlp version broken by a Vimeo page change.

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/37e64e568c181d6a. Report an issue: GitHub.

Appendix: source

Thrown at src-tauri/omniget-core/src/platforms/vimeo.rs:131

impl PlatformDownloader for VimeoDownloader {
    fn name(&self) -> &str {
        "vimeo"
    }

    fn can_handle(&self, url: &str) -> bool {
        if let Ok(parsed) = url::Url::parse(url) {
            if let Some(host) = parsed.host_str() {
                let host = host.to_lowercase();
                return host == "vimeo.com" || host.ends_with(".vimeo.com");
            }
        }
        false
    }

    async fn get_media_info(&self, url: &str) -> anyhow::Result<MediaInfo> {
        let ytdlp_path = ytdlp::ensure_ytdlp()
            .await
            .map_err(|e| anyhow!("Vimeo requires yt-dlp. Failed to get yt-dlp: {}", e))?;

        let json = ytdlp::get_video_info(&ytdlp_path, url, &[]).await?;
        Self::parse_video_info(&json)
    }

    async fn download(
        &self,
        info: &MediaInfo,
        opts: &DownloadOptions,
        progress: mpsc::Sender<ProgressUpdate>,
    ) -> anyhow::Result<DownloadResult> {
        let _ = progress.send(ProgressUpdate::percent(0.0)).await;

        let ytdlp_path = ytdlp::ensure_ytdlp().await?;

        let first = info
            .available_qualities
            .first()

View on GitHub (pinned to 8600b91f42)