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

  1. Verify the tweet still exists (e.g. via its profile page or GraphQL API) before relying on the syndication path
  2. Treat as a permanent skip and mark the tweet_id unavailable
  3. Bypass any stale CDN cache with cache-busting headers/params if the tweet was recently deleted
  4. 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

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


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)