Compare commits
	
		
			15 Commits
		
	
	
		
			v0.2.1
			...
			e479959ca8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e479959ca8 | |||
| ef492f6008 | |||
| 6371417234 | |||
| a7cc2bc771 | |||
| ed4173f3dc | |||
| f3552f3af1 | |||
| 6da120f632 | |||
| a22b59d87c | |||
| dfca3b1fd6 | |||
| 530d83f57d | |||
| d836e27305 | |||
| 8bca6b3b0b | |||
| 958ffa397c | |||
| 1671b95128 | |||
| 3bcbabf1b6 | 
@@ -30,3 +30,49 @@ pipeline:
 | 
				
			|||||||
      title: "${CI_COMMIT_TAG}"
 | 
					      title: "${CI_COMMIT_TAG}"
 | 
				
			||||||
    when:
 | 
					    when:
 | 
				
			||||||
      event: tag
 | 
					      event: tag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  copy_deb_package:
 | 
				
			||||||
 | 
					    image: appleboy/drone-scp
 | 
				
			||||||
 | 
					    settings:
 | 
				
			||||||
 | 
					      host: "repo.int.metaunix.net"
 | 
				
			||||||
 | 
					      username:
 | 
				
			||||||
 | 
					        from_secret: repo_admin
 | 
				
			||||||
 | 
					      password:
 | 
				
			||||||
 | 
					        from_secret: repo_password
 | 
				
			||||||
 | 
					      port: 22
 | 
				
			||||||
 | 
					      target: /srv/repo/apt/zealot/
 | 
				
			||||||
 | 
					      source: target/debian/zealot*.deb
 | 
				
			||||||
 | 
					      strip_components: 2
 | 
				
			||||||
 | 
					    when:
 | 
				
			||||||
 | 
					      event: tag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  copy_rpm_package:
 | 
				
			||||||
 | 
					    image: appleboy/drone-scp
 | 
				
			||||||
 | 
					    settings:
 | 
				
			||||||
 | 
					      host: "repo.int.metaunix.net"
 | 
				
			||||||
 | 
					      username:
 | 
				
			||||||
 | 
					        from_secret: repo_admin
 | 
				
			||||||
 | 
					      password:
 | 
				
			||||||
 | 
					        from_secret: repo_password
 | 
				
			||||||
 | 
					      port: 22
 | 
				
			||||||
 | 
					      target: /srv/repo/dnf/zealot/
 | 
				
			||||||
 | 
					      source: target/generate-rpm/zealot*.rpm
 | 
				
			||||||
 | 
					      strip_components: 2
 | 
				
			||||||
 | 
					    when:
 | 
				
			||||||
 | 
					      event: tag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  update_repos:
 | 
				
			||||||
 | 
					    image: appleboy/drone-ssh
 | 
				
			||||||
 | 
					    settings:
 | 
				
			||||||
 | 
					      host:
 | 
				
			||||||
 | 
					        - repo.int.metaunix.net
 | 
				
			||||||
 | 
					      username:
 | 
				
			||||||
 | 
					        from_secret: repo_admin
 | 
				
			||||||
 | 
					      password:
 | 
				
			||||||
 | 
					        from_secret: repo_password
 | 
				
			||||||
 | 
					      port: 22
 | 
				
			||||||
 | 
					      command_timeout: 2m
 | 
				
			||||||
 | 
					      script:
 | 
				
			||||||
 | 
					        - "sudo /home/xadmin/scripts/update_repo.sh"
 | 
				
			||||||
 | 
					    when:
 | 
				
			||||||
 | 
					      event: tag
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,15 +1,17 @@
 | 
				
			|||||||
[package]
 | 
					[package]
 | 
				
			||||||
name = "zealot"
 | 
					name = "zealot"
 | 
				
			||||||
description = "Bit Goblin automated video transcoding service."
 | 
					description = "Bit Goblin automated video transcoding service."
 | 
				
			||||||
version = "0.2.1"
 | 
					version = "0.2.6"
 | 
				
			||||||
edition = "2021"
 | 
					edition = "2021"
 | 
				
			||||||
readme = "README.md"
 | 
					readme = "README.md"
 | 
				
			||||||
license = "BSD 2-Clause"
 | 
					license = "BSD 2-Clause"
 | 
				
			||||||
authors = ["Gregory Ballantine <gballantine@bitgoblin.tech>"]
 | 
					authors = ["Gregory Ballantine <gballantine@bitgoblin.tech>"]
 | 
				
			||||||
 | 
					repository = "https://git.metaunix.net/BitGoblin/zealot"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies]
 | 
					[dependencies]
 | 
				
			||||||
clap = { version = "3.2", features = ['derive'] }
 | 
					clap = { version = "3.2", features = ['derive'] }
 | 
				
			||||||
config = { version = "0.13", features = ['toml'] }
 | 
					config = { version = "0.13", features = ['toml'] }
 | 
				
			||||||
 | 
					filetime = "0.2"
 | 
				
			||||||
log = "0.4"
 | 
					log = "0.4"
 | 
				
			||||||
