player_event_handler.rs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. use librespot::playback::player::PlayerEvent;
  2. use tokio_process::{Child, CommandExt};
  3. use std::collections::HashMap;
  4. use std::io;
  5. use std::process::Command;
  6. fn run_program(program: &str, env_vars: HashMap<&str, String>) -> io::Result<Child> {
  7. let mut v: Vec<&str> = program.split_whitespace().collect();
  8. info!("Running {:?} with environment variables {:?}", v, env_vars);
  9. Command::new(&v.remove(0))
  10. .args(&v)
  11. .envs(env_vars.iter())
  12. .spawn_async()
  13. }
  14. pub fn run_program_on_events(event: PlayerEvent, onevent: &str) -> io::Result<Child> {
  15. let mut env_vars = HashMap::new();
  16. match event {
  17. PlayerEvent::Changed {
  18. old_track_id,
  19. new_track_id,
  20. } => {
  21. env_vars.insert("PLAYER_EVENT", "change".to_string());
  22. env_vars.insert("OLD_TRACK_ID", old_track_id.to_base62());
  23. env_vars.insert("TRACK_ID", new_track_id.to_base62());
  24. }
  25. PlayerEvent::Started { track_id } => {
  26. env_vars.insert("PLAYER_EVENT", "start".to_string());
  27. env_vars.insert("TRACK_ID", track_id.to_base62());
  28. }
  29. PlayerEvent::Stopped { track_id } => {
  30. env_vars.insert("PLAYER_EVENT", "stop".to_string());
  31. env_vars.insert("TRACK_ID", track_id.to_base62());
  32. }
  33. }
  34. run_program(onevent, env_vars)
  35. }