summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2021-11-25 23:51:17 +0100
committerRichard Weinberger <richard@nod.at>2021-11-25 23:51:17 +0100
commit5d54ec00ec4fc4a94d44a9dc77db7a79de083121 (patch)
tree2e13c93e2e567b2bac67e3d4377d2c64b27d59ed
parent4c99d67c341b5723a1526d4dcfd112e6a4350b1f (diff)
downloadgeschiche-5d54ec00ec4fc4a94d44a9dc77db7a79de083121.tar.gz
Reload source files is mtime has changed.HEADmaster
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.rs37
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)?;