tonhowtf/omniget · error
Post not available; graphql='{}'; syndication='{}'; html='{}
Error message
Post not available; graphql='{}'; syndication='{}'; html='{}' What it means
The sibling of error 1033: here the syndication endpoint itself fails (request_syndication returns Err rather than its extraction step), GraphQL already failed, and the HTML-scrape fallback also fails, so native_get_media_info aggregates the three channel errors ('graphql', 'syndication', 'html') and returns. It means no extraction channel could retrieve or parse any media for the tweet.
Solutions
- Verify the tweet is public and still exists in a browser.
- Set the X/Twitter auth cookie so the HTML path (and yt-dlp fallback) can authenticate and bypass anonymous rate limits.
- Inspect the three embedded sub-errors for HTTP status codes: 429 means back off and retry; 403/404 means the post is unavailable or blocked.
- Check network/proxy reachability to api.twitter.com, cdn.syndication.twimg.com, and x.com.
- Retry with backoff; if persistent, rely on the outer get_media_info yt-dlp fallback and ensure the yt-dlp binary is up to date.
Example fix
// before: immediate retry loop hammering rate-limited endpoints
loop { downloader.get_media_info(url).await?; }
// after: honor rate limits with exponential backoff
for delay in [1u64, 5, 30] {
match downloader.get_media_info(url).await {
Ok(info) => break info,
Err(e) if e.to_string().contains("429") => {
tokio::time::sleep(Duration::from_secs(delay)).await;
}
Err(e) => return Err(e),
}
} else { anyhow::bail!("unavailable after retries") } Defensive patterns
Strategy: retry
Validate before calling
// Probe reachability of the three endpoints before extraction
async fn endpoints_reachable(client: &reqwest::Client) -> bool {
for u in ["https://api.twitter.com", "https://cdn.syndication.twimg.com", "https://x.com"] {
if client.head(u).send().await.is_err() { return false; }
}
true
} Try / catch
match downloader.get_media_info(url).await {
Err(e) if e.to_string().contains("Post not available") => {
if e.to_string().contains("429") {
tokio::time::sleep(Duration::from_secs(60)).await;
// retry once
} else {
eprintln!("post unavailable or network blocked: {e}");
}
}
other => other?,
} Prevention
- Add exponential backoff on 429/5xx from the embedded sub-errors.
- Set the auth cookie to reduce dependence on anonymous guest tokens and HTML scraping.
- Verify network/proxy allows api.twitter.com, cdn.syndication.twimg.com, and x.com.
- Treat repeated aggregate failures for the same ID as 'post gone' rather than retrying indefinitely.
- Keep yt-dlp updated so the outer fallback remains a viable second chance.
When it happens
Trigger: try_graphql errors (guest token unavailable, expired refresh also failed, HTTP error), request_syndication errors outright (network failure, syndication API non-2xx, timeout), and request_html_media errors (HTTP non-success or no photo URLs in HTML).
Common situations: Deleted or protected tweets; syndication CDN endpoint down or geo-blocked; Twitter aggressively rate-limiting anonymous traffic (all three channels are unauthenticated without a cookie); corporate proxy/firewall blocking api.twitter.com, cdn.syndication.twimg.com, and x.com HTML simultaneously; guest-token issuance failing so GraphQL errors immediately.
Related errors
- Post not available; graphql='{}'; syndication_extract='{}';
- Post not available; graphql='{}'; syndication_extract='{}';
- Post not available; graphql='{}'; syndication='{}'; html='{}
- chave de verificacao do X nao encontrada
- chunk de assinatura do X nao encontrado
AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12).
Data as JSON: /api/errors/4529b1efaef945c9.
Report an issue: GitHub.
Appendix: source
Thrown at src-tauri/omniget-core/src/platforms/twitter.rs:948
"Post not available; graphql='{}'; syndication_extract='{}'; html='{}'",
graphql_err,
syndication_extract_err,
html_err
));
}
}
}
},
Err(syndication_err) => {
tracing::warn!(
"[twitter] syndication lookup failed for tweet_id={}: {}",
tweet_id,
syndication_err
);
match self.request_html_media(url).await {
Ok(items) => items,
Err(html_err) => {
return Err(anyhow!(
"Post not available; graphql='{}'; syndication='{}'; html='{}'",
graphql_err,
syndication_err,
html_err
));
}
}
}
}
}
};
let twitter_media = Self::parse_media_items(&media_items)?;
Ok(Self::media_info_from_twitter_media(
filename_base,
twitter_media,
))View on GitHub (pinned to 8600b91f42)