Prepare a list of jobs before converting
This commit is contained in:
parent
20e10eecb4
commit
2708bd4c54
1 changed files with 45 additions and 27 deletions
72
src/main.rs
72
src/main.rs
|
|
@ -6,7 +6,7 @@ use rayon::prelude::*;
|
|||
use std::ffi::OsStr;
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::path::Path;
|
||||
use std::path::{Path, PathBuf};
|
||||
use walkdir::WalkDir;
|
||||
use zip::ZipArchive;
|
||||
|
||||
|
|
@ -37,11 +37,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
let cli = Cli::parse();
|
||||
|
||||
let input_path = Path::new(&cli.input_path);
|
||||
let output_dir = Path::new(&cli.output_dir);
|
||||
|
||||
let mut jobs = Vec::new();
|
||||
|
||||
if input_path.is_file() && input_path.extension() == Some(OsStr::new("cbz")) {
|
||||
convert_cbz(input_path, Path::new(&cli.output_dir))?;
|
||||
jobs.push(Job::new(input_path.to_path_buf(), output_dir.to_path_buf()));
|
||||
} else if input_path.is_dir() {
|
||||
convert_directory(input_path, Path::new(&cli.output_dir))?;
|
||||
jobs.extend(walk_directory(input_path, output_dir));
|
||||
} else {
|
||||
eprintln!(
|
||||
"Invalid input path. Please provide a CBZ file or a directory containing CBZ files."
|
||||
|
|
@ -49,9 +52,25 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
std::process::exit(1);
|
||||
}
|
||||
|
||||
process_jobs(jobs);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn walk_directory(directory: &Path, output_dir: &Path) -> Vec<Job> {
|
||||
debug!("Walking {:?}", directory);
|
||||
let mut jobs = Vec::new();
|
||||
for entry in WalkDir::new(directory) {
|
||||
let entry = entry.unwrap();
|
||||
let path = entry.path();
|
||||
if path.is_file() && path.extension() == Some(OsStr::new("cbz")) {
|
||||
jobs.push(Job::new(path.to_path_buf(), output_dir.to_path_buf()));
|
||||
}
|
||||
}
|
||||
|
||||
jobs
|
||||
}
|
||||
|
||||
struct ImageFile {
|
||||
pub name: String,
|
||||
pub data: Vec<u8>,
|
||||
|
|
@ -74,7 +93,24 @@ impl From<&ImageFile> for DecodedImageFile {
|
|||
}
|
||||
}
|
||||
|
||||
fn convert_cbz(cbz_path: &Path, output_dir: &Path) -> Result<(), Box<dyn std::error::Error>> {
|
||||
struct Job {
|
||||
pub cbz_path: PathBuf,
|
||||
pub pdf_path: PathBuf,
|
||||
}
|
||||
|
||||
impl Job {
|
||||
fn new(cbz_path: PathBuf, output_dir: PathBuf) -> Self {
|
||||
let mut output_path = output_dir.join(cbz_path.file_name().unwrap());
|
||||
output_path.set_extension("pdf");
|
||||
|
||||
Self {
|
||||
cbz_path,
|
||||
pdf_path: output_path,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn convert_cbz(cbz_path: &Path, output_path: &Path) -> Result<(), Box<dyn std::error::Error>> {
|
||||
info!("Converting {:?}", cbz_path);
|
||||
|
||||
let a4 = Rect::new(0.0, 0.0, 595.0, 842.0);
|
||||
|
|
@ -101,7 +137,7 @@ fn convert_cbz(cbz_path: &Path, output_dir: &Path) -> Result<(), Box<dyn std::er
|
|||
let mut images = Vec::new();
|
||||
files
|
||||
.par_iter()
|
||||
.map(|f| DecodedImageFile::from(f))
|
||||
.map(DecodedImageFile::from)
|
||||
.collect_into_vec(&mut images);
|
||||
images.par_sort_by_key(|img| img.name.clone());
|
||||
|
||||
|
|
@ -149,9 +185,7 @@ fn convert_cbz(cbz_path: &Path, output_dir: &Path) -> Result<(), Box<dyn std::er
|
|||
.kids(pages)
|
||||
.count(page_count.try_into().unwrap());
|
||||
|
||||
let mut output_path = output_dir.join(cbz_path.file_name().unwrap());
|
||||
output_path.set_extension("pdf");
|
||||
std::fs::write(output_path.clone(), pdf.finish())?;
|
||||
std::fs::write(output_path, pdf.finish())?;
|
||||
|
||||
info!(
|
||||
"Converted '{}' to '{}'",
|
||||
|
|
@ -162,23 +196,7 @@ fn convert_cbz(cbz_path: &Path, output_dir: &Path) -> Result<(), Box<dyn std::er
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn convert_directory(
|
||||
directory: &Path,
|
||||
output_dir: &Path,
|
||||
) -> Result<(), Box<dyn std::error::Error>> {
|
||||
debug!("Walking {:?}", directory);
|
||||
let mut entries = Vec::new();
|
||||
for entry in WalkDir::new(directory) {
|
||||
let entry = entry?;
|
||||
let path = entry.path();
|
||||
if path.is_file() && path.extension() == Some(OsStr::new("cbz")) {
|
||||
entries.push(entry);
|
||||
}
|
||||
}
|
||||
|
||||
entries
|
||||
.par_iter()
|
||||
.for_each(|entry| convert_cbz(entry.path(), output_dir).unwrap());
|
||||
|
||||
Ok(())
|
||||
fn process_jobs(jobs: Vec<Job>) {
|
||||
jobs.par_iter()
|
||||
.for_each(|entry| convert_cbz(&entry.cbz_path, &entry.pdf_path).unwrap());
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue