tonhowtf/omniget · error · anyhow::Error
No quality available
Error message
No quality available
What it means
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.
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.
Example fix
// before
let first = info.available_qualities.first().ok_or_else(|| anyhow!("No quality available"))?;
// after: surface diagnostics
let first = info.available_qualities.first().ok_or_else(|| {
anyhow!("No quality available for {} (raw formats: {:?})", url, info.raw_formats)
})?; Defensive patterns
Strategy: type-guard
Validate before calling
let info = downloader.get_media_info(&vimeo_url).await?;
if info.available_qualities.is_empty() {
eprintln!("no downloadable qualities for {} — aborting before download()", vimeo_url);
} Type guard
fn has_downloadable_quality(info: &MediaInfo) -> bool {
!info.available_qualities.is_empty()
} Try / catch
match downloader.download(&vimeo_url, &opts).await {
Err(e) if e.to_string().contains("No quality available") => {
// refresh yt-dlp and re-fetch info; likely outdated format extraction
ytdlp::update().await?;
retry_download().await
}
other => other,
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.
Related errors
- Vimeo requer yt-dlp para funcionar. Falha ao obter yt-dlp
- Playlist empty or unavailable
- Track sem metadata pra resolver no YouTube
- nenhuma publicação válida na lista
- o yt-dlp não está disponível
AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12).
Data as JSON: /api/errors/bfdddf6cd954d1a5.
Report an issue: GitHub.
Appendix: source
Thrown at src-tauri/src/platforms/vimeo/mod.rs:153
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()
.ok_or_else(|| anyhow!("No quality available"))?;
let selected = if let Some(ref wanted) = opts.quality {
info.available_qualities
.iter()
.find(|q| q.label == *wanted)
.unwrap_or(first)
} else {
first
};
let quality_height = Self::extract_quality_height(&selected.label);
let video_url = &selected.url;
ytdlp::download_video(
&ytdlp_path,
video_url,
&opts.output_dir,
quality_height,View on GitHub (pinned to 8600b91f42)