{"record":{"id":"bfdddf6cd954d1a5","repo":"tonhowtf/omniget","slug":"no-quality-available-mod","errorCode":null,"errorMessage":"No quality available","messagePattern":"No quality available","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src-tauri/src/platforms/vimeo/mod.rs","lineNumber":153,"sourceCode":"\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?;\n\n        let first = info\n            .available_qualities\n            .first()\n            .ok_or_else(|| anyhow!(\"No quality available\"))?;\n\n        let selected = if let Some(ref wanted) = opts.quality {\n            info.available_qualities\n                .iter()\n                .find(|q| q.label == *wanted)\n                .unwrap_or(first)\n        } else {\n            first\n        };\n\n        let quality_height = Self::extract_quality_height(&selected.label);\n        let video_url = &selected.url;\n\n        ytdlp::download_video(\n            &ytdlp_path,\n            video_url,\n            &opts.output_dir,\n            quality_height,","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/src/platforms/vimeo/mod.rs#L135-L171","documentation":"Thrown by VimeoDownloader::download when the parsed MediaInfo has an empty available_qualities list, so there is no default format ('first') to select from. It means yt-dlp returned video info but no downloadable quality entries could be derived from it.","triggerScenarios":"Calling download on a Vimeo URL where get_video_info succeeded but produced no formats: private/DRM-protected videos, videos restricted to authenticated or region-locked access, or yt-dlp output whose formats the quality parser could not map.","commonSituations":"Password-protected or private Vimeo links; Vimeo domain-restricted embeds; outdated yt-dlp that fails against current Vimeo page structure and yields no usable formats.","solutions":["Update yt-dlp to the latest version so current Vimeo formats are extracted.","Verify the Vimeo URL is public and playable in a browser.","Check the MediaInfo/available_qualities returned by get_media_info before calling download.","For private videos, supply credentials/cookies supported by yt-dlp.","Add a clearer upstream error if yt-dlp returns formats that fail quality parsing."],"exampleFix":"// before\nlet first = info.available_qualities.first().ok_or_else(|| anyhow!(\"No quality available\"))?;\n// after: surface diagnostics\nlet first = info.available_qualities.first().ok_or_else(|| {\n    anyhow!(\"No quality available for {} (raw formats: {:?})\", url, info.raw_formats)\n})?;","handlingStrategy":"type-guard","validationCode":"let info = downloader.get_media_info(&vimeo_url).await?;\nif info.available_qualities.is_empty() {\n    eprintln!(\"no downloadable qualities for {} — aborting before download()\", vimeo_url);\n}","typeGuard":"fn has_downloadable_quality(info: &MediaInfo) -> bool {\n    !info.available_qualities.is_empty()\n}","tryCatchPattern":"match downloader.download(&vimeo_url, &opts).await {\n    Err(e) if e.to_string().contains(\"No quality available\") => {\n        // refresh yt-dlp and re-fetch info; likely outdated format extraction\n        ytdlp::update().await?;\n        retry_download().await\n    }\n    other => other,\n}","preventionTips":["Call get_media_info first and check available_qualities is non-empty.","Keep yt-dlp updated — outdated versions extract zero usable Vimeo formats.","Confirm the Vimeo video is public and not password/domain restricted.","Pass an explicit opts.quality that exists in available_qualities.","Log raw yt-dlp format output when qualities come back empty."],"tags":["vimeo","quality","empty-list","ytdlp"],"backgroundTag":"empty-result-set","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"}