diff options
author | Richard Weinberger <richard@nod.at> | 2021-11-25 23:51:17 +0100 |
---|---|---|
committer | Richard Weinberger <richard@nod.at> | 2021-11-25 23:51:17 +0100 |
commit | 5d54ec00ec4fc4a94d44a9dc77db7a79de083121 (patch) | |
tree | 2e13c93e2e567b2bac67e3d4377d2c64b27d59ed | |
parent | 4c99d67c341b5723a1526d4dcfd112e6a4350b1f (diff) | |
download | geschiche-5d54ec00ec4fc4a94d44a9dc77db7a79de083121.tar.gz |
If the mtime of the source directory has changed, reload
all files and set the cursor to 0.
The code assumes that the target platform supports mtime.
Signed-off-by: Richard Weinberger <richard@nod.at>
-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)?; |