{"record":{"id":"4aa0be2bb3f07cb4","repo":"tonhowtf/omniget","slug":"a-conta-logada-n-o-tem-nenhuma-assinatura-ativa-ou-a-sess-o","errorCode":null,"errorMessage":"a conta logada não tem nenhuma assinatura ativa (ou a sessão expirou)","messagePattern":"a conta logada não tem nenhuma assinatura ativa \\(ou a sessão expirou\\)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/blogs/substack.rs","lineNumber":377,"sourceCode":"\n// ── Execução ───────────────────────────────────────────────────────────\n\nconst PAGE: usize = 12;\n\n/// Descobre as assinaturas da conta logada. Sem sessão não há o que\n/// descobrir: o endpoint responde 401.\npub async fn discover(fetcher: &Fetcher) -> Result<Vec<Subscription>> {\n    if !fetcher.has_session() {\n        return Err(anyhow!(\n            \"sem a sessão do Substack não dá para listar as suas assinaturas. Capture os cookies de substack.com no gerenciador, ou digite as publicações à mão\"\n        ));\n    }\n    let v = fetcher\n        .get_json(\"https://substack.com/api/v1/subscriptions\")\n        .await?;\n    let subs = parse_subscriptions(&v);\n    if subs.is_empty() {\n        return Err(anyhow!(\n            \"a conta logada não tem nenhuma assinatura ativa (ou a sessão expirou)\"\n        ));\n    }\n    Ok(subs)\n}\n\npub async fn run(opts: &Options, progress: ProgressFn) -> Result<ArchiveResult> {\n    let dest = opts.dest.trim();\n    if dest.is_empty() {\n        return Err(anyhow!(\"escolha a pasta de destino\"));\n    }\n    if !opts.markdown && !opts.html && !opts.json {\n        return Err(anyhow!(\"escolha ao menos um formato\"));\n    }\n    let root = PathBuf::from(dest);\n    std::fs::create_dir_all(&root)?;\n\n    let domains: Vec<String> = COOKIE_DOMAINS.iter().map(|d| d.to_string()).collect();","sourceCodeStart":359,"sourceCodeEnd":395,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/blogs/substack.rs#L359-L395","documentation":"After successfully calling the authenticated /api/v1/subscriptions endpoint, discover parses the payload with parse_subscriptions. If the parsed subscription list is empty it raises this error, meaning either the account genuinely has no active subscriptions or the session cookies are stale/expired so the API returned an empty/degraded payload.","triggerScenarios":"discover() is called with a valid-looking session, the request succeeds, but parse_subscriptions(&v) yields zero entries — logged-in account with no paid/free subscriptions, or expired cookies causing an empty subscriptions array.","commonSituations":"Fresh Substack account with no subscriptions; cookies captured weeks ago and since invalidated by re-login; subscription list filtered out entirely by the parser after a Substack API shape change.","solutions":["Re-capture fresh substack.com cookies in the cookie manager (re-login first) and retry","Verify the account actually has subscriptions by visiting substack.com while logged in","If the account truly has none, provide the publications manually instead of using discover"],"exampleFix":"// before\nlet subs = substack::discover(&fetcher).await?;\n// after\nlet subs = match substack::discover(&fetcher).await {\n    Ok(s) => s,\n    Err(e) if e.to_string().contains(\"assinatura\") => relogin_and_retry(&mut fetcher)?,\n    Err(e) => return Err(e),\n};","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match substack::discover(&fetcher).await {\n    Ok(subs) if !subs.is_empty() => subs,\n    Ok(_) => Vec::new(), // treat as expired session\n    Err(e) if e.to_string().contains(\"assinatura\") => {\n        refresh_cookies(&mut fetcher)?;\n        substack::discover(&fetcher).await?\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Detect empty subscription payloads early and refresh cookies proactively","Cache subscription lists to notice when a previously non-empty result turns empty","Verify session validity with a lightweight authenticated endpoint before bulk operations"],"tags":["substack","session","empty-result","rust"],"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"}