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=False): self.sort = Sorter() self.src = src self.dest = dest self.dest_temp_dir = os.path.join(dest, "tmp") self.define_temp = ( tempfile.TemporaryDirectory() if use_tempfile else self.dest_temp_dir ) self.temp_dir = ( self.define_temp.name if isinstance(self.define_temp, tempfile.TemporaryDirectory) else self.define_temp ) os.makedirs(self.dest, exist_ok=True) os.makedirs(self.dest_temp_dir, 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): delete_it = True try: if delete_it: 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): self.extract(self.src) self.convert(self.src) else: scanned_folder = self.scan(self.src) log.debug(f"scanned folder: {scanned_folder}") for root, dirs, files in os.walk(self.src): for file in files: log.info("="*30) self.__del__() os.makedirs(self.temp_dir) self.extract(file) self.convert(file) def scan(self, dir): log.info(f"Scanning {dir}") files_in_folder = [] 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): log.info("Converting to pdf...") imgs = [] imgs = self.scan(self.temp_dir) basename = os.path.basename(file) name = os.path.splitext(basename)[0] pdf_path = os.path.join(self.dest, f"{name}.pdf") 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()