player_event_handler.rs 1.4 KB

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