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
- 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.
- Rerun with the existing (non-forced) options: since an export was already requested, the ready link check will pick it up once generated.
- Increase the polling timeout (limit) for very large libraries if the tool exposes it.
- 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
- Run non-forced reruns later — the finished link is saved on the import page
- Allow generous timeouts for large libraries
- Never trigger a second export while waiting; it deletes the first
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
- o Goodreads respondeu HTTP
- Download timeout — no data received for 30 seconds
- Timeout downloading segment
- read timed out after
- unreachable: connect timed out after
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)