{"record":{"id":"2d1d579cbd2219fd","repo":"tonhowtf/omniget","slug":"no-downloadable-media-found-for-this-tweet-it-may-be-text","errorCode":null,"errorMessage":"No downloadable media found for this tweet (it may be text-only, protected, or deleted)","messagePattern":"No downloadable media found for this tweet \\(it may be text-only, protected, or deleted\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/platforms/twitter.rs","lineNumber":813,"sourceCode":"                    opts.download_mode.as_deref(),\n                    opts.format_id.as_deref(),\n                    opts.filename_template.as_deref(),\n                    opts.referer.as_deref().or(Some(\"https://x.com/\")),\n                    opts.cancel_token.clone(),\n                    None,\n                    opts.concurrent_fragments,\n                    false,\n                    &extra_flags,\n                    opts.audio_format.as_deref(),\n                )\n                .await;\n            }\n        }\n\n        let count = info.available_qualities.len();\n\n        if count == 0 {\n            anyhow::bail!(\n                \"No downloadable media found for this tweet (it may be text-only, protected, or deleted)\"\n            );\n        }\n\n        if count == 1 {\n            let quality = info.available_qualities.first().unwrap();\n            let filename = format!(\n                \"{}.{}\",\n                sanitize_filename::sanitize(&info.title),\n                quality.format\n            );\n            let output = opts.output_dir.join(&filename);\n\n            let bytes = direct_downloader::download_direct(\n                &self.client,\n                &quality.url,\n                &output,\n                progress,","sourceCodeStart":795,"sourceCodeEnd":831,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/platforms/twitter.rs#L795-L831","documentation":"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.","triggerScenarios":"Calling download on a tweet whose info.available_qualities.len() == 0 — text-only tweets, protected/private accounts, deleted tweets, or media that failed extraction.","commonSituations":"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.","solutions":["Verify the tweet actually contains media (video/image) before downloading.","Check the account is public and the tweet is not deleted.","Pass valid auth cookies if the media requires login to view.","Update the extractor/core if Twitter changed its API response shape."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"let info = fetch_tweet_info(url).await?;\nif info.available_qualities.is_empty() {\n    // surface a friendly message or skip before calling download\n    return Err(anyhow!(\"tweet has no downloadable media\"));\n}","typeGuard":null,"tryCatchPattern":"match download(url, opts).await {\n    Err(e) if e.to_string().contains(\"No downloadable media\") => notify_user_no_media(),\n    other => other?,\n}","preventionTips":["Check the tweet contains media before downloading","Confirm the account is public and tweet not deleted","Supply auth cookies for protected content","Keep the extractor updated"],"tags":["twitter","download","media","empty-result"],"backgroundTag":"empty-result-set","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}