{"record":{"id":"252e0de6bb23b6f2","repo":"tonhowtf/omniget","slug":"nenhum-post-foi-lido-desse-blog","errorCode":null,"errorMessage":"nenhum post foi lido desse blog","messagePattern":"nenhum post foi lido desse blog","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/tumblr/backup.rs","lineNumber":545,"sourceCode":"        \"-o\".to_string(),\n        \"extractor.tumblr.reblogs=true\".to_string(),\n        \"-o\".to_string(),\n        \"extractor.tumblr.original=true\".to_string(),\n    ];\n\n    super::super::report(progress, TOOL_ID, \"started\", 0, None, Some(url.clone()));\n    let entries = gdl::dump(\n        &url,\n        cookie_path.as_deref(),\n        opts.limit,\n        &extra,\n        progress,\n        TOOL_ID,\n    )\n    .await?;\n    let posts = parse_posts(&entries);\n    if posts.is_empty() {\n        anyhow::bail!(\"nenhum post foi lido desse blog\");\n    }\n\n    let blog_name = posts\n        .iter()\n        .find(|p| !p.blog.is_empty())\n        .map(|p| p.blog.clone())\n        .unwrap_or_else(|| safe_slug(&opts.blog));\n    let root = PathBuf::from(&opts.out_dir).join(safe_slug(&blog_name));\n    let media_dir = root.join(\"media\");\n    std::fs::create_dir_all(root.join(\"posts\"))?;\n    std::fs::create_dir_all(root.join(\"tags\"))?;\n\n    let mut media_files = 0u64;\n    if opts.download_media {\n        let out = gdl::download(\n            &url,\n            &media_dir,\n            cookie_path.as_deref(),","sourceCodeStart":527,"sourceCodeEnd":563,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/tumblr/backup.rs#L527-L563","documentation":"The backup tool fetches the blog's post dump and parses it into posts. If parsing yields zero posts, the backup would be an empty mirror, so it aborts with this message rather than writing an empty backup.","triggerScenarios":"Calling backup `run` against a blog whose fetched dump contained no parseable posts — empty/new blog, offscreen/private content without a valid session, or a dump format change breaking parse_posts.","commonSituations":"Backing up a deleted or brand-new blog with zero posts; missing or expired session cookies for blogs that require authentication; Tumblr API/HTML changes that the parser no longer understands; wrong blog name that resolves to an empty page.","solutions":["Verify the blog exists and has posts by opening it in a browser","Provide a valid session_netscape cookie file if the blog requires a session","Re-export cookies if the session expired","Update the parser if Tumblr changed its response format","Double-check the blog name/URL for typos"],"exampleFix":"// before\nlet opts = Options { blog: \"deleted-blog\".into(), session_netscape: None, .. };\n// after\nlet opts = Options { blog: \"active-blog\".into(), session_netscape: Some(\"cookies.txt\".into()), .. };","handlingStrategy":"try-catch","validationCode":"// confirm blog exists and has posts before backing up\nif !blog_has_posts(&opts.blog, opts.session_netscape.as_deref()).await {\n    return Err(anyhow!(\"blog vazio ou inacessível\"));\n}","typeGuard":null,"tryCatchPattern":"match backup::run(&opts, progress).await {\n    Err(e) if e.to_string().contains(\"nenhum post foi lido\") => {\n        eprintln!(\"verifique sessão/nome do blog ou formato do dump\");\n    }\n    Err(e) => return Err(e),\n    Ok(r) => use(r),\n}","preventionTips":["Check the blog has posts in a browser before running","Keep session cookies fresh for authenticated blogs","Update the tool when Tumblr changes its dump format"],"tags":["tumblr","backup","empty-result","scraping"],"backgroundTag":"empty-result-set","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}