diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index adfc4c9..e8c2152 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -24,7 +24,7 @@ from copy import copy from glob import glob from json import loads from urllib.request import Request, urlopen -from re import split, sub +from re import sub from stat import S_IWRITE, S_IREAD, S_IEXEC from zipfile import ZipFile, ZIP_STORED, ZIP_DEFLATED from tempfile import mkdtemp @@ -41,7 +41,7 @@ try: from PyQt5 import QtCore except ImportError: QtCore = None -from .shared import md5Checksum, getImageFileName, walkLevel, saferReplace +from .shared import md5Checksum, getImageFileName, walkSort, walkLevel, saferReplace from . import comic2panel from . import image from . import cbxarchive @@ -422,14 +422,9 @@ def buildEPUB(path, chapterNames, tomeNumber): "}", ]) f.close() - # Ensure we're sorting dirs, files naturally - convert = lambda text: int(text) if text.isdigit() else text - alphanum_key = lambda key: [convert(c) for c in split('([0-9]+)', key)] for (dirpath, dirnames, filenames) in walk(os.path.join(path, 'OEBPS', 'Images')): chapter = False - # Traverse dirs in a sorted manner - dirnames.sort(key=lambda name: alphanum_key(name.lower())) - filenames.sort(key=lambda name: alphanum_key(name.lower())) + dirnames, filenames = walkSort(dirnames, filenames) for afile in filenames: filename = getImageFileName(afile) if '-kcc-hq' not in filename[0]: @@ -718,8 +713,7 @@ def sanitizeTree(filetree): def sanitizeTreeKobo(filetree): pageNumber = 0 for root, dirs, files in walk(filetree): - files.sort() - dirs.sort() + dirs, files = walkSort(dirs, files) for name in files: splitname = os.path.splitext(name) slugified = str(pageNumber).zfill(5) diff --git a/kcc/comic2panel.py b/kcc/comic2panel.py index 81296aa..920a071 100644 --- a/kcc/comic2panel.py +++ b/kcc/comic2panel.py @@ -25,7 +25,7 @@ from optparse import OptionParser, OptionGroup from multiprocessing import Pool from PIL import Image, ImageStat, ImageOps from scandir import walk -from .shared import getImageFileName, walkLevel +from .shared import getImageFileName, walkLevel, walkSort try: from PyQt5 import QtCore except ImportError: @@ -248,6 +248,7 @@ def main(argv=None, qtGUI=None): mergeWorkerPool = Pool() mergeWork.append([options.targetDir]) for root, dirs, files in walk(options.targetDir, False): + dirs, files = walkSort(dirs, files) for directory in dirs: directoryNumer += 1 mergeWork.append([os.path.join(root, directory)]) diff --git a/kcc/shared.py b/kcc/shared.py index f31bb25..1789749 100644 --- a/kcc/shared.py +++ b/kcc/shared.py @@ -24,6 +24,7 @@ from time import sleep from shutil import rmtree, move from tempfile import mkdtemp from zipfile import ZipFile, ZIP_DEFLATED +from re import split try: from scandir import walk except ImportError: @@ -53,11 +54,20 @@ def getImageFileName(imgfile): return [name, ext] +def walkSort(dirnames, filenames): + convert = lambda text: int(text) if text.isdigit() else text + alphanum_key = lambda key: [convert(c) for c in split('([0-9]+)', key)] + dirnames.sort(key=lambda name: alphanum_key(name.lower())) + filenames.sort(key=lambda name: alphanum_key(name.lower())) + return dirnames, filenames + + def walkLevel(some_dir, level=1): some_dir = some_dir.rstrip(os.path.sep) assert os.path.isdir(some_dir) num_sep = some_dir.count(os.path.sep) for root, dirs, files in walk(some_dir): + dirs, files = walkSort(dirs, files) yield root, dirs, files num_sep_this = root.count(os.path.sep) if num_sep + level <= num_sep_this: