tonhowtf/omniget · error

vimeo:unavailable

vimeo:unavailable

Error message

vimeo:unavailable

What it means

vimeo:unavailable is raised by `private` when the yt-dlp run failed and its output tail was empty or blank, so no specific error code could be classified. The library uses this as the fallback meaning 'the download failed with no diagnostic output' — typically the video is genuinely unavailable or the process died without a message.

Solutions

  1. Verify the video opens in a browser; if it is gone, the error is expected and unrecoverable.
  2. Update yt-dlp to the latest version (`yt-dlp -U`) and retry.
  3. Check network/proxy connectivity and re-run; transient failures can surface as empty output.
  4. Re-run with verbose logging outside the library to capture the output that is being swallowed as an empty tail.

Example fix

// before
await vimeoPrivate({ url });
// after
try {
  await vimeoPrivate({ url });
} catch (e) {
  if (String(e).includes("vimeo:unavailable")) {
    const ok = await confirmVideoStillExists(url);
    if (ok) await retryWithBackoff(() => vimeoPrivate({ url }), 2);
    else showVideoGoneNotice();
  } else throw e;
}
Defensive patterns

Strategy: retry

Validate before calling

const head = await fetch(`https://vimeo.com/${id}`, { method: "HEAD" });
if (head.status === 404) throw new Error("video no longer exists; skip download");

Try / catch

try {
  await vimeoPrivate({ url });
} catch (e) {
  if (String(e).includes("vimeo:unavailable")) {
    await retryWithBackoff(() => vimeoPrivate({ url }), { tries: 2, baseMs: 2000 });
  } else throw e;
}

Prevention

When it happens

Trigger: Calling `private(opts)` where `!out.success || out.file.is_none()` and `error_code(&out.tail)` returned None while `out.tail.trim().is_empty()` — i.e. yt-dlp exited with failure and printed nothing usable.

Common situations: Video deleted or set to private between listing and download; network failure killing yt-dlp before output; broken yt-dlp/ffmpeg install; extremely old yt-dlp version that Vimeo rejects silently.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


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

Appendix: source

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

        audio_only: opts.audio_only,
        write_info: opts.write_info,
        video_password: opts.video_password.as_deref(),
        cookies: cookies.as_ref().map(|c| c.path.as_path()),
        ffmpeg: ffmpeg.as_deref(),
    };
    let args = download_args(&plan);
    let command = safe_command_line("yt-dlp", &args);
    tracing::info!("[vimeo] $ {}", command);
    report(progress, ID_PRIVATE, "progress", 0, Some(100), None);
    let p = progress.clone();
    let out = run_download(&bin, &args, &secrets, move |pctg| {
        report(&p, ID_PRIVATE, "progress", pctg as u64, Some(100), None);
    })
    .await?;
    if !out.success || out.file.is_none() {
        return Err(match error_code(&out.tail) {
            Some(code) => anyhow!("vimeo:{code}"),
            None if out.tail.trim().is_empty() => anyhow!("vimeo:unavailable"),
            None => anyhow!("{}", out.tail),
        });
    }
    report(progress, ID_PRIVATE, "done", 100, Some(100), None);
    let (meta_id, title) = out.meta.unwrap_or_default();
    Ok(PrivateResult {
        id: if id.is_empty() { meta_id } else { id },
        title,
        file: out.file,
        skipped: false,
        unlisted_hash,
        used_password,
        used_session,
        command,
    })
}

// ───────────────────────── testes ─────────────────────────

View on GitHub (pinned to 8600b91f42)