tonhowtf/omniget · info · Error
Não capturei seu login. Tenta de novo.
Error message
Não capturei seu login. Tenta de novo.
What it means
Raised by extract_syndication_media when the syndication API response has __typename "TweetTombstone" or "TweetUnavailable". As with the GraphQL path, the target tweet cannot be served (deleted, suspended, restricted), so the syndication extractor fails fast with "Post not available".
Solutions
- Verify the tweet still exists (e.g. via its profile page or GraphQL API) before relying on the syndication path
- Treat as a permanent skip and mark the tweet_id unavailable
- Bypass any stale CDN cache with cache-busting headers/params if the tweet was recently deleted
- Log the typename and fall back to another extraction strategy if one exists
Example fix
// before
if typename == "TweetTombstone" || typename == "TweetUnavailable" {
tracing::warn!("[twitter] syndication tombstone typename={}", typename);
return Err(anyhow!("Post not available"));
}
// after
if typename == "TweetTombstone" || typename == "TweetUnavailable" {
tracing::warn!("[twitter] syndication tombstone typename={}", typename);
return Err(TwitterError::SyndicationUnavailable { typename: typename.to_string() });
} Defensive patterns
Strategy: fallback
Validate before calling
// Probe availability before syndication media extraction
const probe = await fetch(syndicationUrl(tweetId), { method: 'HEAD' });
if (!probe.ok) return skip(tweetId, 'syndication reports unavailable'); Type guard
function isSyndicationUnavailable(payload) {
return ['TweetTombstone','TweetUnavailable'].includes(payload?.__typename);
} Try / catch
match tweet.extract_syndication_media(id) {
Err(e) if e.to_string() == "Post not available" => mark_permanently_unavailable(id),
other => other,
} Prevention
- Check the tweet still exists via GraphQL before falling back to syndication
- Add cache-busting when re-probing recently deleted content to bypass stale CDN entries
- Cap retries for tombstoned tweet_ids — the state is usually permanent
- Log the syndication __typename to distinguish tombstone vs unavailable
When it happens
Trigger: Calling extract_syndication_media on a syndication CDN response whose root object's __typename is TweetTombstone or TweetUnavailable — the syndication endpoint returns this shell instead of a tweet with mediaDetails/photos.
Common situations: Falling back to the syndication API for tweets already deleted or suspended (e.g. after the GraphQL path failed); cached syndication CDN responses for removed content; syndication endpoint not serving sensitive tweets at all, returning an unavailable shell.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- HLS nao e suportado neste navegador
- Syndication API retornou HTTP
- Syndication API retornou HTTP
- ERR_TOO_MANY_ATTACHMENTS
- empty stream url
AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12).
Data as JSON: /api/errors/1318504a3692ecec.
Report an issue: GitHub.
Appendix: source
Thrown at src/lib/study-music/soundcloud-store.svelte.ts:253
async loginWithWebview(): Promise<void> {
const { invoke } = await import("@tauri-apps/api/core");
this.error = null;
const result = await invoke<{
cookies: { name: string; value: string; domain: string; path: string }[];
finalUrl: string;
}>("open_auth_webview", {
request: {
url: "https://soundcloud.com/signin",
title: "Entrar com SoundCloud",
cookieDomains: [".soundcloud.com", "soundcloud.com"],
successUrlContains: null,
waitForCookie: "oauth_token",
initializationScript: null,
},
});
if (!result?.cookies || result.cookies.length === 0) {
throw new Error("Não capturei seu login. Tenta de novo.");
}
const cookiesJson = JSON.stringify(result.cookies);
await pluginInvoke("study", "study:soundcloud:auth:set_cookies", {
cookies_json: cookiesJson,
});
await this.refreshStatus();
if (this.isLoggedIn) {
await this.loadAll();
}
}
async loadAll() {
if (!this.isLoggedIn) return;
this.loading = true;
try {
const [likedRes, playlistsRes, followingsRes, streamRes] = await Promise.allSettled([
pluginInvoke<{ collection?: any[] }>("study", "study:soundcloud:liked_tracks", {
limit: 50,View on GitHub (pinned to 8600b91f42)