{"record":{"id":"6d31ac04186af7ea","repo":"tonhowtf/omniget","slug":"vimeo-requer-yt-dlp-para-funcionar-falha-ao-obter-yt-dlp","errorCode":null,"errorMessage":"Vimeo requer yt-dlp para funcionar. Falha ao obter yt-dlp: {}","messagePattern":"Vimeo requer yt-dlp para funcionar\\. Falha ao obter yt-dlp: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src-tauri/src/platforms/vimeo/mod.rs","lineNumber":130,"sourceCode":"#[async_trait]\nimpl PlatformDownloader for VimeoDownloader {\n    fn name(&self) -> &str {\n        \"vimeo\"\n    }\n\n    fn can_handle(&self, url: &str) -> bool {\n        if let Ok(parsed) = url::Url::parse(url) {\n            if let Some(host) = parsed.host_str() {\n                let host = host.to_lowercase();\n                return host == \"vimeo.com\" || host.ends_with(\".vimeo.com\");\n            }\n        }\n        false\n    }\n\n    async fn get_media_info(&self, url: &str) -> anyhow::Result<MediaInfo> {\n        let ytdlp_path = ytdlp::ensure_ytdlp().await.map_err(|e| {\n            anyhow!(\n                \"Vimeo requer yt-dlp para funcionar. Falha ao obter yt-dlp: {}\",\n                e\n            )\n        })?;\n\n        let json = ytdlp::get_video_info(&ytdlp_path, url, &[]).await?;\n        Self::parse_video_info(&json)\n    }\n\n    async fn download(\n        &self,\n        info: &MediaInfo,\n        opts: &DownloadOptions,\n        progress: mpsc::Sender<ProgressUpdate>,\n    ) -> anyhow::Result<DownloadResult> {\n        let _ = progress.send(ProgressUpdate::percent(0.0)).await;\n\n        let ytdlp_path = ytdlp::ensure_ytdlp().await?;","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/src/platforms/vimeo/mod.rs#L112-L148","documentation":"Thrown by VimeoDownloader::get_media_info when ytdlp::ensure_ytdlp() fails, i.e. the yt-dlp binary could not be located or downloaded. Vimeo support in this codebase is implemented exclusively through yt-dlp, so without the binary Vimeo extraction cannot proceed. The original ensure_ytdlp error is embedded in the message.","triggerScenarios":"Calling get_media_info (or download) on a Vimeo URL when ensure_ytdlp fails: the binary is not installed, not on PATH, the auto-download fails (no network, no write permission to the target directory), or the downloaded binary cannot be executed.","commonSituations":"Fresh installs where yt-dlp hasn't been downloaded yet and the machine is offline; restricted install directories (no write permission); antivirus/OS blocking the downloaded binary; unsupported platform/arch.","solutions":["Install yt-dlp manually and make sure it is on PATH (pip install yt-dlp or the official installer).","Check the embedded cause in the message ('Falha ao obter yt-dlp: {}') for the concrete failure (download error, permission denied, etc.).","Ensure network access if the app must auto-download yt-dlp.","Verify the app has write permission to the directory where yt-dlp is stored.","Upgrade the app if the platform is unsupported by the bundled downloader."],"exampleFix":"// before: propagate opaque ensure_ytdlp failure\nlet ytdlp_path = ytdlp::ensure_ytdlp().await.map_err(|e| {\n    anyhow!(\"Vimeo requer yt-dlp para funcionar. Falha ao obter yt-dlp: {}\", e)\n})?;\n// after: check a user-provided binary first\nlet ytdlp_path = match std::env::var_os(\"YTDLP_PATH\") {\n    Some(p) => std::path::PathBuf::from(p),\n    None => ytdlp::ensure_ytdlp().await.map_err(|e| {\n        anyhow!(\"Vimeo requer yt-dlp para funcionar. Falha ao obter yt-dlp: {}\", e)\n    })?,\n};","handlingStrategy":"validation","validationCode":"// verify yt-dlp availability before attempting Vimeo extraction\nmatch ytdlp::ensure_ytdlp().await {\n    Ok(path) => println!(\"yt-dlp ready at {:?}\", path),\n    Err(e) => eprintln!(\"set up yt-dlp first: {}\", e),\n}","typeGuard":"fn ytdlp_available(path: &std::path::Path) -> bool {\n    path.exists() && std::fs::metadata(path).map(|m| m.len() > 0).unwrap_or(false)\n}","tryCatchPattern":"match downloader.get_media_info(&vimeo_url).await {\n    Err(e) if e.to_string().contains(\"requer yt-dlp\") => {\n        // guide the user to install yt-dlp or set YTDLP_PATH, then retry\n        prompt_ytdlp_install();\n    }\n    other => other,\n}","preventionTips":["Install yt-dlp and keep it on PATH during app setup.","Check the app can write to its yt-dlp storage directory (permissions).","Run the first launch online so auto-download can complete.","Pin and update yt-dlp versions in CI/release checklists.","Support a user-configurable yt-dlp path (env var or setting)."],"tags":["dependency","ytdlp","vimeo","setup"],"backgroundTag":"missing-dependency","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}