{"record":{"id":"5e34fa2ade7c3a44","repo":"tonhowtf/omniget","slug":"nenhuma-pagina-baixada-o-documento-pode-exigir-assinatura-de","errorCode":null,"errorMessage":"nenhuma pagina baixada; o documento pode exigir assinatura de URL","messagePattern":"nenhuma pagina baixada; o documento pode exigir assinatura de URL","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/calameo.rs","lineNumber":77,"sourceCode":"                svg = bytes.to_vec();\n            }\n            tokio::fs::write(folder.join(format!(\"p{:04}.svg\", page)), &svg).await?;\n            n = page;\n            continue;\n        }\n        let jpg_url = format!(\"{}p{}.jpg\", prefix, page);\n        let resp = client.get(&jpg_url).send().await?;\n        if resp.status().is_success() {\n            format = \"jpg\".to_string();\n            let bytes = resp.bytes().await?;\n            tokio::fs::write(folder.join(format!(\"p{:04}.jpg\", page)), &bytes).await?;\n            n = page;\n            continue;\n        }\n        break;\n    }\n    if n == 0 {\n        return Err(anyhow!(\n            \"nenhuma pagina baixada; o documento pode exigir assinatura de URL\"\n        ));\n    }\n    if format == \"jpg\" {\n        // com JPEG dá para montar o PDF na hora\n        let mut imgs = Vec::new();\n        for page in 1..=n {\n            imgs.push(tokio::fs::read(folder.join(format!(\"p{:04}.jpg\", page))).await?);\n        }\n        let pdf = super::jpeg_pdf::build_pdf(&imgs)?;\n        tokio::fs::write(folder.with_extension(\"pdf\"), pdf).await?;\n    }\n    super::report(&progress, &id, \"done\", n as u64, Some(n as u64), None);\n    Ok(CalameoResult {\n        title,\n        pages: n,\n        folder: folder.to_string_lossy().to_string(),\n        format,","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/calameo.rs#L59-L95","documentation":"calameo::download loops over page numbers fetching each page asset; when the loop ends, if n == 0 not a single page was successfully downloaded. Most commonly this means the per-page URLs require a signed URL (signature/query parameters) that the tool did not produce, so all requests failed or returned non-image responses.","triggerScenarios":"download() extracted a valid page_prefix but every page request returned 403/404 or an error body — the CDN requires per-URL signature/auth that page URL construction lacks.","commonSituations":"Publisher's Calameo account enforces signed/protected page URLs; CDN auth tokens expired between prefix extraction and download; network/firewall blocking the CDN host.","solutions":["Open the document in a browser with devtools and copy a working page URL; compare with the constructed URL and add any missing signature query parameters to the URL builder","Retry later — temporary CDN auth/token issues may resolve","If the document fundamentally requires signed URLs, the document cannot be downloaded anonymously; use an authenticated export path instead"],"exampleFix":"// before\nlet url = format!(\"{}/page_0001.svg\", prefix); // unsigned, 403\n// after\nlet url = format!(\"{}/page_0001.svg?{}\", prefix, signing_params(&doc_id));","handlingStrategy":"retry","validationCode":"// verify a single page URL is fetchable before the full loop\nlet probe = client.get(format!(\"{}/page_0001.{format}\", prefix)).send().await?;\nif !probe.status().is_success() {\n    anyhow::bail!(\"page URLs appear to require a signature\");\n}","typeGuard":null,"tryCatchPattern":"let result = tokio::time::timeout(Duration::from_secs(60), calameo::download(url, dest, progress)).await;\nmatch result {\n    Ok(Ok(res)) if res.pages > 0 => res,\n    _ => { eprintln!(\"download failed or produced 0 pages; signed URLs likely required\"); Default::default() }\n}","preventionTips":["Compare constructed page URLs against URLs captured from a working browser session (devtools) to detect missing signature parameters","Fail fast: probe one page before iterating the whole document","Track Calameo CDN auth requirements; do not assume unsigned assets remain available"],"tags":["calameo","download","cdn","rust"],"backgroundTag":"http-error-response","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"}