Player: launch external player via play-external IPC
Some checks are pending
Continuous integration / test (push) Waiting to run

This commit is contained in:
Timothy Z. 2026-05-11 01:35:53 +03:00
parent bbbe882faf
commit 368a0062ed

View file

@ -298,6 +298,52 @@ impl MainWindow {
}
}
}
Some("play-external") => {
if let Some(arg) = msg.get_params() {
let arg = arg.as_str().unwrap_or("");
let arg_lc = arg.to_lowercase();
const ALLOWED_SCHEMES: &[&str] = &["mpv://", "vlc://", "potplayer://"];
let allowed = ALLOWED_SCHEMES.iter().any(|s| arg_lc.starts_with(s));
if !arg.is_empty() && allowed {
if let Some(stream_url) =
arg_lc.starts_with("mpv://").then(|| &arg[6..])
{
// `--` ends mpv's option parsing; the stream URL can't smuggle flags.
let mpv_paths: Vec<String> = vec![
std::env::var("ProgramFiles")
.ok()
.map(|v| format!("{v}\\mpv\\mpv.exe")),
std::env::var("ProgramFiles(x86)")
.ok()
.map(|v| format!("{v}\\mpv\\mpv.exe")),
std::env::var("LOCALAPPDATA")
.ok()
.map(|v| format!("{v}\\Programs\\mpv\\mpv.exe")),
std::env::var("LOCALAPPDATA")
.ok()
.map(|v| format!("{v}\\mpv\\mpv.exe")),
Some("mpv.exe".to_string()),
]
.into_iter()
.flatten()
.collect();
for path in &mpv_paths {
if Command::new(path)
.arg("--")
.arg(stream_url)
.creation_flags(CREATE_BREAKAWAY_FROM_JOB)
.spawn()
.is_ok()
{
break;
}
}
} else {
open::that(arg).ok();
}
}
}
}
Some("win-focus") => {
focus_sender.notice();
}