Skip to main content

viser_ffmpeg/
path.rs

1use std::env;
2use std::path::PathBuf;
3
4/// Returns the path to the ffmpeg binary.
5///
6/// Resolution order:
7/// 1. `VISER_FFMPEG` environment variable
8/// 2. `bin/ffmpeg/ffmpeg` relative to the working directory
9/// 3. `"ffmpeg"` (system PATH)
10pub fn ffmpeg_path() -> String {
11    if let Ok(p) = env::var("VISER_FFMPEG") {
12        if !p.is_empty() {
13            return p;
14        }
15    }
16    if let Some(p) = local_binary("ffmpeg") {
17        return p;
18    }
19    "ffmpeg".into()
20}
21
22/// Returns the path to the ffprobe binary.
23///
24/// Resolution order:
25/// 1. `VISER_FFPROBE` environment variable
26/// 2. `bin/ffmpeg/ffprobe` relative to the working directory
27/// 3. `"ffprobe"` (system PATH)
28pub fn ffprobe_path() -> String {
29    if let Ok(p) = env::var("VISER_FFPROBE") {
30        if !p.is_empty() {
31            return p;
32        }
33    }
34    if let Some(p) = local_binary("ffprobe") {
35        return p;
36    }
37    "ffprobe".into()
38}
39
40fn local_binary(name: &str) -> Option<String> {
41    let mut path = PathBuf::from("bin").join("ffmpeg");
42    if cfg!(windows) {
43        path = path.join(format!("{name}.exe"));
44    } else {
45        path = path.join(name);
46    }
47    if path.exists() { Some(path.to_string_lossy().into_owned()) } else { None }
48}