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 delegates fetching to an external yt-dlp binary located via find_ytdlp_cached(). When no yt-dlp executable can be found on disk or in PATH, this error is thrown, telling the user to install it through the app's Settings screen.
Solutions
- Install yt-dlp from the app's Settings screen.
- Install yt-dlp manually (pip install yt-dlp or download the binary) and ensure it is on PATH.
- Point the app's ytdlp_path setting to an explicit yt-dlp executable location.
- Restart the app to refresh the cached lookup if yt-dlp was just installed.
Example fix
// before
let ytdlp_path = crate::core::ytdlp::find_ytdlp_cached()
.await
.ok_or_else(|| anyhow!("yt-dlp not found — install it in Settings"))?;
// after
let ytdlp_path = opts.ytdlp_path.clone()
.or_else(crate::core::ytdlp::find_ytdlp_cached().await)
.ok_or_else(|| anyhow!("yt-dlp not found — install it in Settings or set a custom path"))?; Defensive patterns
Strategy: validation
Validate before calling
// Check availability before relying on the yt-dlp path
if crate::core::ytdlp::find_ytdlp_cached().await.is_none() {
eprintln!("yt-dlp missing: install via Settings or PATH");
} Try / catch
match get_media_info(url).await {
Err(e) if e.to_string().contains("yt-dlp not found") => prompt_ytdlp_install(),
other => other,
} Prevention
- Install yt-dlp at setup time and verify it during app startup.
- Allow an explicit ytdlp_path setting for non-PATH installs.
- Re-scan for the binary after first-run installation instead of relying on cache.
When it happens
Trigger: Calling get_media_info which falls back to get_media_info_via_ytdlp when the native scraper fails, while opts/settings have no configured yt-dlp path and find_ytdlp_cached() finds no installed binary.
Common situations: Fresh install without yt-dlp; yt-dlp removed from PATH; corrupted download of the bundled binary; native TikTok scraper failed (blocked) so the fallback runs.
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 — install it in Settings
- yt-dlp not found
- yt-dlp not found
- 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/4693f8b82f32c47b.
Report an issue: GitHub.
Appendix: source
Thrown at src-tauri/src/platforms/tiktok/mod.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)