|
@@ -1,50 +1,42 @@
|
|
|
use std::process::Command;
|
|
|
use std::sync::mpsc::{channel, Sender};
|
|
|
use std::thread;
|
|
|
+use std::collections::HashMap;
|
|
|
use librespot::playback::player::PlayerEvent;
|
|
|
|
|
|
-fn run_program(program: &str, args: Vec<String>) {
|
|
|
- info!("Running {}", program);
|
|
|
+fn run_program(program: &str, env_vars: HashMap<&str, String>) {
|
|
|
let mut v: Vec<&str> = program.split_whitespace().collect();
|
|
|
+ info!("Running {:?}", v);
|
|
|
let status = Command::new(&v.remove(0))
|
|
|
.args(&v)
|
|
|
- .args(args)
|
|
|
+ .envs(env_vars.iter())
|
|
|
.status()
|
|
|
.expect("program failed to start");
|
|
|
info!("Exit status: {}", status);
|
|
|
}
|
|
|
|
|
|
-pub fn run_program_on_events(onstart: Option<String>,
|
|
|
- onstop: Option<String>,
|
|
|
- onchange: Option<String>) -> Option<Sender<PlayerEvent>> {
|
|
|
- if onstart.is_none() && onstop.is_none() && onchange.is_none() {
|
|
|
- None
|
|
|
- } else {
|
|
|
- let (sender, receiver) = channel();
|
|
|
- thread::spawn(move || {
|
|
|
- while let Ok(msg) = receiver.recv() {
|
|
|
- match msg {
|
|
|
- PlayerEvent::Changed { old_track_id, new_track_id } => {
|
|
|
- let args = vec![old_track_id.to_base16(), new_track_id.to_base16()];
|
|
|
- if let Some(ref onchange) = onchange.as_ref() {
|
|
|
- run_program(onchange, args);
|
|
|
- }
|
|
|
- },
|
|
|
- PlayerEvent::Started { track_id } => {
|
|
|
- let args = vec![track_id.to_base16()];
|
|
|
- if let Some(ref onstart) = onstart.as_ref() {
|
|
|
- run_program(onstart, args);
|
|
|
- }
|
|
|
- }
|
|
|
- PlayerEvent::Stopped { track_id } => {
|
|
|
- let args = vec![track_id.to_base16()];
|
|
|
- if let Some(ref onstop) = onstop.as_ref() {
|
|
|
- run_program(onstop, args);
|
|
|
- }
|
|
|
- }
|
|
|
+pub fn run_program_on_events(onevent: String) -> Sender<PlayerEvent> {
|
|
|
+ let (sender, receiver) = channel();
|
|
|
+ thread::spawn(move || {
|
|
|
+ while let Ok(msg) = receiver.recv() {
|
|
|
+ let mut env_vars = HashMap::new();
|
|
|
+ match msg {
|
|
|
+ PlayerEvent::Changed { old_track_id, new_track_id } => {
|
|
|
+ env_vars.insert("PLAYER_EVENT", "change".to_string());
|
|
|
+ env_vars.insert("OLD_TRACK_ID", old_track_id.to_base16());
|
|
|
+ env_vars.insert("TRACK_ID", new_track_id.to_base16());
|
|
|
+ },
|
|
|
+ PlayerEvent::Started { track_id } => {
|
|
|
+ env_vars.insert("PLAYER_EVENT", "start".to_string());
|
|
|
+ env_vars.insert("TRACK_ID", track_id.to_base16());
|
|
|
+ }
|
|
|
+ PlayerEvent::Stopped { track_id } => {
|
|
|
+ env_vars.insert("PLAYER_EVENT", "stop".to_string());
|
|
|
+ env_vars.insert("TRACK_ID", track_id.to_base16());
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
- Some(sender)
|
|
|
- }
|
|
|
+ run_program(&onevent, env_vars);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ sender
|
|
|
}
|