player_event_handler.rs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. use std::process::Command;
  2. use std::sync::mpsc::{channel, Sender};
  3. use std::thread;
  4. use std::collections::HashMap;
  5. use librespot::playback::player::PlayerEvent;
  6. fn run_program(program: &str, env_vars: HashMap<&str, String>) {
  7. let mut v: Vec<&str> = program.split_whitespace().collect();
  8. info!("Running {:?}", v);
  9. let status = Command::new(&v.remove(0))
  10. .args(&v)
  11. .envs(env_vars.iter())
  12. .status()
  13. .expect("program failed to start");
  14. info!("Exit status: {}", status);
  15. }
  16. pub fn run_program_on_events(onevent: String) -> Sender<PlayerEvent> {
  17. let (sender, receiver) = channel();
  18. thread::spawn(move || {
  19. while let Ok(msg) = receiver.recv() {
  20. let mut env_vars = HashMap::new();
  21. match msg {
  22. PlayerEvent::Changed { old_track_id, new_track_id } => {
  23. env_vars.insert("PLAYER_EVENT", "change".to_string());
  24. env_vars.insert("OLD_TRACK_ID", old_track_id.to_base16());
  25. env_vars.insert("TRACK_ID", new_track_id.to_base16());
  26. },
  27. PlayerEvent::Started { track_id } => {
  28. env_vars.insert("PLAYER_EVENT", "start".to_string());
  29. env_vars.insert("TRACK_ID", track_id.to_base16());
  30. }
  31. PlayerEvent::Stopped { track_id } => {
  32. env_vars.insert("PLAYER_EVENT", "stop".to_string());
  33. env_vars.insert("TRACK_ID", track_id.to_base16());
  34. }
  35. }
  36. run_program(&onevent, env_vars);
  37. }
  38. });
  39. sender
  40. }