tonhowtf/omniget · error

{}

Error message

{}

What it means

The unclassified sibling of vimeo:{code}: when yt-dlp exits non-zero and error_code() finds no known pattern, run_json returns the raw scrubbed stderr tail as the anyhow message (vimeo.rs:762). Callers and downstream consumers (e.g., the omniget plugin layer that surfaces these messages) receive yt-dlp's own last stderr line verbatim, with no stable prefix to match.

Solutions

  1. Read the message text — it is the last non-empty stderr line from yt-dlp and names the actual problem.
  2. Update yt-dlp; most 'unrecognized' failures are extractor breakage fixed upstream.
  3. Test the URL directly with `yt-dlp -J <url>` to reproduce outside the app.
  4. If the failure is recurring and classifiable, add a new pattern to error_code() so it maps to vimeo:{code}.

Example fix

// before: raw passthrough
None => anyhow!("{}", msg),
// after: keep passthrough but tag origin for consumers
None => anyhow!("vimeo:unclassified: {msg}"),
Defensive patterns

Strategy: try-catch

Try / catch

match one(url).await {
    Err(e) if !e.to_string().starts_with("vimeo:") => {
        // unclassified yt-dlp stderr — log verbatim, suggest yt-dlp upgrade
        eprintln!("erro não classificado do yt-dlp: {e}; tente atualizar o yt-dlp");
    }
    other => other?,
}

Prevention

When it happens

Trigger: run_json failing with an unrecognized yt-dlp failure: new/unknown Vimeo errors after a site change, network DNS/TLS failures, unsupported URL, yt-dlp crashing with a traceback, or any error message not yet in the error_code table.

Common situations: yt-dlp version outdated after a Vimeo extractor change; no internet/DNS failure on the host; malformed Vimeo URL passed to enumeration; unexpected yt-dlp bug surfaced as a Python traceback.

Related errors


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

Appendix: source

Thrown at src-tauri/omniget-core/src/core/tools/vimeo.rs:762

async fn run_json(bin: &Path, args: &[String], secrets: &[&str]) -> Result<String> {
    let _slot = crate::core::ytdlp::acquire_ytdlp_slot("vimeo-list").await;
    let mut cmd = crate::core::ytdlp::ytdlp_command(bin);
    cmd.args(args).stdin(std::process::Stdio::null());
    let out = cmd
        .output()
        .await
        .map_err(|e| anyhow!("não foi possível iniciar o yt-dlp: {e}"))?;
    if !out.status.success() {
        let tail = scrub(&String::from_utf8_lossy(&out.stderr), secrets);
        let msg = tail
            .lines()
            .rev()
            .find(|l| !l.trim().is_empty())
            .unwrap_or("")
            .to_string();
        return Err(match error_code(&msg) {
            Some(code) => anyhow!("vimeo:{code}"),
            None => anyhow!("{}", msg),
        });
    }
    Ok(String::from_utf8_lossy(&out.stdout).to_string())
}

/// O que sobrou de um download. `tail` já passou pelo `scrub`.
struct DownloadOutcome {
    file: Option<String>,
    meta: Option<(String, String)>,
    tail: String,
    success: bool,
}

/// Roda um download e conta o que aconteceu.
async fn run_download(
    bin: &Path,
    args: &[String],
    secrets: &[&str],

View on GitHub (pinned to 8600b91f42)