summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2021-11-25 23:51:17 +0100
committerRichard Weinberger <richard@nod.at>2021-12-16 21:15:31 +0100
commit02e6819da88aa48e8bc48ce369bc3db482fc5c87 (patch)
tree2e13c93e2e567b2bac67e3d4377d2c64b27d59ed
parent13bb2bc5317f15f2263041f6d9722230b79f68a0 (diff)
downloadgeschichte-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.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)?;