tonhowtf/omniget · error
yt-dlp not found — install it in Settings
Error message
yt-dlp not found — install it in Settings
What it means
get_media_info_via_ytdlp requires the external yt-dlp binary and looks it up via crate::core::ytdlp::find_ytdlp_cached(). When the lookup returns None — yt-dlp is not installed, not on PATH, or not configured in app settings — this error is raised directing the user to install it in Settings.
Solutions
- Install yt-dlp from the app's Settings screen (the bundled installer).
- Or install yt-dlp system-wide (pip install -U yt-dlp or brew install yt-dlp) so it is on PATH.
- Set the explicit ytdlp_path option to a known yt-dlp binary location.
- Verify with `yt-dlp --version` that the binary is executable, then retry.
Example fix
// before: hard failure when yt-dlp missing
let info = tiktok.get_media_info(url).await?;
// after: pre-check and guide the user
if crate::core::ytdlp::find_ytdlp_cached().await.is_none() {
eprintln!("yt-dlp not found — install it in Settings");
return Err(anyhow!("yt-dlp not found — install it in Settings"));
}
let info = tiktok.get_media_info(url).await?; Defensive patterns
Strategy: validation
Validate before calling
// check before invoking any yt-dlp path
if which("yt-dlp").is_err() {
return Err(anyhow!("yt-dlp not found — install it in Settings"));
} Type guard
fn has_ytdlp() -> bool { std::process::Command::new("yt-dlp").arg("--version").output().map(|o| o.status.success()).unwrap_or(false) } Try / catch
match tiktok.get_media_info(url).await {
Err(e) if e.to_string().contains("yt-dlp not found") => Err(InstallYtdlpUserAction),
other => other,
} Prevention
- Install yt-dlp during app setup, not lazily at first failure.
- Pin and ship a known-good yt-dlp binary with the app.
- Expose a Settings check that validates yt-dlp presence at startup.
- Pass an explicit ytdlp_path instead of relying on PATH lookup.
When it happens
Trigger: get_media_info falls back to get_media_info_via_ytdlp (e.g. after the direct scrape failed) and find_ytdlp_cached() resolves to None; also invoked directly when ytdlp_path is not supplied and no cached binary is found.
Common situations: Fresh install where yt-dlp was never downloaded; yt-dlp removed from PATH after a system update; bundled binary failed to download in Settings; running in a container/image without yt-dlp; YouTube/TikTok blocking forcing reliance on the fallback.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- yt-dlp not found
- yt-dlp not found
- yt-dlp not found — install it in Settings
- yt-dlp not found
- yt-dlp not found in PATH or app data dir
AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12).
Data as JSON: /api/errors/58538aa6de6583ac.
Report an issue: GitHub.
Appendix: source
Thrown at src-tauri/omniget-core/src/platforms/tiktok.rs:320
];
let json = crate::core::ytdlp::get_video_info(&ytdlp_path, url, &extra_flags).await?;
let mut info =
crate::platforms::generic_ytdlp::GenericYtdlpDownloader::parse_video_info(&json)?;
for q in &mut info.available_qualities {
q.url = url.to_string();
q.format = "ytdlp".to_string();
}
Ok(info)
}
async fn get_media_info_via_ytdlp(
&self,
url: &str,
post_id: &str,
) -> anyhow::Result<MediaInfo> {
let ytdlp_path = crate::core::ytdlp::find_ytdlp_cached()
.await
.ok_or_else(|| anyhow!("yt-dlp not found — install it in Settings"))?;
let extra_flags = vec![
"--referer".to_string(),
"https://www.tiktok.com/".to_string(),
];
let json = crate::core::ytdlp::get_video_info(&ytdlp_path, url, &extra_flags).await?;
let title = json
.get("title")
.and_then(|v| v.as_str())
.map(|s| format!("tiktok_{}", sanitize_filename::sanitize(s)))
.unwrap_or_else(|| format!("tiktok_{}", post_id));
let author = json
.get("uploader")
.or_else(|| json.get("creator"))
.and_then(|v| v.as_str())View on GitHub (pinned to 8600b91f42)