tonhowtf/omniget · warning

o Goodreads ainda não gerou o CSV depois de

Error message

o Goodreads ainda não gerou o CSV depois de {}s. Deixe goodreads.com/review/import aberto, espere e rode de novo — o link fica salvo lá

What it means

trigger_and_wait polls the CSV URL until the file is ready (HEAD 200). If the elapsed time exceeds the configured limit while the file is still 404/403/unreachable, it gives up with this message, noting that Goodreads generates exports asynchronously and the completed link is saved on the import page for later retrieval.

Solutions

  1. Leave goodreads.com/review/import open, wait several minutes to hours, then rerun — the finished export link is saved on that page and run() will reuse it without regenerating.
  2. Rerun with the existing (non-forced) options: since an export was already requested, the ready link check will pick it up once generated.
  3. Increase the polling timeout (limit) for very large libraries if the tool exposes it.
  4. Do not trigger a new export while waiting — generating a new one deletes the in-progress/previous export.

Example fix

// before
run(&f, &opts).await?; // timed out; large library

// after
// keep tab open, wait, then rerun non-forced:
// curl -s https://www.goodreads.com/review/import | grep review_porter
run(&f, &Options { force: false, ..opts }).await?;
Defensive patterns

Strategy: fallback

Try / catch

match run(&fetcher, &opts).await {
    Err(e) if e.to_string().contains("ainda não gerou o CSV") => {
        eprintln!("Export still cooking; leave goodreads.com/review/import open and rerun later");
        schedule_rerun_in(Duration::from_secs(3600));
    }
    r => r?,
}

Prevention

When it happens

Trigger: The export generation did not complete within the polling timeout: a large library taking longer than `limit` to render, the POST trigger was accepted but Goodreads queued the job behind others, or the export never actually started.

Common situations: Very large Goodreads libraries (thousands of reviews) exceeding the default wait limit; running during Goodreads peak load; user closed the browser tab so the import page is not open to pick up the finished link later (though the link persists server-side).

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12). Data as JSON: /api/errors/373146146d51aed9. Report an issue: GitHub.

Appendix: source

Thrown at src-tauri/omniget-core/src/core/tools/lists/goodreads.rs:307

            ));
        }
    }

    // Espera: o CSV é gerado em segundo plano e responde 404 até ficar pronto.
    let limit = Duration::from_secs(opts.wait_secs.clamp(30, 3600));
    loop {
        let code = f.head_status(&csv_url).await.unwrap_or(0);
        if code == 200 {
            break;
        }
        if code != 404 && code != 0 && code != 403 {
            return Err(anyhow!(
                "o Goodreads respondeu HTTP {} no arquivo do export",
                code
            ));
        }
        if started.elapsed() >= limit {
            return Err(anyhow!(
                "o Goodreads ainda não gerou o CSV depois de {}s. Deixe goodreads.com/review/import aberto, espere e rode de novo — o link fica salvo lá",
                limit.as_secs()
            ));
        }
        report(
            p,
            TOOL_ID,
            "progress",
            started.elapsed().as_secs(),
            Some(limit.as_secs()),
            Some("esperando o Goodreads gerar o CSV".into()),
        );
        tokio::time::sleep(Duration::from_secs(10)).await;
    }

    let (bytes, _) = f.get_bytes(&csv_url).await?;
    let csv = String::from_utf8_lossy(&bytes).to_string();
    if !csv.to_lowercase().contains("title") {

View on GitHub (pinned to 8600b91f42)