player_event_handler.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. use log::info;
  2. use librespot::playback::player::PlayerEvent;
  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. run_program(onevent, env_vars)
  36. }