tonhowtf/omniget · error

Post not available

Error message

Post not available

What it means

The itemStruct parsed and passed all status checks, but the author object is missing. The library requires author metadata as a sanity check that the item is a real, accessible post; a missing author means the post data is incomplete, so it fails with 'Post not available'.

Solutions

  1. Verify in a browser that the post and its author account still exist and are public.
  2. Treat the post as unavailable (deleted/private) and skip it rather than retrying.
  3. Retry once in case it was a transient partial response.
  4. If seen across many posts, suspect a TikTok schema change and update the extractor.
Defensive patterns

Strategy: validation

Try / catch

match tiktok.get_media_info(url).await {
    Err(e) if e.to_string() == "Post not available" => { /* mark post unavailable, continue batch */ }
    other => { other?; }
}

Prevention

When it happens

Trigger: detail.get("author") returns None after successful extraction of itemStruct — e.g. TikTok returned a stub itemStruct for a deleted/private/blocked post without a statusMsg or statusCode.

Common situations: Deleted or banned accounts still returning an envelope; shadow-banned posts; partially-structured responses for terminated content; TikTok schema drift removing/renaming author.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


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

Appendix: source

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

                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)
        {
            return Err(anyhow!("Age-restricted content"));
        }

        if detail.get("author").is_none() {
            return Err(anyhow!("Post not available"));
        }

        Ok(detail)
    }

    fn extract_author(detail: &serde_json::Value) -> String {
        detail
            .pointer("/author/uniqueId")
            .or_else(|| detail.pointer("/author/unique_id"))
            .and_then(|v| v.as_str())
            .unwrap_or("unknown")
            .to_string()
    }

    fn extract_video_url(detail: &serde_json::Value) -> Option<String> {
        if let Some(play_addr) = detail.pointer("/video/playAddr") {
            if let Some(url) = play_addr.as_str() {
                if Self::is_valid_play_addr(url) {

View on GitHub (pinned to 8600b91f42)