Same folder as input option #74
This commit is contained in:
parent
5d0b0b4906
commit
e82e7296c7
|
@ -151,7 +151,7 @@ checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "caesiumclt"
|
name = "caesiumclt"
|
||||||
version = "0.21.0"
|
version = "0.22.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"filetime",
|
"filetime",
|
||||||
"human_bytes",
|
"human_bytes",
|
||||||
|
@ -598,8 +598,9 @@ checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libcaesium"
|
name = "libcaesium"
|
||||||
version = "0.16.5"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/Lymphatus/libcaesium?rev=0.16.5#5499d2ff9d051da54d085952180a2763168062c9"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a76975eb2d706a0759e61fdabbbfce62ba97ae9785997e451e29a080fc67a098"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"gifsicle",
|
"gifsicle",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "caesiumclt"
|
name = "caesiumclt"
|
||||||
version = "0.21.0"
|
version = "0.22.0"
|
||||||
authors = ["Matteo Paonessa <matteo.paonessa@gmail.com>"]
|
authors = ["Matteo Paonessa <matteo.paonessa@gmail.com>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
@ -16,4 +16,4 @@ rand = "0.8"
|
||||||
human_bytes = { version = "0.4", default-features = false }
|
human_bytes = { version = "0.4", default-features = false }
|
||||||
filetime = "0.2"
|
filetime = "0.2"
|
||||||
imagesize = "0.13"
|
imagesize = "0.13"
|
||||||
libcaesium = { git = "https://github.com/Lymphatus/libcaesium", rev = "0.16.5" }
|
libcaesium = "0.17.0"
|
|
@ -24,6 +24,7 @@ FLAGS:
|
||||||
-S, --keep-structure keep the folder structure, can be used only with -R
|
-S, --keep-structure keep the folder structure, can be used only with -R
|
||||||
-Q, --quiet suppress all output
|
-Q, --quiet suppress all output
|
||||||
-R, --recursive if input is a folder, scan subfolders too
|
-R, --recursive if input is a folder, scan subfolders too
|
||||||
|
--same-folder-as-input sets the output folder to be the same as the input folder. Overwrites original files
|
||||||
-V, --version Prints version information
|
-V, --version Prints version information
|
||||||
--zopfli use zopfli when optimizing PNG files (it may take a very long time to complete)
|
--zopfli use zopfli when optimizing PNG files (it may take a very long time to complete)
|
||||||
|
|
||||||
|
|
31
src/main.rs
31
src/main.rs
|
@ -1,7 +1,7 @@
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
use caesium::parameters::CSParameters;
|
||||||
use caesium::SupportedFileTypes;
|
use caesium::SupportedFileTypes;
|
||||||
use filetime::{FileTime, set_file_times};
|
use filetime::{FileTime, set_file_times};
|
||||||
use human_bytes::human_bytes;
|
use human_bytes::human_bytes;
|
||||||
|
@ -39,7 +39,6 @@ fn main() {
|
||||||
let mut verbose = opt.verbose;
|
let mut verbose = opt.verbose;
|
||||||
let args = opt.files;
|
let args = opt.files;
|
||||||
let dry_run = opt.dry_run;
|
let dry_run = opt.dry_run;
|
||||||
let output_dir = opt.output;
|
|
||||||
let output_format = map_output_format(opt.output_format);
|
let output_format = map_output_format(opt.output_format);
|
||||||
let convert = output_format.file_type != SupportedFileTypes::Unkn;
|
let convert = output_format.file_type != SupportedFileTypes::Unkn;
|
||||||
let keep_dates = opt.keep_dates;
|
let keep_dates = opt.keep_dates;
|
||||||
|
@ -56,6 +55,14 @@ fn main() {
|
||||||
num_cpus::get()
|
num_cpus::get()
|
||||||
};
|
};
|
||||||
rayon::ThreadPoolBuilder::new().num_threads(cpus).build_global().unwrap_or_default();
|
rayon::ThreadPoolBuilder::new().num_threads(cpus).build_global().unwrap_or_default();
|
||||||
|
let (base_path, files) = scanfiles::scanfiles(args, opt.recursive);
|
||||||
|
|
||||||
|
let same_folder_as_input = opt.same_folder_as_input;
|
||||||
|
let output_dir = if same_folder_as_input {
|
||||||
|
base_path.clone()
|
||||||
|
} else {
|
||||||
|
opt.output.unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
if dry_run {
|
if dry_run {
|
||||||
log("Running in dry run mode", 0, Notice, verbose);
|
log("Running in dry run mode", 0, Notice, verbose);
|
||||||
|
@ -66,9 +73,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let (base_path, files) = scanfiles::scanfiles(args, opt.recursive);
|
let mut compression_parameters = CSParameters::new();
|
||||||
|
|
||||||
let mut compression_parameters = caesium::initialize_parameters();
|
|
||||||
|
|
||||||
if opt.quality.is_some() {
|
if opt.quality.is_some() {
|
||||||
let quality = opt.quality.unwrap_or(80);
|
let quality = opt.quality.unwrap_or(80);
|
||||||
|
@ -209,19 +214,15 @@ fn main() {
|
||||||
match result {
|
match result {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
compression_result.result = true;
|
compression_result.result = true;
|
||||||
let output_metadata = fs::metadata(output_full_path.clone());
|
let output_size = match fs::metadata(output_full_path.clone()) {
|
||||||
let output_size = if let Ok(..) = output_metadata {
|
Ok(s) => s.len(),
|
||||||
output_metadata.unwrap().len()
|
Err(_) => 0
|
||||||
} else {
|
|
||||||
0
|
|
||||||
};
|
};
|
||||||
let mut final_output_size = output_size;
|
let mut final_output_size = output_size;
|
||||||
if matches!(overwrite_policy, OverwritePolicy::Bigger) && final_output_full_path.exists() {
|
if matches!(overwrite_policy, OverwritePolicy::Bigger) && final_output_full_path.exists() {
|
||||||
let existing_file_metadata = fs::metadata(final_output_full_path.clone());
|
let existing_file_size = match fs::metadata(final_output_full_path.clone()) {
|
||||||
let existing_file_size = if let Ok(..) = existing_file_metadata {
|
Ok(s) => s.len(),
|
||||||
existing_file_metadata.unwrap().len()
|
Err(_) => 0
|
||||||
} else {
|
|
||||||
0
|
|
||||||
};
|
};
|
||||||
if output_size >= existing_file_size {
|
if output_size >= existing_file_size {
|
||||||
match fs::remove_file(output_full_path) {
|
match fs::remove_file(output_full_path) {
|
||||||
|
|
|
@ -31,11 +31,11 @@ pub struct Opt {
|
||||||
pub exif: bool,
|
pub exif: bool,
|
||||||
|
|
||||||
/// width of the output image, if height is not set will preserve aspect ratio
|
/// width of the output image, if height is not set will preserve aspect ratio
|
||||||
#[structopt(long, conflicts_with_all(&["height", "long-edge", "short-edge"]))]
|
#[structopt(long, conflicts_with_all(&["long-edge", "short-edge"]))]
|
||||||
pub width: Option<u32>,
|
pub width: Option<u32>,
|
||||||
|
|
||||||
/// height of the output image, if width is not set will preserve aspect ratio
|
/// height of the output image, if width is not set will preserve aspect ratio
|
||||||
#[structopt(long, conflicts_with_all(&["width", "long-edge", "short-edge"]))]
|
#[structopt(long, conflicts_with_all(&["long-edge", "short-edge"]))]
|
||||||
pub height: Option<u32>,
|
pub height: Option<u32>,
|
||||||
|
|
||||||
/// sets the size of the longest edge of the image
|
/// sets the size of the longest edge of the image
|
||||||
|
@ -47,8 +47,8 @@ pub struct Opt {
|
||||||
pub short_edge: Option<u32>,
|
pub short_edge: Option<u32>,
|
||||||
|
|
||||||
/// output folder
|
/// output folder
|
||||||
#[structopt(short = "o", long, parse(from_os_str))]
|
#[structopt(short = "o", long, conflicts_with="same-folder-as-input", parse(from_os_str))]
|
||||||
pub output: PathBuf,
|
pub output: Option<PathBuf>,
|
||||||
|
|
||||||
/// if input is a folder, scan subfolders too
|
/// if input is a folder, scan subfolders too
|
||||||
#[structopt(short = "R", long)]
|
#[structopt(short = "R", long)]
|
||||||
|
@ -94,6 +94,10 @@ pub struct Opt {
|
||||||
#[structopt(long = "png-opt-level", default_value="3")]
|
#[structopt(long = "png-opt-level", default_value="3")]
|
||||||
pub png_opt_level: u8,
|
pub png_opt_level: u8,
|
||||||
|
|
||||||
|
/// sets the output folder to be the same as the input folder. Overwrites original files
|
||||||
|
#[structopt(long = "same-folder-as-input", conflicts_with="output")]
|
||||||
|
pub same_folder_as_input: bool,
|
||||||
|
|
||||||
/// Files to process
|
/// Files to process
|
||||||
#[structopt(name = "FILE", parse(from_os_str))]
|
#[structopt(name = "FILE", parse(from_os_str))]
|
||||||
pub files: Vec<PathBuf>,
|
pub files: Vec<PathBuf>,
|
||||||
|
|
Loading…
Reference in New Issue