99 lines
2.9 KiB
Python
Executable File
99 lines
2.9 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=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()
|