Added a basic check to make sure we don't try to transcode a partially written file
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				ci/woodpecker/push/woodpecker Pipeline was successful
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	ci/woodpecker/push/woodpecker Pipeline was successful
				
			This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								src/transcoder/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/transcoder/mod.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
pub mod repository;
 | 
			
		||||
pub mod transcoder;
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								src/util/io.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/util/io.rs
									
									
									
									
									
										Normal file
									
								
							@@ -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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								src/util/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/util/mod.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
pub mod io;
 | 
			
		||||
		Reference in New Issue
	
	Block a user