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
- Verify the video opens in a browser; if it is gone, the error is expected and unrecoverable.
- Update yt-dlp to the latest version (`yt-dlp -U`) and retry.
- Check network/proxy connectivity and re-run; transient failures can surface as empty output.
- 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
- Pre-check that the video page still responds before batch runs
- Keep yt-dlp updated; stale versions often fail silently
- Distinguish 'gone forever' from transient network failure before alerting the user
- Log timestamps so flaky-network retries are visible
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
- o yt-dlp devolveu um JSON que não deu para ler
- o yt-dlp não está disponível
- não foi possível iniciar o yt-dlp
- vimeo:{code}
- {}
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)