Compare commits
	
		
			23 Commits
		
	
	
		
			v0.2.0
			...
			e479959ca8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e479959ca8 | |||
| ef492f6008 | |||
| 6371417234 | |||
| a7cc2bc771 | |||
| ed4173f3dc | |||
| f3552f3af1 | |||
| 6da120f632 | |||
| a22b59d87c | |||
| dfca3b1fd6 | |||
| 530d83f57d | |||
| d836e27305 | |||
| 8bca6b3b0b | |||
| 958ffa397c | |||
| 1671b95128 | |||
| 3bcbabf1b6 | |||
| 3f71767acb | |||
| 75d71e9695 | |||
| b97a4b1c0f | |||
| e092990e17 | |||
| 9929db6c5b | |||
| 004c057a2c | |||
| 0b327f304e | |||
| 327ec9c62f | 
@@ -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,14 +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.0"
 | 
					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'] }
 | 
				
			||||||
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"
 | 
				
			||||||
@@ -24,6 +27,7 @@ section = "video"
 | 
				
			|||||||
assets = [
 | 
					assets = [
 | 
				
			||||||
	["target/release/zealot", "usr/bin/zealot", "755"],
 | 
						["target/release/zealot", "usr/bin/zealot", "755"],
 | 
				
			||||||
	["build/etc/example.toml", "etc/zealot/example.toml", "644"],
 | 
						["build/etc/example.toml", "etc/zealot/example.toml", "644"],
 | 
				
			||||||
 | 
						["build/etc/log4rs.yaml", "etc/zealot/log4rs.yaml", "755"],
 | 
				
			||||||
	["README.md", "usr/share/doc/zealot/README", "644"]
 | 
						["README.md", "usr/share/doc/zealot/README", "644"]
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
[package.metadata.deb.systemd-units]
 | 
					[package.metadata.deb.systemd-units]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@ Description=Zealot video transcoder service
 | 
				
			|||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
User=zealot
 | 
					User=zealot
 | 
				
			||||||
Group=zealot
 | 
					Group=zealot
 | 
				
			||||||
ExecStart=/usr/bin/zealot
 | 
					ExecStart=/usr/bin/zealot -l /etc/zealot/log4rs.yaml
 | 
				
			||||||
SuccessExitStatus=143
 | 
					SuccessExitStatus=143
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
							
								
								
									
										12
									
								
								build/etc/log4rs.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								build/etc/log4rs.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					appenders:
 | 
				
			||||||
 | 
					  stdout:
 | 
				
			||||||
 | 
					    kind: console
 | 
				
			||||||
 | 
					    encoder:
 | 
				
			||||||
 | 
					      pattern: "{d(%+)(utc)} {h({l})}: {m}{n}"
 | 
				
			||||||
 | 
					    filters:
 | 
				
			||||||
 | 
					      - kind: threshold
 | 
				
			||||||
 | 
					        level: info
 | 
				
			||||||
 | 
					root:
 | 
				
			||||||
 | 
					  level: info
 | 
				
			||||||
 | 
					  appenders:
 | 
				
			||||||
 | 
					    - stdout
 | 
				
			||||||
@@ -5,6 +5,7 @@ GETENT_GROUP=$(getent group zealot)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Create the zealot user if it doesn't already exist
 | 
					# Create the zealot user if it doesn't already exist
 | 
				
			||||||
if [ "$GETENT_USER" = "" ]; then
 | 
					if [ "$GETENT_USER" = "" ]; then
 | 
				
			||||||
 | 
						echo "Creating the 'zealot' user."
 | 
				
			||||||
	useradd -r zealot
 | 
						useradd -r zealot
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
	echo "The 'zealot' user already exists, skipping creation."
 | 
						echo "The 'zealot' user already exists, skipping creation."
 | 
				
			||||||
@@ -12,6 +13,7 @@ fi
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Create the zealot group if it doesn't already exist
 | 
					# Create the zealot group if it doesn't already exist
 | 
				
			||||||
if [ "$GETENT_GROUP" = "" ]; then
 | 
					if [ "$GETENT_GROUP" = "" ]; then
 | 
				
			||||||
 | 
						echo "Creating the 'zealot' group."
 | 
				
			||||||
	groupadd zealot
 | 
						groupadd zealot
 | 
				
			||||||
	usermod -aG zealot zealot
 | 
						usermod -aG zealot zealot
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
@@ -21,6 +23,15 @@ fi
 | 
				
			|||||||
# Change the directory ownership of /etc
 | 
					# Change the directory ownership of /etc
 | 
				
			||||||
chown -R zealot:zealot /etc/zealot
 | 
					chown -R zealot:zealot /etc/zealot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create the log directory under /var/log
 | 
				
			||||||
 | 
					if [ ! -d /var/log/zealot ]; then
 | 
				
			||||||
 | 
						echo "Creating /var/log/zealot to store log files."
 | 
				
			||||||
 | 
						mkdir /var/log/zealot
 | 
				
			||||||
 | 
						chown zealot:zealot /var/log/zealot
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						echo "/var/log/zealot already exists, skipping creation."
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#DEBHELPER#
 | 
					#DEBHELPER#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exit 0
 | 
					exit 0
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								example.config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								example.config
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					[transcoder]
 | 
				
			||||||
 | 
					repo_path = '~/zealot'
 | 
				
			||||||
 | 
					interval = 15
 | 
				
			||||||
 | 
					video_format = 'mov'
 | 
				
			||||||
 | 
					video_codec = 'dnxhd'
 | 
				
			||||||
 | 
					video_profile = 'dnxhr_hq'
 | 
				
			||||||
 | 
					video_resolution = '1920x1080'
 | 
				
			||||||
 | 
					video_framerate = '60'
 | 
				
			||||||
 | 
					video_color = 'yuv422p'
 | 
				
			||||||
 | 
					audio_codec = 'pcm_s16le'
 | 
				
			||||||
							
								
								
									
										38
									
								
								src/cmd/core.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/cmd/core.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					use config::Config;
 | 
				
			||||||
 | 
					use crate::settings;
 | 
				
			||||||
 | 
					use crate::transcoder::repository::Repository;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn setup_command() {
 | 
				
			||||||
 | 
					  // load configuration
 | 
				
			||||||
 | 
					  let c: Config = settings::load_config();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // resolve repository path
 | 
				
			||||||
 | 
					  let repository_dir_raw: &str = &c.get_string("transcoder.repository").unwrap();
 | 
				
			||||||
 | 
					  let repository_dir: &str = &shellexpand::tilde(repository_dir_raw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // alert the user to what's happening
 | 
				
			||||||
 | 
					  println!("Initializing video repository at {}...", repository_dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // create and initialize our repository object
 | 
				
			||||||
 | 
					  let r: Repository = Repository::new(repository_dir);
 | 
				
			||||||
 | 
					  // initialize the video repository
 | 
				
			||||||
 | 
					  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!("===================================================================================");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								src/cmd/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/cmd/mod.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					pub mod core;
 | 
				
			||||||
							
								
								
									
										55
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								src/main.rs
									
									
									
									
									
								
							@@ -1,21 +1,56 @@
 | 
				
			|||||||
 | 
					use clap::{Parser, Subcommand};
 | 
				
			||||||
use log4rs;
 | 
					use log4rs;
 | 
				
			||||||
use config::Config;
 | 
					use config::Config;
 | 
				
			||||||
use transcoder::repository::Repository;
 | 
					use transcoder::repository::Repository;
 | 
				
			||||||
use transcoder::transcoder::Transcoder;
 | 
					use transcoder::transcoder::Transcoder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mod cmd;
 | 
				
			||||||
mod settings;
 | 
					mod settings;
 | 
				
			||||||
mod transcoder;
 | 
					mod transcoder;
 | 
				
			||||||
mod util;
 | 
					mod util;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() {
 | 
					#[derive(Parser)]
 | 
				
			||||||
  // initialize the log4rs logger
 | 
					#[clap(author, version, about, long_about = None)]
 | 
				
			||||||
  log4rs::init_file("./log4rs.yaml", Default::default()).unwrap();
 | 
					struct Cli {
 | 
				
			||||||
 | 
					  /// Number of times to greet
 | 
				
			||||||
 | 
					  #[clap(short = 'l', long, default_value_t = String::from("./log4rs.yaml"))]
 | 
				
			||||||
 | 
					  log_config: String,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // create and initialize our config and repository objects
 | 
					  #[clap(subcommand)]
 | 
				
			||||||
  let c: Config = settings::load_config();
 | 
					  command: Option<Commands>,
 | 
				
			||||||
  let r: Repository = Repository::new(&shellexpand::tilde(&c.get_string("transcoder.repository").unwrap()));
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // create and start the video transcoder object
 | 
					#[derive(Subcommand)]
 | 
				
			||||||
  let t: Transcoder = Transcoder::new(c, r);
 | 
					enum Commands {
 | 
				
			||||||
  t.start();
 | 
					  // Runs the setup command
 | 
				
			||||||
 | 
					  Setup {},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Displays version info about the program
 | 
				
			||||||
 | 
					  Version {},
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
					  // initialize the clap CLI
 | 
				
			||||||
 | 
					  let cli = Cli::parse();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // grab the log4rs config file path, then initialize log4rs
 | 
				
			||||||
 | 
					  let log4rs_config: String = cli.log_config;
 | 
				
			||||||
 | 
					  log4rs::init_file(&log4rs_config, Default::default()).unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  match &cli.command {
 | 
				
			||||||
 | 
					    // sub-commands will be handled here
 | 
				
			||||||
 | 
					    Some(Commands::Setup {}) => cmd::core::setup_command(),
 | 
				
			||||||
 | 
					    Some(Commands::Version {}) => cmd::core::version_command(),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // run the main program without any commands
 | 
				
			||||||
 | 
					    None => {
 | 
				
			||||||
 | 
					      // create and initialize our config and repository objects
 | 
				
			||||||
 | 
					      let c: Config = settings::load_config();
 | 
				
			||||||
 | 
					      let r: Repository = Repository::new(&shellexpand::tilde(&c.get_string("transcoder.repository").unwrap()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // create and start the video transcoder object
 | 
				
			||||||
 | 
					      let t: Transcoder = Transcoder::new(c, r);
 | 
				
			||||||
 | 
					      t.start();
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,33 @@
 | 
				
			|||||||
use config::Config;
 | 
					use config::Config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn load_config() -> Config {
 | 
					pub fn load_config() -> Config {
 | 
				
			||||||
 | 
					  let global_config_path: String = find_global_config_path();
 | 
				
			||||||
 | 
					  let home_config_path: String = find_home_config_path();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let settings = Config::builder()
 | 
					  let settings = Config::builder()
 | 
				
			||||||
    // Add in `./Settings.toml`
 | 
					    // Add in `./Settings.toml`
 | 
				
			||||||
    .add_source(config::File::with_name("/etc/zealot/config.toml").required(false))
 | 
					    .add_source(config::File::with_name(&global_config_path).required(false))
 | 
				
			||||||
    .add_source(config::File::with_name(&shellexpand::tilde("~/.config/zealot.toml")).required(false))
 | 
					    .add_source(config::File::with_name(&home_config_path).required(false))
 | 
				
			||||||
    .build()
 | 
					    .build()
 | 
				
			||||||
    .unwrap();
 | 
					    .unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return settings;
 | 
					  return settings;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn find_global_config_path() -> String {
 | 
				
			||||||
 | 
					  if cfg!(windows) {
 | 
				
			||||||
 | 
					    return String::from("C:\\Program Files\\Zealot\\config.toml");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return String::from("/etc/zealot/config.toml");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn find_home_config_path() -> String {
 | 
				
			||||||
 | 
					  let home_path: &str = &shellexpand::tilde("~/.config/zealot.toml");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if cfg!(windows) {
 | 
				
			||||||
 | 
					    return String::from(home_path.replace("/", "\\"));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return String::from(home_path);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,
 | 
				
			||||||
@@ -11,16 +13,9 @@ pub struct Repository {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
impl Repository {
 | 
					impl Repository {
 | 
				
			||||||
  pub fn new(base_path: &str) -> Repository {
 | 
					  pub fn new(base_path: &str) -> Repository {
 | 
				
			||||||
    // create the base directory path
 | 
					 | 
				
			||||||
    create_directory(base_path);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // create the needed sub-directories
 | 
					 | 
				
			||||||
    let ingest_path = Path::new(base_path).join("ingest");
 | 
					    let ingest_path = Path::new(base_path).join("ingest");
 | 
				
			||||||
    create_directory(ingest_path.to_str().unwrap());
 | 
					 | 
				
			||||||
    let archive_path = Path::new(base_path).join("archive");
 | 
					    let archive_path = Path::new(base_path).join("archive");
 | 
				
			||||||
    create_directory(archive_path.to_str().unwrap());
 | 
					 | 
				
			||||||
    let output_path = Path::new(base_path).join("output");
 | 
					    let output_path = Path::new(base_path).join("output");
 | 
				
			||||||
    create_directory(output_path.to_str().unwrap());
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return Repository {
 | 
					    return Repository {
 | 
				
			||||||
      base_dir: String::from(base_path),
 | 
					      base_dir: String::from(base_path),
 | 
				
			||||||
@@ -30,6 +25,16 @@ impl Repository {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pub fn initialize(&self) {
 | 
				
			||||||
 | 
					    // create the base directory path
 | 
				
			||||||
 | 
					    create_directory(&self.base_dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // create the needed sub-directories
 | 
				
			||||||
 | 
					    create_directory(&self.ingest_dir.as_str());
 | 
				
			||||||
 | 
					    create_directory(&self.archive_dir.as_str());
 | 
				
			||||||
 | 
					    create_directory(&self.output_dir.as_str());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pub fn search_ingest(&self) -> Vec<String> {
 | 
					  pub fn search_ingest(&self) -> Vec<String> {
 | 
				
			||||||
    // read file entries from ingest
 | 
					    // read file entries from ingest
 | 
				
			||||||
    let files = fs::read_dir(&self.ingest_dir).unwrap();
 | 
					    let files = fs::read_dir(&self.ingest_dir).unwrap();
 | 
				
			||||||
@@ -55,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);
 | 
				
			||||||
@@ -86,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