diff --git a/src/utils/json_reader.rs b/src/utils/json_reader.rs
index 6ef1e3bc..561ec5a5 100644
--- a/src/utils/json_reader.rs
+++ b/src/utils/json_reader.rs
@@ -26,7 +26,7 @@ impl Playlist {
date,
start_sec: Some(start),
current_file: None,
- modified: None,
+ modified: Some("".to_string()),
program: vec![media],
}
}
@@ -51,7 +51,7 @@ pub fn read_json(config: &Config, seek: bool, next_start: f64) -> Playlist {
if !playlist_path.is_file() {
error!("Playlist {}> not exists!", current_file);
- // let dummy_playlist = Playlist::new(date, get_sec());
+
return Playlist::new(date, start_sec);
}
@@ -63,7 +63,7 @@ pub fn read_json(config: &Config, seek: bool, next_start: f64) -> Playlist {
playlist.current_file = Some(current_file.clone());
playlist.start_sec = Some(start_sec.clone());
- let modify = modified_time(current_file);
+ let modify = modified_time(¤t_file);
if modify.is_some() {
playlist.modified = Some(modify.unwrap().to_string());
diff --git a/src/utils/mod.rs b/src/utils/mod.rs
index 5b12cdd6..5ed54713 100644
--- a/src/utils/mod.rs
+++ b/src/utils/mod.rs
@@ -171,7 +171,7 @@ pub fn get_date(seek: bool, start: f64, next_start: f64) -> String {
local.format("%Y-%m-%d").to_string()
}
-pub fn modified_time(path: String) -> Option> {
+pub fn modified_time(path: &String) -> Option> {
let metadata = metadata(path).unwrap();
if let Ok(time) = metadata.modified() {
diff --git a/src/utils/playlist.rs b/src/utils/playlist.rs
index 34979577..d382c9b7 100644
--- a/src/utils/playlist.rs
+++ b/src/utils/playlist.rs
@@ -3,7 +3,7 @@ use std::path::Path;
use simplelog::*;
use crate::utils::{
- check_sync, gen_dummy, get_delta, get_sec, json_reader::read_json, modified_time,
+ check_sync, gen_dummy, get_delta, get_sec, is_close, json_reader::read_json, modified_time,
seek_and_length, Config, Media, DUMMY_LEN,
};
@@ -36,73 +36,71 @@ impl CurrentProgram {
}
fn check_update(&mut self) {
- match self.json_path.clone() {
- Some(path) => {
- if Path::new(&path).is_file() {
- let mod_time = modified_time(path);
-
- if !mod_time
- .unwrap()
- .to_string()
- .eq(&self.json_mod.clone().unwrap())
- {
- // when playlist has changed, reload it
- let json = read_json(&self.config, false, 0.0);
-
- self.json_mod = json.modified;
- self.nodes = json.program;
- }
- } else {
- error!("Playlist {}> not exists!", path);
- let mut media = Media::new(0, "".to_string());
- media.begin = Some(get_sec());
- media.duration = DUMMY_LEN;
- media.out = DUMMY_LEN;
-
- self.json_path = None;
- self.nodes = vec![media.clone()];
- self.current_node = media;
- self.init = true;
- self.index = 0;
- }
- }
-
- _ => (),
- }
- }
-
- fn check_for_next_playlist(&mut self) {
- // let current_time = get_sec();
- let mut out = self.current_node.out.clone();
- let seek = self.current_node.seek.clone();
- let start_sec = self.config.playlist.start_sec.unwrap();
- let (mut delta, _) = get_delta(&self.current_node.begin.unwrap().clone(), &self.config);
- let mut is_over_time = false;
-
- if self.current_node.duration > self.current_node.out {
- out = self.current_node.duration.clone()
- }
-
- if self.index == self.nodes.len() - 1 {
- delta += self.config.general.stop_threshold;
-
- if get_sec() >= start_sec {
- is_over_time = true;
- }
- }
-
- let next_start = self.current_node.begin.unwrap() - start_sec + out - seek + delta;
-
- if next_start >= self.config.playlist.length_sec.unwrap() || is_over_time {
- let json = read_json(&self.config, false, next_start);
+ if self.json_path.is_none() {
+ let json = read_json(&self.config, false, 0.0);
self.json_path = json.current_file;
self.json_mod = json.modified;
self.nodes = json.program;
+ } else if Path::new(&self.json_path.clone().unwrap()).is_file() {
+ let mod_time = modified_time(&self.json_path.clone().unwrap());
+
+ if !mod_time
+ .unwrap()
+ .to_string()
+ .eq(&self.json_mod.clone().unwrap())
+ {
+ // when playlist has changed, reload it
+ let json = read_json(&self.config, false, 0.0);
+
+ self.json_mod = json.modified;
+ self.nodes = json.program;
+ }
+ } else {
+ error!("Playlist {}> not exists!", self.json_path.clone().unwrap());
+ let mut media = Media::new(0, "".to_string());
+ media.begin = Some(get_sec());
+ media.duration = DUMMY_LEN;
+ media.out = DUMMY_LEN;
+
+ self.json_path = None;
+ self.nodes = vec![media.clone()];
+ self.current_node = media;
+ self.init = true;
self.index = 0;
}
}
+ fn check_for_next_playlist(&mut self) {
+ let current_time = get_sec();
+ let start_sec = self.config.playlist.start_sec.unwrap();
+ let target_length = self.config.playlist.length_sec.unwrap();
+ let (delta, total_delta) = get_delta(¤t_time, &self.config);
+ let mut duration = self.current_node.out.clone();
+
+ if self.current_node.duration > self.current_node.out {
+ duration = self.current_node.duration.clone()
+ }
+
+ let next_start = self.current_node.begin.unwrap() - start_sec + duration + delta;
+
+ if next_start >= target_length
+ || is_close(total_delta, 0.0, 2.0)
+ || is_close(total_delta, target_length, 2.0)
+ {
+ let json = read_json(&self.config, false, next_start);
+
+ self.json_path = json.current_file.clone();
+ self.json_mod = json.modified;
+ self.nodes = json.program;
+ self.index = 0;
+
+ if json.current_file.is_none() {
+ self.init = true;
+ }
+ }
+ }
+
fn is_ad(&mut self, i: usize, next: bool) -> Option {
if next {
if i + 1 < self.nodes.len() && self.nodes[i + 1].category == "advertisement".to_string()
@@ -152,19 +150,26 @@ impl Iterator for CurrentProgram {
fn next(&mut self) -> Option {
if self.init {
debug!("Playlist init");
+ self.check_update();
if self.json_path.is_some() {
self.get_init_clip();
}
if self.init {
+ // on init load playlist, could be not long enough,
+ // so we check if we can take the next playlist already,
+ // or we fill the gap with a dummy.
self.current_node = self.nodes[self.nodes.len() - 1].clone();
self.check_for_next_playlist();
let new_node = self.nodes[self.nodes.len() - 1].clone();
let new_length = new_node.begin.unwrap() + new_node.duration;
- if new_length >= self.config.playlist.length_sec.unwrap() + self.config.playlist.start_sec.unwrap() {
+ if new_length
+ >= self.config.playlist.length_sec.unwrap()
+ + self.config.playlist.start_sec.unwrap()
+ {
self.get_init_clip();
} else {
let mut current_time = get_sec();
@@ -209,23 +214,17 @@ impl Iterator for CurrentProgram {
self.current_node.next_ad = self.is_ad(self.index, true);
self.index += 1;
- // if self.current_node.process.unwrap() {
- // self.index += 1;
- // } else {
- // self.index = 0;
- // println!("go to next");
- // self.current_node.begin = self.config.playlist.start_sec;
- // // self.get_new_playlist();
- // }
-
Some(self.current_node.clone())
} else {
let last_playlist = self.json_path.clone();
self.check_for_next_playlist();
- let (_, total_delta) = get_delta(&self.config.playlist.start_sec.unwrap(), &self.config);
+ let (_, total_delta) =
+ get_delta(&self.config.playlist.start_sec.unwrap(), &self.config);
let mut last_ad = self.is_ad(self.index, false);
- if last_playlist == self.json_path && total_delta.abs() > self.config.general.stop_threshold {
+ if last_playlist == self.json_path
+ && total_delta.abs() > self.config.general.stop_threshold
+ {
println!("Test if we have to fill");
// Test if playlist is to early finish,
// and if we have to fill it with a placeholder.
@@ -366,7 +365,10 @@ fn handle_list_end(mut node: Media, total_delta: f64) -> Media {
{
node.out = out;
} else if node.duration > total_delta && total_delta < 1.0 {
- warn!("Last clip less then 1 second long, skip: {}>", node.source);
+ warn!(
+ "Last clip less then 1 second long, skip: {}>",
+ node.source
+ );
node.out = out;
node.cmd = Some(seek_and_length(
node.source.clone(),