log4rs = "1.1"
 | 
					log4rs = "1.1"
 | 
				
			||||||
toml = "0.5"
 | 
					toml = "0.5"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,3 +18,21 @@ pub fn setup_command() {
 | 
				
			|||||||
  // initialize the video repository
 | 
					  // initialize the video repository
 | 
				
			||||||
  r.initialize();
 | 
					  r.initialize();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn version_command() {
 | 
				
			||||||
 | 
					  println!("===================================================================================");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // output the program and version
 | 
				
			||||||
 | 
					  println!("Zealot version v{}", env!("CARGO_PKG_VERSION"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // output project description
 | 
				
			||||||
 | 
					  println!("{}", env!("CARGO_PKG_DESCRIPTION"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // display license info
 | 
				
			||||||
 | 
					  println!("\nThis code is licensed under the {} license.", env!("CARGO_PKG_LICENSE"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // output the project source URL
 | 
				
			||||||
 | 
					  println!("View the source code or file issues at {}.", env!("CARGO_PKG_REPOSITORY"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  println!("===================================================================================");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,8 +22,11 @@ struct Cli {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#[derive(Subcommand)]
 | 
					#[derive(Subcommand)]
 | 
				
			||||||
enum Commands {
 | 
					enum Commands {
 | 
				
			||||||
  /// displays version info about this program
 | 
					  // Runs the setup command
 | 
				
			||||||
  Setup {},
 | 
					  Setup {},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Displays version info about the program
 | 
				
			||||||
 | 
					  Version {},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() {
 | 
					fn main() {
 | 
				
			||||||
@@ -37,6 +40,7 @@ fn main() {
 | 
				
			|||||||
  match &cli.command {
 | 
					  match &cli.command {
 | 
				
			||||||
    // sub-commands will be handled here
 | 
					    // sub-commands will be handled here
 | 
				
			||||||
    Some(Commands::Setup {}) => cmd::core::setup_command(),
 | 
					    Some(Commands::Setup {}) => cmd::core::setup_command(),
 | 
				
			||||||
 | 
					    Some(Commands::Version {}) => cmd::core::version_command(),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // run the main program without any commands
 | 
					    // run the main program without any commands
 | 
				
			||||||
    None => {
 | 
					    None => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,8 @@
 | 
				
			|||||||
use std::fs;
 | 
					use std::fs;
 | 
				
			||||||
use std::path::Path;
 | 
					use std::path::Path;
 | 
				
			||||||
use log::{error, info};
 | 
					use log::{error, info};
 | 
				
			||||||
 | 
					use filetime;
 | 
				
			||||||
 | 
					use filetime::FileTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub struct Repository {
 | 
					pub struct Repository {
 | 
				
			||||||
  pub base_dir: String,
 | 
					  pub base_dir: String,
 | 
				
			||||||
@@ -58,6 +60,7 @@ impl Repository {
 | 
				
			|||||||
    match fs::copy(&ingest_file, &archive_file) {
 | 
					    match fs::copy(&ingest_file, &archive_file) {
 | 
				
			||||||
      Ok(_) => {
 | 
					      Ok(_) => {
 | 
				
			||||||
        info!("Archiving video file {}.", ingest_file.to_str().unwrap());
 | 
					        info!("Archiving video file {}.", ingest_file.to_str().unwrap());
 | 
				
			||||||
 | 
					        copy_file_metadata(ingest_file.to_str().unwrap(), archive_file.to_str().unwrap());
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      Err(e) => {
 | 
					      Err(e) => {
 | 
				
			||||||
        error!("Error archiving file {}: {}", ingest_file.to_str().unwrap(), e);
 | 
					        error!("Error archiving file {}: {}", ingest_file.to_str().unwrap(), e);
 | 
				
			||||||
@@ -89,3 +92,16 @@ fn create_directory(path: &str) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn copy_file_metadata(old_file: &str, new_file: &str) {
 | 
				
			||||||
 | 
					  // grab old file metadata
 | 
				
			||||||
 | 
					  let old_metadata = fs::metadata(old_file).unwrap();
 | 
				
			||||||
 | 
					  let old_permissions = old_metadata.permissions();
 | 
				
			||||||
 | 
					  let mtime = FileTime::from_last_modification_time(&old_metadata);
 | 
				
			||||||
 | 
					  let atime = FileTime::from_last_access_time(&old_metadata);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // set metadata on the new file
 | 
				
			||||||
 | 
					  let new_path = Path::new(new_file);
 | 
				
			||||||
 | 
					  fs::set_permissions(new_file, old_permissions).expect("Failed to set new file permissions.");
 | 
				
			||||||
 | 
					  filetime::set_file_times(new_path, atime, mtime).expect("Failed to set atime and mtime.");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@ use config::Config;
 | 
				
			|||||||
use std::path::Path;
 | 
					use std::path::Path;
 | 
				
			||||||
use std::process;
 | 
					use std::process;
 | 
				
			||||||
use std::{thread, time};
 | 
					use std::{thread, time};
 | 
				
			||||||
use log::{info};
 | 
					use log::{debug, info};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::util::io;
 | 
					use crate::util::io;
 | 
				
			||||||
use super::repository::Repository;
 | 
					use super::repository::Repository;
 | 
				
			||||||
@@ -31,6 +31,10 @@ impl Transcoder {
 | 
				
			|||||||
      if ingest_files.len() < 1 {
 | 
					      if ingest_files.len() < 1 {
 | 
				
			||||||
        info!("There were no files found in ingest to transcode; skipping run.");
 | 
					        info!("There were no files found in ingest to transcode; skipping run.");
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
 | 
					        // log that the transcoder is starting up
 | 
				
			||||||
 | 
					        info!("Found {} files in ingest to transcode. Standby...", ingest_files.len());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // loop through each file found in ingest
 | 
				
			||||||
        for i in ingest_files {
 | 
					        for i in ingest_files {
 | 
				
			||||||
          let ingest_path = Path::new(&self.repository.ingest_dir).join(&i);
 | 
					          let ingest_path = Path::new(&self.repository.ingest_dir).join(&i);
 | 
				
			||||||
          if io::is_file_locked(&ingest_path.to_str().unwrap()) {
 | 
					          if io::is_file_locked(&ingest_path.to_str().unwrap()) {
 | 
				
			||||||
@@ -47,6 +51,9 @@ impl Transcoder {
 | 
				
			|||||||
          // remove the source file
 | 
					          // remove the source file
 | 
				
			||||||
          self.repository.cleanup_file(&i);
 | 
					          self.repository.cleanup_file(&i);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // let the user know the transcode has finished
 | 
				
			||||||
 | 
					        info!("Finished transcoding. Sleeping...");
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // put the loop to sleep for X minutes
 | 
					      // put the loop to sleep for X minutes
 | 
				
			||||||
@@ -57,13 +64,20 @@ impl Transcoder {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  fn transcode(&self, file: &str) {
 | 
					  fn transcode(&self, file: &str) {
 | 
				
			||||||
    let ingest_file = Path::new(&self.repository.ingest_dir).join(file);
 | 
					    let ingest_file = Path::new(&self.repository.ingest_dir).join(file);
 | 
				
			||||||
    let output_file = Path::new(&self.repository.output_dir).join(file);
 | 
					    let video_format = &self.config.get_string("transcoder.video_format").unwrap();
 | 
				
			||||||
 | 
					    let output_stem = Path::new(file).file_stem().unwrap();
 | 
				
			||||||
 | 
					    let output_bits = vec![output_stem.to_str().unwrap(), &video_format];
 | 
				
			||||||
 | 
					    let output_name = output_bits.join(".");
 | 
				
			||||||
 | 
					    let output_file = Path::new(&self.repository.output_dir).join(output_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let video_codec = &self.config.get_string("transcoder.video_codec").unwrap();
 | 
				
			||||||
 | 
					    info!("Transcoding {} to {} with the {} encoder.", ingest_file.display(), output_file.display(), video_codec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let cmd_output = process::Command::new("/usr/bin/ffmpeg")
 | 
					    let cmd_output = process::Command::new("/usr/bin/ffmpeg")
 | 
				
			||||||
      .arg("-i")        .arg(&*ingest_file.to_string_lossy())
 | 
					      .arg("-i")        .arg(&*ingest_file.to_string_lossy())
 | 
				
			||||||
      .arg("-y")
 | 
					      .arg("-y")
 | 
				
			||||||
      .arg("-f")        .arg(&self.config.get_string("transcoder.video_format").unwrap())
 | 
					      .arg("-f")        .arg(&video_format)
 | 
				
			||||||
      .arg("-c:v")      .arg(&self.config.get_string("transcoder.video_codec").unwrap())
 | 
					      .arg("-c:v")      .arg(&video_codec)
 | 
				
			||||||
      .arg("-s")        .arg(&self.config.get_string("transcoder.video_resolution").unwrap())
 | 
					      .arg("-s")        .arg(&self.config.get_string("transcoder.video_resolution").unwrap())
 | 
				
			||||||
      .arg("-r")        .arg(format!("{}", self.config.get_string("transcoder.video_framerate").unwrap()))
 | 
					      .arg("-r")        .arg(format!("{}", self.config.get_string("transcoder.video_framerate").unwrap()))
 | 
				
			||||||
      .arg("-vf")       .arg(format!("format={}", &self.config.get_string("transcoder.video_color").unwrap()))
 | 
					      .arg("-vf")       .arg(format!("format={}", &self.config.get_string("transcoder.video_color").unwrap()))
 | 
				
			||||||
@@ -76,6 +90,6 @@ impl Transcoder {
 | 
				
			|||||||
    assert!(cmd_output.status.success());
 | 
					    assert!(cmd_output.status.success());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let results_raw = &String::from_utf8_lossy(&cmd_output.stderr);
 | 
					    let results_raw = &String::from_utf8_lossy(&cmd_output.stderr);
 | 
				
			||||||
    info!("{}", results_raw);
 | 
					    debug!("{}", results_raw);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user