diff options
-rw-r--r-- | src/playprogram.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/playprogram.rs b/src/playprogram.rs index 0e13161..4cf00bf 100644 --- a/src/playprogram.rs +++ b/src/playprogram.rs @@ -7,6 +7,7 @@ use std::ffi::OsStr; use std::fs; use std::io; use std::path::PathBuf; +use std::time::SystemTime; extern crate rand; use rand::seq::SliceRandom; @@ -23,6 +24,7 @@ pub trait PlayProgram { pub struct Linear { base_dir: String, + base_dir_mtime: SystemTime, items: Vec<PathBuf>, pos: usize, num_play: usize, @@ -30,6 +32,7 @@ pub struct Linear { pub struct Shuffle { base_dir: String, + base_dir_mtime: SystemTime, items: Vec<PathBuf>, pos: usize, num_play: usize, @@ -37,6 +40,7 @@ pub struct Shuffle { pub struct Random { base_dir: String, + base_dir_mtime: SystemTime, items: Vec<PathBuf>, num_play: usize, } @@ -137,6 +141,13 @@ fn load_files_nonrec(from: &String, items: &mut Vec<PathBuf>) -> io::Result<()> Ok(()) } +fn source_has_changed(dir: &String, dir_mtime: SystemTime) -> io::Result<bool> { + let metadata = fs::metadata(&dir)?; + let mtime = metadata.modified().unwrap(); + + Ok(mtime != dir_mtime) +} + impl Linear { pub fn new(cfg: &config::PlayListConfig) -> io::Result<Linear> { let num_play = match cfg.extra.get("num_play") { @@ -144,8 +155,11 @@ impl Linear { Some(v) => v.parse::<usize>().unwrap_or(1), }; + let metadata = fs::metadata(&cfg.source)?; + let mut pl = Linear { base_dir: String::from(&cfg.source), + base_dir_mtime: metadata.modified().unwrap(), num_play: num_play, items: Vec::new(), pos: 0, @@ -161,6 +175,12 @@ impl Linear { impl PlayProgram for Linear { fn start(&mut self, backend: &mut dyn PlayerBackend) -> io::Result<()> { + if source_has_changed(&self.base_dir, self.base_dir_mtime)? { + self.items = Vec::new(); + self.pos = 0; + load_files_nonrec(&self.base_dir, &mut self.items)?; + } + generic_start_play(backend, &self.items, self.pos, self.num_play)?; Ok(()) @@ -186,8 +206,11 @@ impl Shuffle { Some(v) => v.parse::<usize>().unwrap_or(1), }; + let metadata = fs::metadata(&cfg.source)?; + let mut pl = Shuffle { base_dir: String::from(&cfg.source), + base_dir_mtime: metadata.modified().unwrap(), num_play: num_play, items: Vec::new(), pos: 0, @@ -203,6 +226,12 @@ impl Shuffle { impl PlayProgram for Shuffle { fn start(&mut self, backend: &mut dyn PlayerBackend) -> io::Result<()> { + if source_has_changed(&self.base_dir, self.base_dir_mtime)? { + self.items = Vec::new(); + self.pos = 0; + load_files_nonrec(&self.base_dir, &mut self.items)?; + } + self.pos = generic_start_play(backend, &self.items, self.pos, self.num_play)?; Ok(()) @@ -235,8 +264,11 @@ impl Random { Some(v) => v.parse::<usize>().unwrap_or(1), }; + let metadata = fs::metadata(&cfg.source)?; + let mut pl = Random { base_dir: String::from(&cfg.source), + base_dir_mtime: metadata.modified().unwrap(), num_play: num_play, items: Vec::new(), }; @@ -249,6 +281,11 @@ impl Random { impl PlayProgram for Random { fn start(&mut self, backend: &mut dyn PlayerBackend) -> io::Result<()> { + if source_has_changed(&self.base_dir, self.base_dir_mtime)? { + self.items = Vec::new(); + load_files_nonrec(&self.base_dir, &mut self.items)?; + } + self.items.shuffle(&mut thread_rng()); generic_start_play(backend, &self.items, 0, self.num_play)?; |