tonhowtf/omniget · error · anyhow::Error

No stdout from gallery-dl

Error message

No stdout from gallery-dl

What it means

A defensive guard in download(): child.stdout was None when taken, meaning the gallery-dl process was spawned without a piped stdout handle (stdio was not configured as piped before spawn). No download output or JSON result can ever be read; this is an internal plumbing error, not a gallery-dl failure.

Solutions

  1. Ensure the gallery-dl command is built with stdout piped before spawn
  2. Update the app — newer builds configure stdio correctly
  3. Report the issue if it reproduces with a current version
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at src-tauri/src/platforms/gallerydl/mod.rs:243 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at src-tauri/src/platforms/gallerydl/mod.rs:243

            if std::fs::metadata(&cookie_file)
                .map(|m| m.len() > 0)
                .unwrap_or(false)
            {
                cmd.arg("--cookies").arg(&cookie_file);
            }
        }

        cmd.arg("--").arg(&url);

        cmd.kill_on_drop(true);
        let mut child = cmd
            .spawn()
            .map_err(|e| anyhow!("Failed to start gallery-dl: {}", e))?;

        let stdout = child
            .stdout
            .take()
            .ok_or_else(|| anyhow!("No stdout from gallery-dl"))?;
        let stderr_pipe = child
            .stderr
            .take()
            .ok_or_else(|| anyhow!("No stderr from gallery-dl"))?;

        let started_at = SystemTime::now();

        let progress_tx = progress.clone();
        let reader_task = tokio::spawn(async move {
            let mut lines = BufReader::new(stdout).lines();
            let mut count: u64 = 0;
            let mut last_emit = std::time::Instant::now();
            while let Ok(Some(line)) = lines.next_line().await {
                let trimmed = line.trim();
                if trimmed.is_empty() || trimmed.starts_with('#') || trimmed.starts_with('[') {
                    continue;
                }
                count += 1;

View on GitHub (pinned to 8600b91f42)