Files
sakamoto 613496daf5 sync
2024-08-29 10:27:08 -04:00

135 lines
4.2 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}")
# 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()