Files
comic2pdf/comic2pdf.py
T
sakamoto 9237d70289 🧑💻 minor change
2024-08-11 13:22:43 -05:00

130 lines
4.1 KiB
Python
Executable File

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}")
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 = []
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()