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

anyhow::bail! aborts the tweet `download` flow when, after fetching tweet metadata, `info.available_qualities` is empty — i.e. the tweet exists and was parsed but contains no downloadable media entries. Twitter tweets can be text-only, protected (private accounts), or deleted, in which case there is nothing to download.

Solutions

  1. Verify the tweet actually contains an image or video by opening it in a browser while logged out
  2. If the account is protected, authenticate or make the media accessible — the downloader cannot see protected media
  3. Re-check the tweet is not deleted (404 in browser) and use the canonical twitter.com/x.com status URL
  4. Handle the empty-media case in UI: filter text-only URLs before invoking download

Example fix

// before
if info.available_qualities.is_empty() { /* crash path in caller */ }
// after
if info.available_qualities.is_empty() {
    eprintln!("tweet has no media; skipping download");
    return Ok(None);
}
Defensive patterns

Strategy: validation

Validate before calling

fn tweet_has_media(info: &TweetInfo) -> bool { !info.available_qualities.is_empty() }
if !tweet_has_media(&info) { eprintln!("skipping: no downloadable media"); return Ok(None); }

Type guard

fn has_media(info: &TweetInfo) -> bool { !info.available_qualities.is_empty() }

Prevention

When it happens

Trigger: Calling download with a Twitter URL whose tweet has no media entities (text-only tweet), whose account is protected so media isn't exposed to the caller, or which was deleted after metadata lookup produced an empty quality list.

Common situations: User pastes a link to a plain text tweet expecting video; tweet from a private/protected account; tweet deleted or account suspended between URL submission and download; API returned a truncated/unauthenticated response stripping media.

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

Appendix: source

Thrown at src-tauri/src/platforms/twitter/mod.rs:879

                    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)