diff options
author | Richard Weinberger <richard@nod.at> | 2021-11-25 23:51:17 +0100 |
---|---|---|
committer | Richard Weinberger <richard@nod.at> | 2021-12-16 21:15:31 +0100 |
commit | 02e6819da88aa48e8bc48ce369bc3db482fc5c87 (patch) | |
tree | 2e13c93e2e567b2bac67e3d4377d2c64b27d59ed | |
parent | 13bb2bc5317f15f2263041f6d9722230b79f68a0 (diff) | |
download | geschichte-02e6819da88aa48e8bc48ce369bc3db482fc5c87.tar.gz |
Reload source files is mtime has changed.
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)?; |