{"record":{"id":"eb0ee3622a1b628d","repo":"tonhowtf/omniget","slug":"post-not-available-eb0ee3","errorCode":null,"errorMessage":"Post not available","messagePattern":"Post not available","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/platforms/tiktok.rs","lineNumber":206,"sourceCode":"                return Err(anyhow!(\"Post not available (status {})\", status_code));\n            }\n        }\n\n        let detail = video_detail\n            .pointer(\"/itemInfo/itemStruct\")\n            .ok_or_else(|| anyhow!(\"Video data not found in TikTok response\"))?\n            .clone();\n\n        if detail\n            .get(\"isContentClassified\")\n            .and_then(|v| v.as_bool())\n            .unwrap_or(false)\n        {\n            return Err(anyhow!(\"Age-restricted content\"));\n        }\n\n        if detail.get(\"author\").is_none() {\n            return Err(anyhow!(\"Post not available\"));\n        }\n\n        Ok(detail)\n    }\n\n    fn extract_author(detail: &serde_json::Value) -> String {\n        detail\n            .pointer(\"/author/uniqueId\")\n            .or_else(|| detail.pointer(\"/author/unique_id\"))\n            .and_then(|v| v.as_str())\n            .unwrap_or(\"unknown\")\n            .to_string()\n    }\n\n    fn extract_video_url(detail: &serde_json::Value) -> Option<String> {\n        if let Some(play_addr) = detail.pointer(\"/video/playAddr\") {\n            if let Some(url) = play_addr.as_str() {\n                if Self::is_valid_play_addr(url) {","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/platforms/tiktok.rs#L188-L224","documentation":"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'.","triggerScenarios":"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.","commonSituations":"Deleted or banned accounts still returning an envelope; shadow-banned posts; partially-structured responses for terminated content; TikTok schema drift removing/renaming author.","solutions":["Verify in a browser that the post and its author account still exist and are public.","Treat the post as unavailable (deleted/private) and skip it rather than retrying.","Retry once in case it was a transient partial response.","If seen across many posts, suspect a TikTok schema change and update the extractor."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":"match tiktok.get_media_info(url).await {\n    Err(e) if e.to_string() == \"Post not available\" => { /* mark post unavailable, continue batch */ }\n    other => { other?; }\n}","preventionTips":["Check the post and author still exist publicly before processing.","Treat as permanent unavailability — skip rather than retry.","Cache known-unavailable post IDs to avoid repeat calls.","If many posts hit this at once, verify extractor schema assumptions."],"tags":["tiktok","content-unavailable","missing-metadata","scraping"],"backgroundTag":"record-not-found","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}