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

  1. Run yt-dlp manually (yt-dlp -F <url>) to see whether any formats are actually available.
  2. Update yt-dlp to the latest release — empty format lists are usually a YouTube extraction regression.
  3. For age-restricted content, supply cookies to yt-dlp and retry.
  4. 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

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


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)