diff --git a/src/mpd.rs b/src/mpd.rs index 5e8e6be..1d8de72 100644 --- a/src/mpd.rs +++ b/src/mpd.rs @@ -84,23 +84,31 @@ impl MpdClient { } pub fn queue_playlist(&mut self, tracks: &[String], music_dir: &str) { - if let Err(e) = self.update_and_wait() { - eprintln!("MPD update: {e}"); - } - if let Err(e) = self.send_command("clear") { eprintln!("MPD clear: {e}"); return; } + let mut failed: Vec = Vec::new(); + for track in tracks { - let uri = track - .strip_prefix(music_dir) - .map(|p| p.trim_start_matches('/')) - .unwrap_or(track); + let uri = Self::track_to_uri(track, music_dir); let escaped = uri.replace('\\', "\\\\").replace('"', "\\\""); - if let Err(e) = self.send_command(&format!("add \"{escaped}\"")) { - eprintln!("MPD add {uri}: {e}"); + if self.send_command(&format!("add \"{escaped}\"")).is_err() { + failed.push(uri.to_string()); + } + } + + // If some tracks failed, update MPD's DB and retry them + if !failed.is_empty() { + eprintln!("MPD: {} tracks not found, updating database...", failed.len()); + if self.update_and_wait().is_ok() { + for uri in &failed { + let escaped = uri.replace('\\', "\\\\").replace('"', "\\\""); + if let Err(e) = self.send_command(&format!("add \"{escaped}\"")) { + eprintln!("MPD add {uri}: {e}"); + } + } } } @@ -108,4 +116,11 @@ impl MpdClient { eprintln!("MPD play: {e}"); } } + + fn track_to_uri<'a>(track: &'a str, music_dir: &str) -> &'a str { + track + .strip_prefix(music_dir) + .map(|p| p.trim_start_matches('/')) + .unwrap_or(track) + } }