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

  1. Update yt-dlp to the latest version so current Vimeo formats are extracted.
  2. Verify the Vimeo URL is public and playable in a browser.
  3. Check the MediaInfo/available_qualities returned by get_media_info before calling download.
  4. For private videos, supply credentials/cookies supported by yt-dlp.
  5. 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

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


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)