from utils import Sorter from utils import src, dest, verbose from utils import log import os import img2pdf import tempfile import patoolib import shutil class Comic2PDF: def __init__(self, src, dest, verbose=False, use_tempfile=True): self.sort = Sorter() self.use_tempfile = use_tempfile self.src = src.rstrip('/') self.dest = dest self.dest_temp_dir = os.path.join(dest, "tmp") if use_tempfile: self.define_temp = tempfile.TemporaryDirectory() self.temp_dir = self.define_temp.name else: self.define_temp = self.dest_temp_dir self.temp_dir = self.define_temp os.makedirs(self.dest_temp_dir, exist_ok=True) os.makedirs(self.dest, exist_ok=True) os.makedirs(self.temp_dir, exist_ok=True) log.info(f"Source: {self.src}") log.info(f"Destination: {self.dest}") log.debug(f"Temp Dir: {self.temp_dir}") log.debug(f"Dest Temp Dir: {self.dest_temp_dir}") def __del__(self): if isinstance(self.define_temp, tempfile.TemporaryDirectory): log.debug(f"Deleting: {self.temp_dir}") self.define_temp.cleanup() else: delete_it = True try: if delete_it and self.use_tempfile is False: log.debug(f"Deleting: {self.dest_temp_dir}") shutil.rmtree(self.dest_temp_dir) except Exception as e: log.error(e) def run(self): if os.path.isfile(self.src) and ( self.src.endswith(".cbz") or self.src.endswith(".cbr") ): self.extract(self.src) self.convert(self.src) elif os.path.isdir(self.src): queue = 1 scanned_folder = self.scan(self.src) log.debug(f"scanned folder: {scanned_folder}") # BUG # batch conversion is probably recursive for root, dirs, files in os.walk(self.src): for file in files: txt = f" [{queue}/{len(scanned_folder)}] Progress " centered_txt = txt.center(45, "=") log.info(centered_txt) self.__del__() os.makedirs(self.temp_dir, exist_ok=True) log.debug(f"Created {self.temp_dir}") self.extract(file) self.convert(file, extract_to_folder=True) queue += 1 log.info("=== ✅ Finished ===") else: log.error("Unknown file type.") exit() def scan(self, dir): log.info(f"Scanning {dir}") files_in_folder = [] # TODO # replace os.walk() for more flexibility for root, dirs, files in os.walk(dir): for name in files: if name.endswith((".png", ".jpg", ".jpeg", ".cbz", ".cbr")): files_in_folder.append(os.path.join(root, name)) files_in_folder.sort(key=self.sort.natural_keys) log.info(f"Found {len(files_in_folder)} files.") return files_in_folder def extract(self, file): log.info(f"Extracting... {file}") path_file = os.path.join(self.src, file) patoolib.extract_archive(path_file, outdir=self.temp_dir, verbosity=-1) log.info("Extraction Complete") def convert(self, file, extract_to_folder=True): log.info("Converting to pdf...") imgs = [] imgs = self.scan(self.temp_dir) basename = os.path.basename(file) name = os.path.splitext(basename)[0] if extract_to_folder: folder_basename = os.path.basename(self.src) folder = os.path.join(self.dest, f"{folder_basename}") os.makedirs(folder, exist_ok=True) pdf_path = os.path.join(folder, f"{name}.pdf") else: pdf_path = os.path.join(self.dest, f"{name}.pdf") log.info(f"Path to conversion: {pdf_path}") log.info(f"Extract to folder is set to {extract_to_folder}") with open(pdf_path, "wb") as f: f.write(img2pdf.convert(imgs)) log.info("Conversion complete") if __name__ == "__main__": comic2pdf = Comic2PDF(src, dest, verbose) comic2pdf.run()