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
- Ensure network access to the yt-dlp release host (GitHub releases) or pre-install yt-dlp so ensure_ytdlp finds it on PATH.
- Manually install yt-dlp (pip install yt-dlp or package manager) and confirm `yt-dlp --version` runs from the shell.
- On Unix, chmod +x the yt-dlp binary if the downloaded executable lacks the permission bit.
- Update yt-dlp to the latest release — Vimeo extraction breaks often with old versions.
- 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
- Pre-install yt-dlp on the machine (pip install yt-dlp) instead of relying on first-run auto-download.
- Allow network egress to GitHub releases so ensure_ytdlp can download/update the binary.
- Ensure the yt-dlp binary has execute permission on Unix (chmod +x).
- Exclude the binary location from antivirus quarantine rules.
- Keep yt-dlp updated — Vimeo extraction breaks with stale versions.
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
- o yt-dlp devolveu um JSON que não deu para ler: {e}
- o yt-dlp não está disponível: {e}
- não foi possível iniciar o yt-dlp: {e}
- vimeo:{code}
- {}
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)