tonhowtf/omniget · error

Post not available

Error message

Post not available: {}

What it means

TikTok's video-detail payload includes a non-empty statusMsg, which the library interprets as 'this post cannot be shown' and surfaces verbatim. This is TikTok's own status message (e.g. 'Video currently unavailable', removal notice) wrapped in this error.

Solutions

  1. Read the included statusMsg — it states why TikTok won't serve the post (deleted, private, banned).
  2. Confirm in a browser that the URL still resolves to a playable video.
  3. If the post exists but is region-blocked, retry via a proxy in an allowed region.
  4. Handle this as a permanent user-facing condition rather than retrying blindly.
Defensive patterns

Strategy: try-catch

Try / catch

match tiktok.get_media_info(url).await {
    Err(e) if e.to_string().starts_with("Post not available:") => {
        // surface statusMsg to the user; do not retry
    }
    other => { other?; }
}

Prevention

When it happens

Trigger: fetch_detail finds video_detail.statusMsg as a non-empty string after a successful parse and key lookup, and immediately returns Post not available: {statusMsg}.

Common situations: The video was deleted by its author; the account was banned or made private; TikTok removed the video for ToS violations; region-blocked content returning a status message instead of data.

Related errors


AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12). Data as JSON: /api/errors/ce7e7e543b149b2e. Report an issue: GitHub.

Appendix: source

Thrown at src-tauri/omniget-core/src/platforms/tiktok.rs:183

            .split("<script id=\"__UNIVERSAL_DATA_FOR_REHYDRATION__\" type=\"application/json\">")
            .nth(1)
            .and_then(|s| s.split("</script>").next())
            .ok_or_else(|| anyhow!("TikTok is blocking requests. Try again in a few minutes."))?;

        let data: serde_json::Value = serde_json::from_str(json_str)
            .map_err(|_| anyhow!("Erro ao processar resposta do TikTok"))?;

        let video_detail = data
            .get("__DEFAULT_SCOPE__")
            .and_then(|s| s.get("webapp.video-detail"))
            .ok_or_else(|| anyhow!("Video data not found in TikTok response"))?;

        if let Some(status_msg) = video_detail
            .get("statusMsg")
            .and_then(|v| v.as_str())
            .filter(|s| !s.is_empty())
        {
            return Err(anyhow!("Post not available: {}", status_msg));
        }

        if let Some(status_code) = video_detail.get("statusCode").and_then(|v| v.as_u64()) {
            if status_code != 0 {
                return Err(anyhow!("Post not available (status {})", status_code));
            }
        }

        let detail = video_detail
            .pointer("/itemInfo/itemStruct")
            .ok_or_else(|| anyhow!("Video data not found in TikTok response"))?
            .clone();

        if detail
            .get("isContentClassified")
            .and_then(|v| v.as_bool())
            .unwrap_or(false)
        {

View on GitHub (pinned to 8600b91f42)