tonhowtf/omniget · error
No quality available
Error message
No quality available
What it means
During download, the code fetches video info and picks a quality: either the requested height (quality_height) or the first entry of available_qualities as a default. If the list is empty, .first() returns None and the code raises this error rather than downloading blindly. It means yt-dlp returned metadata containing no usable format entries.
Solutions
- Run yt-dlp manually (yt-dlp -F <url>) to see whether any formats are actually available.
- Update yt-dlp to the latest release — empty format lists are usually a YouTube extraction regression.
- For age-restricted content, supply cookies to yt-dlp and retry.
- Handle the error in callers by reporting 'no downloadable formats' to the user rather than retrying the same video.
Example fix
// caller-side guard
let info = get_media_info(url).await?;
if info.available_qualities.is_empty() {
return Err(anyhow!("video has no downloadable formats"));
}
download(url, Some(1080)).await?; Defensive patterns
Strategy: validation
Validate before calling
let info = get_media_info(url).await?;
if info.available_qualities.is_empty() {
return Err(anyhow!("no downloadable formats for {}", url));
} Type guard
fn has_qualities(info: &MediaInfo) -> bool { !info.available_qualities.is_empty() } Try / catch
match download(url, Some(1080)).await {
Err(e) if e.to_string() == "No quality available" => {
eprintln!("Video exposes no downloadable formats; try cookies or update yt-dlp");
}
r => r?,
} Prevention
- Keep yt-dlp updated — empty format lists usually mean an extraction regression
- Supply cookies for age-restricted or members-only videos
- Pre-check available_qualities before choosing a height
- Treat empty quality lists as 'video unavailable', not transient
When it happens
Trigger: Calling download on a video whose parsed info has an empty available_qualities list: formats-only/dash-limited videos, region-blocked or age-restricted videos where yt-dlp got metadata but no formats, or parse_video_info filtering out all formats (e.g. audio-only entries, height<=0).
Common situations: Age-restricted video without cookies; live stream currently offline; yt-dlp version too old for a recent YouTube throttling change so format extraction silently yields nothing; a private/deleted video where info parsing produced an empty quality list.
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
- yt-dlp falhou
- não achei nenhum vídeo nessa URL (Watch Later precisa da…
- No quality available
- Playlist empty or unavailable
- Livestreams not supported
AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12).
Data as JSON: /api/errors/d5f5cb7d6bac1479.
Report an issue: GitHub.
Appendix: source
Thrown at src-tauri/src/platforms/youtube/mod.rs:344
} else {
ytdlp::ensure_ytdlp().await?
};
let quality_height = opts
.quality
.as_deref()
.and_then(Self::extract_quality_height);
if info.media_type == MediaType::Playlist {
return self
.download_playlist(info, opts, progress, &ytdlp_path, quality_height)
.await;
}
let first = info
.available_qualities
.first()
.ok_or_else(|| anyhow!("No quality available"))?;
let selected = match quality_height {
Some(h) => info
.available_qualities
.iter()
.filter(|q| q.height > 0 && q.height <= h)
.max_by_key(|q| q.height)
.unwrap_or(first),
None => first,
};
let video_url = &selected.url;
ytdlp::download_video(
&ytdlp_path,
video_url,
&opts.output_dir,
quality_height,
progress,View on GitHub (pinned to 8600b91f42)