{"record":{"id":"e7e7f8858ae16ed3","repo":"tonhowtf/omniget","slug":"video-data-not-found-in-tiktok-response-mod","errorCode":null,"errorMessage":"Video data not found in TikTok response","messagePattern":"Video data not found in TikTok response","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/src/platforms/tiktok/mod.rs","lineNumber":176,"sourceCode":"        if Self::is_captcha_page(&html) {\n            return Err(anyhow!(\n                \"TikTok is blocking requests. Try again in a few minutes.\"\n            ));\n        }\n\n        let json_str = html\n            .split(\"<script id=\\\"__UNIVERSAL_DATA_FOR_REHYDRATION__\\\" type=\\\"application/json\\\">\")\n            .nth(1)\n            .and_then(|s| s.split(\"</script>\").next())\n            .ok_or_else(|| anyhow!(\"TikTok is blocking requests. Try again in a few minutes.\"))?;\n\n        let data: serde_json::Value = serde_json::from_str(json_str)\n            .map_err(|_| anyhow!(\"Erro ao processar resposta do TikTok\"))?;\n\n        let video_detail = data\n            .get(\"__DEFAULT_SCOPE__\")\n            .and_then(|s| s.get(\"webapp.video-detail\"))\n            .ok_or_else(|| anyhow!(\"Video data not found in TikTok response\"))?;\n\n        if let Some(status_msg) = video_detail\n            .get(\"statusMsg\")\n            .and_then(|v| v.as_str())\n            .filter(|s| !s.is_empty())\n        {\n            return Err(anyhow!(\"Post not available: {}\", status_msg));\n        }\n\n        if let Some(status_code) = video_detail.get(\"statusCode\").and_then(|v| v.as_u64()) {\n            if status_code != 0 {\n                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\"))?","sourceCodeStart":158,"sourceCodeEnd":194,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/src/platforms/tiktok/mod.rs#L158-L194","documentation":"The parsed JSON lacked the __DEFAULT_SCOPE__ > webapp.video-detail object, so fetch_detail returns this error. The response was valid JSON but did not contain the video detail payload the parser expects.","triggerScenarios":"TikTok returned a valid page whose rehydration JSON has no video-detail scope — e.g. a login-required page, region-blocked video, or a schema change renaming/moving the key.","commonSituations":"Videos requiring login, geo-restricted content, deleted videos served as normal pages, or TikTok restructuring its __DEFAULT_SCOPE__ keys.","solutions":["Log the top-level JSON keys present to see what scope TikTok returned","Check statusMsg/statusCode handling upstream and surface those errors first when available","Update the parser if TikTok renamed the webapp.video-detail path","Retry with an authenticated session (cookies) for login-gated videos"],"exampleFix":"// before\n.ok_or_else(|| anyhow!(\"Video data not found in TikTok response\"))?;\n// after\n.ok_or_else(|| anyhow!(\"Video data not found; keys: {:?}\", data.get(\"__DEFAULT_SCOPE__\").map(|s| s.as_object().map(|o| o.keys().cloned().collect::<Vec<_>>())))?;","handlingStrategy":"validation","validationCode":"let ok = json.get(\"__DEFAULT_SCOPE__\")\n    .and_then(|s| s.get(\"webapp.video-detail\"))\n    .is_some();\nif !ok { return Err(\"response lacks webapp.video-detail\".into()); }","typeGuard":"fn has_video_detail(json: &serde_json::Value) -> bool {\n    json.get(\"__DEFAULT_SCOPE__\")\n        .and_then(|s| s.get(\"webapp.video-detail\"))\n        .is_some()\n}","tryCatchPattern":"match fetch_detail(url).await {\n    Err(e) if e.to_string().contains(\"Video data not found\") => {\n        report_schema_drift_and_skip(url)\n    }\n    other => other,\n}","preventionTips":["Surface which JSON keys were present when the path is missing","Keep a parser test against a saved real TikTok response","Detect login/region walls before parsing"],"tags":["tiktok","scraping","schema-change"],"backgroundTag":"unexpected-api-response-shape","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"}