summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)?;