tonhowtf/omniget · error

No downloadable media found for this tweet (it may be…

Error message

No downloadable media found for this tweet (it may be text-only, protected, or deleted)

What it means

The Twitter downloader fetches tweet metadata and builds available_qualities; when the tweet exposes zero downloadable media variants it bails with this message. It guards against trying to select a quality from an empty list.

Solutions

  1. Verify the tweet actually contains media (video/image) before downloading.
  2. Check the account is public and the tweet is not deleted.
  3. Pass valid auth cookies if the media requires login to view.
  4. Update the extractor/core if Twitter changed its API response shape.
Defensive patterns

Strategy: validation

Validate before calling

let info = fetch_tweet_info(url).await?;
if info.available_qualities.is_empty() {
    // surface a friendly message or skip before calling download
    return Err(anyhow!("tweet has no downloadable media"));
}

Try / catch

match download(url, opts).await {
    Err(e) if e.to_string().contains("No downloadable media") => notify_user_no_media(),
    other => other?,
}

Prevention

When it happens

Trigger: Calling download on a tweet whose info.available_qualities.len() == 0 — text-only tweets, protected/private accounts, deleted tweets, or media that failed extraction.

Common situations: User pastes a URL to a plain-text tweet; tweet requires login (protected); tweet was deleted between listing and download; extractor changes broke variant parsing.

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/2d1d579cbd2219fd. Report an issue: GitHub.

Appendix: source

Thrown at src-tauri/omniget-core/src/platforms/twitter.rs:813

                    opts.download_mode.as_deref(),
                    opts.format_id.as_deref(),
                    opts.filename_template.as_deref(),
                    opts.referer.as_deref().or(Some("https://x.com/")),
                    opts.cancel_token.clone(),
                    None,
                    opts.concurrent_fragments,
                    false,
                    &extra_flags,
                    opts.audio_format.as_deref(),
                )
                .await;
            }
        }

        let count = info.available_qualities.len();

        if count == 0 {
            anyhow::bail!(
                "No downloadable media found for this tweet (it may be text-only, protected, or deleted)"
            );
        }

        if count == 1 {
            let quality = info.available_qualities.first().unwrap();
            let filename = format!(
                "{}.{}",
                sanitize_filename::sanitize(&info.title),
                quality.format
            );
            let output = opts.output_dir.join(&filename);

            let bytes = direct_downloader::download_direct(
                &self.client,
                &quality.url,
                &output,
                progress,

View on GitHub (pinned to 8600b91f42)