diff --git a/src/main.rs b/src/main.rs index d738de0..ab5f2d2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ use log4rs; use config::Config; -use repository::Repository; -use transcoder::Transcoder; +use transcoder::repository::Repository; +use transcoder::transcoder::Transcoder; mod config; -mod repository; mod transcoder; +mod util; fn main() { // initialize the log4rs logger diff --git a/src/transcoder/mod.rs b/src/transcoder/mod.rs new file mode 100644 index 0000000..5886b2e --- /dev/null +++ b/src/transcoder/mod.rs @@ -0,0 +1,2 @@ +pub mod repository; +pub mod transcoder; \ No newline at end of file diff --git a/src/repository.rs b/src/transcoder/repository.rs similarity index 100% rename from src/repository.rs rename to src/transcoder/repository.rs diff --git a/src/transcoder.rs b/src/transcoder/transcoder.rs similarity index 87% rename from src/transcoder.rs rename to src/transcoder/transcoder.rs index 7baeaee..2a2fbbc 100644 --- a/src/transcoder.rs +++ b/src/transcoder/transcoder.rs @@ -4,7 +4,8 @@ use std::{thread, time}; use log::{info}; use crate::config::Config; -use crate::repository::Repository; +use crate::util::io; +use super::repository::Repository; pub struct Transcoder { config: Config, @@ -31,6 +32,12 @@ impl Transcoder { info!("There were no files found in ingest to transcode; skipping run."); } else { for i in ingest_files { + let ingest_path = Path::new(&self.repository.ingest_dir).join(&i); + if io::is_file_locked(&ingest_path.to_str().unwrap()) { + info!("{} is currently open in another program; skipping it for this run.", &i); + continue; + } + // copy the file to the archive self.repository.archive_file(&i); diff --git a/src/util/io.rs b/src/util/io.rs new file mode 100644 index 0000000..ee6bd66 --- /dev/null +++ b/src/util/io.rs @@ -0,0 +1,16 @@ +use std::process; + +// checks whether a file is currently open in another program (e.g. still being written) +pub fn is_file_locked(filepath: &str) -> bool { + let cmd = process::Command::new("/usr/bin/lsof") + .arg(filepath) + .output() + .expect("Failed to execute command"); + + let results = &String::from_utf8_lossy(&cmd.stdout); + if results.contains(filepath) { + return true; + } + + return false; +} diff --git a/src/util/mod.rs b/src/util/mod.rs new file mode 100644 index 0000000..678b90e --- /dev/null +++ b/src/util/mod.rs @@ -0,0 +1 @@ +pub mod io; \ No newline at end of file