{"record":{"id":"63aa2e9e3895f664","repo":"tonhowtf/omniget","slug":"vimeo-unavailable","errorCode":"vimeo:unavailable","errorMessage":"vimeo:unavailable","messagePattern":"vimeo:unavailable","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/vimeo.rs","lineNumber":1161,"sourceCode":"        audio_only: opts.audio_only,\n        write_info: opts.write_info,\n        video_password: opts.video_password.as_deref(),\n        cookies: cookies.as_ref().map(|c| c.path.as_path()),\n        ffmpeg: ffmpeg.as_deref(),\n    };\n    let args = download_args(&plan);\n    let command = safe_command_line(\"yt-dlp\", &args);\n    tracing::info!(\"[vimeo] $ {}\", command);\n    report(progress, ID_PRIVATE, \"progress\", 0, Some(100), None);\n    let p = progress.clone();\n    let out = run_download(&bin, &args, &secrets, move |pctg| {\n        report(&p, ID_PRIVATE, \"progress\", pctg as u64, Some(100), None);\n    })\n    .await?;\n    if !out.success || out.file.is_none() {\n        return Err(match error_code(&out.tail) {\n            Some(code) => anyhow!(\"vimeo:{code}\"),\n            None if out.tail.trim().is_empty() => anyhow!(\"vimeo:unavailable\"),\n            None => anyhow!(\"{}\", out.tail),\n        });\n    }\n    report(progress, ID_PRIVATE, \"done\", 100, Some(100), None);\n    let (meta_id, title) = out.meta.unwrap_or_default();\n    Ok(PrivateResult {\n        id: if id.is_empty() { meta_id } else { id },\n        title,\n        file: out.file,\n        skipped: false,\n        unlisted_hash,\n        used_password,\n        used_session,\n        command,\n    })\n}\n\n// ───────────────────────── testes ─────────────────────────","sourceCodeStart":1143,"sourceCodeEnd":1179,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/vimeo.rs#L1143-L1179","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nawait vimeoPrivate({ url });\n// after\ntry {\n  await vimeoPrivate({ url });\n} catch (e) {\n  if (String(e).includes(\"vimeo:unavailable\")) {\n    const ok = await confirmVideoStillExists(url);\n    if (ok) await retryWithBackoff(() => vimeoPrivate({ url }), 2);\n    else showVideoGoneNotice();\n  } else throw e;\n}","handlingStrategy":"retry","validationCode":"const head = await fetch(`https://vimeo.com/${id}`, { method: \"HEAD\" });\nif (head.status === 404) throw new Error(\"video no longer exists; skip download\");","typeGuard":null,"tryCatchPattern":"try {\n  await vimeoPrivate({ url });\n} catch (e) {\n  if (String(e).includes(\"vimeo:unavailable\")) {\n    await retryWithBackoff(() => vimeoPrivate({ url }), { tries: 2, baseMs: 2000 });\n  } else throw e;\n}","preventionTips":["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"],"tags":["vimeo","yt-dlp","unavailable","download-failure"],"backgroundTag":"http-request-failed","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}