mirror of
https://github.com/ciromattia/kcc
synced 2025-12-13 01:36:27 +00:00
Code cleanup
This commit is contained in:
20
kcc.py
20
kcc.py
@@ -34,24 +34,6 @@ if sys.platform.startswith('darwin'):
|
||||
else:
|
||||
os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + '/other/osx/:' + os.environ['PATH']
|
||||
elif sys.platform.startswith('win'):
|
||||
'''
|
||||
import multiprocessing.popen_spawn_win32 as forking
|
||||
|
||||
class _Popen(forking.Popen):
|
||||
def __init__(self, *args, **kw):
|
||||
if hasattr(sys, 'frozen'):
|
||||
# noinspection PyUnresolvedReferences,PyProtectedMember
|
||||
os.putenv('_MEIPASS2', sys._MEIPASS)
|
||||
try:
|
||||
super(_Popen, self).__init__(*args, **kw)
|
||||
finally:
|
||||
if hasattr(sys, 'frozen'):
|
||||
if hasattr(os, 'unsetenv'):
|
||||
os.unsetenv('_MEIPASS2')
|
||||
else:
|
||||
os.putenv('_MEIPASS2', '')
|
||||
forking.Popen = _Popen
|
||||
'''
|
||||
if getattr(sys, 'frozen', False):
|
||||
os.chdir(os.path.dirname(os.path.abspath(sys.executable)))
|
||||
else:
|
||||
@@ -61,7 +43,7 @@ elif sys.platform.startswith('win'):
|
||||
if getattr(sys, 'frozen', False):
|
||||
try:
|
||||
import kindlecomicconverter.sentry
|
||||
except:
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from multiprocessing import freeze_support
|
||||
|
||||
@@ -156,8 +156,8 @@ class VersionThread(QtCore.QThread):
|
||||
'(<a href="https://github.com/ciromattia/kcc/releases/">'
|
||||
'Changelog</a>)', 'warning', False)
|
||||
|
||||
def setAnswer(self, dialogAnswer):
|
||||
self.answer = dialogAnswer
|
||||
def setAnswer(self, dialoganswer):
|
||||
self.answer = dialoganswer
|
||||
|
||||
def getNewVersion(self):
|
||||
while self.answer is None:
|
||||
@@ -180,8 +180,8 @@ class VersionThread(QtCore.QThread):
|
||||
MW.hideProgressBar.emit()
|
||||
MW.modeConvert.emit(1)
|
||||
|
||||
def getNewVersionTick(self, size, blockSize, totalSize):
|
||||
progress = int((size / (totalSize // blockSize)) * 100)
|
||||
def getNewVersionTick(self, size, blocksize, totalsize):
|
||||
progress = int((size / (totalsize // blocksize)) * 100)
|
||||
if size == 0:
|
||||
MW.progressBarTick.emit('100')
|
||||
if progress > self.barProgress:
|
||||
@@ -667,10 +667,10 @@ class KCCGUI(KCC_ui.Ui_mainWindow):
|
||||
self.addMessage('<a href="https://github.com/ciromattia/kcc/wiki/NonKindle-devices">'
|
||||
'List of supported Non-Kindle devices.</a>', 'info')
|
||||
|
||||
def changeFormat(self, outputFormat=None):
|
||||
def changeFormat(self, outputformat=None):
|
||||
profile = GUI.profiles[str(GUI.deviceBox.currentText())]
|
||||
if outputFormat is not None:
|
||||
GUI.formatBox.setCurrentIndex(outputFormat)
|
||||
if outputformat is not None:
|
||||
GUI.formatBox.setCurrentIndex(outputformat)
|
||||
else:
|
||||
GUI.formatBox.setCurrentIndex(profile['DefaultFormat'])
|
||||
if not GUI.webtoonBox.isChecked():
|
||||
@@ -881,10 +881,10 @@ class KCCGUI(KCC_ui.Ui_mainWindow):
|
||||
else:
|
||||
self.addMessage('Download it and place executable in /usr/local/bin directory.', 'error')
|
||||
|
||||
def __init__(self, KCCAplication, KCCWindow):
|
||||
def __init__(self, kccapp, kccwindow):
|
||||
global APP, MW, GUI
|
||||
APP = KCCAplication
|
||||
MW = KCCWindow
|
||||
APP = kccapp
|
||||
MW = kccwindow
|
||||
GUI = self
|
||||
self.setupUi(MW)
|
||||
self.editor = KCCGUI_MetaEditor()
|
||||
|
||||
@@ -26,13 +26,13 @@ from .shared import check7ZFile as is_7zfile
|
||||
|
||||
|
||||
class CBxArchive:
|
||||
def __init__(self, origFileName):
|
||||
self.origFileName = origFileName
|
||||
if is_zipfile(origFileName):
|
||||
def __init__(self, fname):
|
||||
self.fname = fname
|
||||
if is_zipfile(fname):
|
||||
self.compressor = 'zip'
|
||||
elif rarfile.is_rarfile(origFileName):
|
||||
elif rarfile.is_rarfile(fname):
|
||||
self.compressor = 'rar'
|
||||
elif is_7zfile(origFileName):
|
||||
elif is_7zfile(fname):
|
||||
self.compressor = '7z'
|
||||
else:
|
||||
self.compressor = None
|
||||
@@ -41,22 +41,19 @@ class CBxArchive:
|
||||
return self.compressor is not None
|
||||
|
||||
def extractCBZ(self, targetdir):
|
||||
cbzFile = ZipFile(self.origFileName)
|
||||
cbzFile = ZipFile(self.fname)
|
||||
filelist = []
|
||||
for f in cbzFile.namelist():
|
||||
if f.startswith('__MACOSX') or f.endswith('.DS_Store') or f.endswith('humbs.db'):
|
||||
pass
|
||||
elif f.endswith('/'):
|
||||
try:
|
||||
os.makedirs(os.path.join(targetdir, f))
|
||||
except Exception:
|
||||
pass
|
||||
os.makedirs(os.path.join(targetdir, f), exist_ok=True)
|
||||
else:
|
||||
filelist.append(f)
|
||||
cbzFile.extractall(targetdir, filelist)
|
||||
|
||||
def extractCBR(self, targetdir):
|
||||
cbrFile = rarfile.RarFile(self.origFileName)
|
||||
cbrFile = rarfile.RarFile(self.fname)
|
||||
cbrFile.extractall(targetdir)
|
||||
for root, _, filenames in os.walk(targetdir):
|
||||
for filename in filenames:
|
||||
@@ -64,7 +61,7 @@ class CBxArchive:
|
||||
os.remove(os.path.join(root, filename))
|
||||
|
||||
def extractCB7(self, targetdir):
|
||||
output = Popen('7za x "' + self.origFileName + '" -xr!__MACOSX -xr!.DS_Store -xr!thumbs.db -xr!Thumbs.db -o"' +
|
||||
output = Popen('7za x "' + self.fname + '" -xr!__MACOSX -xr!.DS_Store -xr!thumbs.db -xr!Thumbs.db -o"' +
|
||||
targetdir + '"', stdout=PIPE, stderr=STDOUT, stdin=PIPE, shell=True)
|
||||
extracted = False
|
||||
for line in output.stdout:
|
||||
|
||||
@@ -198,7 +198,7 @@ def buildHTML(path, imgfile, imgfilepath):
|
||||
return path, imgfile
|
||||
|
||||
|
||||
def buildNCX(dstdir, title, chapters, chapterNames):
|
||||
def buildNCX(dstdir, title, chapters, chapternames):
|
||||
ncxfile = os.path.join(dstdir, 'OEBPS', 'toc.ncx')
|
||||
f = open(ncxfile, "w", encoding='UTF-8')
|
||||
f.writelines(["<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
|
||||
@@ -217,10 +217,10 @@ def buildNCX(dstdir, title, chapters, chapterNames):
|
||||
filename = getImageFileName(os.path.join(folder, chapter[1]))
|
||||
navID = folder.replace('/', '_').replace('\\', '_')
|
||||
if options.chapters:
|
||||
title = chapterNames[chapter[1]]
|
||||
title = chapternames[chapter[1]]
|
||||
navID = filename[0].replace('/', '_').replace('\\', '_')
|
||||
elif os.path.basename(folder) != "Text":
|
||||
title = chapterNames[os.path.basename(folder)]
|
||||
title = chapternames[os.path.basename(folder)]
|
||||
f.write("<navPoint id=\"" + navID + "\"><navLabel><text>" +
|
||||
escape(title) + "</text></navLabel><content src=\"" + filename[0].replace("\\", "/") +
|
||||
".xhtml\"/></navPoint>\n")
|
||||
@@ -228,7 +228,7 @@ def buildNCX(dstdir, title, chapters, chapterNames):
|
||||
f.close()
|
||||
|
||||
|
||||
def buildNAV(dstdir, title, chapters, chapterNames):
|
||||
def buildNAV(dstdir, title, chapters, chapternames):
|
||||
navfile = os.path.join(dstdir, 'OEBPS', 'nav.xhtml')
|
||||
f = open(navfile, "w", encoding='UTF-8')
|
||||
f.writelines(["<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
|
||||
@@ -245,9 +245,9 @@ def buildNAV(dstdir, title, chapters, chapterNames):
|
||||
folder = chapter[0].replace(os.path.join(dstdir, 'OEBPS'), '').lstrip('/').lstrip('\\\\')
|
||||
filename = getImageFileName(os.path.join(folder, chapter[1]))
|
||||
if options.chapters:
|
||||
title = chapterNames[chapter[1]]
|
||||
title = chapternames[chapter[1]]
|
||||
elif os.path.basename(folder) != "Text":
|
||||
title = chapterNames[os.path.basename(folder)]
|
||||
title = chapternames[os.path.basename(folder)]
|
||||
f.write("<li><a href=\"" + filename[0].replace("\\", "/") + ".xhtml\">" + escape(title) + "</a></li>\n")
|
||||
f.writelines(["</ol>\n",
|
||||
"</nav>\n",
|
||||
@@ -257,9 +257,9 @@ def buildNAV(dstdir, title, chapters, chapterNames):
|
||||
folder = chapter[0].replace(os.path.join(dstdir, 'OEBPS'), '').lstrip('/').lstrip('\\\\')
|
||||
filename = getImageFileName(os.path.join(folder, chapter[1]))
|
||||
if options.chapters:
|
||||
title = chapterNames[chapter[1]]
|
||||
title = chapternames[chapter[1]]
|
||||
elif os.path.basename(folder) != "Text":
|
||||
title = chapterNames[os.path.basename(folder)]
|
||||
title = chapternames[os.path.basename(folder)]
|
||||
f.write("<li><a href=\"" + filename[0].replace("\\", "/") + ".xhtml\">" + escape(title) + "</a></li>\n")
|
||||
f.write("</ol>\n</nav>\n</body>\n</html>")
|
||||
f.close()
|
||||
@@ -348,7 +348,7 @@ def buildOPF(dstdir, title, filelist, cover=None):
|
||||
f.close()
|
||||
|
||||
|
||||
def buildEPUB(path, chapterNames, tomeNumber):
|
||||
def buildEPUB(path, chapternames, tomenumber):
|
||||
filelist = []
|
||||
chapterlist = []
|
||||
cover = None
|
||||
@@ -439,9 +439,9 @@ def buildEPUB(path, chapterNames, tomeNumber):
|
||||
cover = os.path.join(os.path.join(path, 'OEBPS', 'Images'),
|
||||
'cover' + getImageFileName(filelist[-1][1])[1])
|
||||
options.covers.append((image.Cover(os.path.join(filelist[-1][0], filelist[-1][1]), cover, options,
|
||||
tomeNumber), options.uuid))
|
||||
tomenumber), options.uuid))
|
||||
# Overwrite chapternames if tree is flat and ComicInfo.xml has bookmarks
|
||||
if not chapterNames and options.chapters:
|
||||
if not chapternames and options.chapters:
|
||||
chapterlist = []
|
||||
globaldiff = 0
|
||||
for aChapter in options.chapters:
|
||||
@@ -453,10 +453,10 @@ def buildEPUB(path, chapterNames, tomeNumber):
|
||||
pageid -= 1
|
||||
filename = filelist[pageid][1]
|
||||
chapterlist.append((filelist[pageid][0].replace('Images', 'Text'), filename))
|
||||
chapterNames[filename] = aChapter[1]
|
||||
chapternames[filename] = aChapter[1]
|
||||
globaldiff = pageid - (aChapter[0] + globaldiff)
|
||||
buildNCX(path, options.title, chapterlist, chapterNames)
|
||||
buildNAV(path, options.title, chapterlist, chapterNames)
|
||||
buildNCX(path, options.title, chapterlist, chapternames)
|
||||
buildNAV(path, options.title, chapterlist, chapternames)
|
||||
buildOPF(path, options.title, filelist, cover)
|
||||
|
||||
|
||||
@@ -542,7 +542,7 @@ def getWorkFolder(afile):
|
||||
copytree(afile, fullPath)
|
||||
sanitizePermissions(fullPath)
|
||||
return workdir
|
||||
except:
|
||||
except Exception:
|
||||
rmtree(workdir, True)
|
||||
raise UserWarning("Failed to prepare a workspace.")
|
||||
elif os.path.isfile(afile):
|
||||
@@ -560,7 +560,7 @@ def getWorkFolder(afile):
|
||||
if cbx.isCbxFile():
|
||||
try:
|
||||
path = cbx.extract(workdir)
|
||||
except:
|
||||
except Exception:
|
||||
rmtree(workdir, True)
|
||||
raise UserWarning("Failed to extract archive.")
|
||||
else:
|
||||
@@ -575,7 +575,7 @@ def getWorkFolder(afile):
|
||||
return newpath
|
||||
|
||||
|
||||
def getOutputFilename(srcpath, wantedname, ext, tomeNumber):
|
||||
def getOutputFilename(srcpath, wantedname, ext, tomenumber):
|
||||
if srcpath[-1] == os.path.sep:
|
||||
srcpath = srcpath[:-1]
|
||||
if 'Ko' in options.profile and options.format == 'EPUB':
|
||||
@@ -589,16 +589,16 @@ def getOutputFilename(srcpath, wantedname, ext, tomeNumber):
|
||||
filename = os.path.join(os.path.abspath(options.output),
|
||||
os.path.basename(os.path.splitext(srcpath)[0]) + ext)
|
||||
elif os.path.isdir(srcpath):
|
||||
filename = srcpath + tomeNumber + ext
|
||||
filename = srcpath + tomenumber + ext
|
||||
else:
|
||||
if 'Ko' in options.profile and options.format == 'EPUB':
|
||||
path = srcpath.split(os.path.sep)
|
||||
path[-1] = ''.join(e for e in path[-1].split('.')[0] if e.isalnum()) + tomeNumber + ext
|
||||
path[-1] = ''.join(e for e in path[-1].split('.')[0] if e.isalnum()) + tomenumber + ext
|
||||
if not path[-1].split('.')[0]:
|
||||
path[-1] = 'KCCPlaceholder' + tomeNumber + ext
|
||||
path[-1] = 'KCCPlaceholder' + tomenumber + ext
|
||||
filename = os.path.sep.join(path)
|
||||
else:
|
||||
filename = os.path.splitext(srcpath)[0] + tomeNumber + ext
|
||||
filename = os.path.splitext(srcpath)[0] + tomenumber + ext
|
||||
if os.path.isfile(filename):
|
||||
counter = 0
|
||||
basename = os.path.splitext(filename)[0]
|
||||
@@ -608,7 +608,7 @@ def getOutputFilename(srcpath, wantedname, ext, tomeNumber):
|
||||
return filename
|
||||
|
||||
|
||||
def getComicInfo(path, originalPath):
|
||||
def getComicInfo(path, originalpath):
|
||||
xmlPath = os.path.join(path, 'ComicInfo.xml')
|
||||
options.authors = ['KCC']
|
||||
options.remoteCovers = {}
|
||||
@@ -617,10 +617,10 @@ def getComicInfo(path, originalPath):
|
||||
titleSuffix = ''
|
||||
if options.title == 'defaulttitle':
|
||||
defaultTitle = True
|
||||
if os.path.isdir(originalPath):
|
||||
options.title = os.path.basename(originalPath)
|
||||
if os.path.isdir(originalpath):
|
||||
options.title = os.path.basename(originalpath)
|
||||
else:
|
||||
options.title = os.path.splitext(os.path.basename(originalPath))[0]
|
||||
options.title = os.path.splitext(os.path.basename(originalpath))[0]
|
||||
else:
|
||||
defaultTitle = False
|
||||
if os.path.exists(xmlPath):
|
||||
@@ -655,10 +655,10 @@ def getComicInfo(path, originalPath):
|
||||
os.remove(xmlPath)
|
||||
|
||||
|
||||
def getCoversFromMCB(mangaID):
|
||||
def getCoversFromMCB(mangaid):
|
||||
covers = {}
|
||||
try:
|
||||
jsonRaw = urlopen(Request('http://mcd.iosphe.re/api/v1/series/' + mangaID + '/',
|
||||
jsonRaw = urlopen(Request('http://mcd.iosphe.re/api/v1/series/' + mangaid + '/',
|
||||
headers={'User-Agent': 'KindleComicConverter/' + __version__}))
|
||||
jsonData = loads(jsonRaw.read().decode('utf-8'))
|
||||
for volume in jsonData['Covers']['a']:
|
||||
@@ -683,9 +683,9 @@ def getTopMargin(deviceres, size):
|
||||
return str(round(y, 1))
|
||||
|
||||
|
||||
def getPanelViewResolution(imageSize, deviceRes):
|
||||
scale = float(deviceRes[0]) / float(imageSize[0])
|
||||
return int(deviceRes[0]), int(scale * imageSize[1])
|
||||
def getPanelViewResolution(imagesize, deviceres):
|
||||
scale = float(deviceres[0]) / float(imagesize[0])
|
||||
return int(deviceres[0]), int(scale * imagesize[1])
|
||||
|
||||
|
||||
def getPanelViewSize(deviceres, size):
|
||||
@@ -804,19 +804,19 @@ def splitProcess(path, mode):
|
||||
return output
|
||||
|
||||
|
||||
def detectCorruption(tmpPath, orgPath):
|
||||
def detectCorruption(tmppath, orgpath):
|
||||
imageNumber = 0
|
||||
imageSmaller = 0
|
||||
alreadyProcessed = False
|
||||
for root, _, files in os.walk(tmpPath, False):
|
||||
for root, _, files in os.walk(tmppath, False):
|
||||
for name in files:
|
||||
if getImageFileName(name) is not None:
|
||||
if not alreadyProcessed and getImageFileName(name)[0].endswith('-kcc'):
|
||||
alreadyProcessed = True
|
||||
path = os.path.join(root, name)
|
||||
pathOrg = orgPath + path.split('OEBPS' + os.path.sep + 'Images')[1]
|
||||
pathOrg = orgpath + path.split('OEBPS' + os.path.sep + 'Images')[1]
|
||||
if os.path.getsize(path) == 0:
|
||||
rmtree(os.path.join(tmpPath, '..', '..'), True)
|
||||
rmtree(os.path.join(tmppath, '..', '..'), True)
|
||||
raise RuntimeError('Image file %s is corrupted.' % pathOrg)
|
||||
try:
|
||||
img = Image.open(path)
|
||||
@@ -827,7 +827,7 @@ def detectCorruption(tmpPath, orgPath):
|
||||
if options.profileData[1][0] > img.size[0] and options.profileData[1][1] > img.size[1]:
|
||||
imageSmaller += 1
|
||||
except Exception as err:
|
||||
rmtree(os.path.join(tmpPath, '..', '..'), True)
|
||||
rmtree(os.path.join(tmppath, '..', '..'), True)
|
||||
if 'decoder' in str(err) and 'not available' in str(err):
|
||||
raise RuntimeError('Pillow was compiled without JPG and/or PNG decoder.')
|
||||
else:
|
||||
@@ -856,8 +856,8 @@ def createNewTome():
|
||||
return tomePath, tomePathRoot
|
||||
|
||||
|
||||
def slugify(value, isDir):
|
||||
if isDir:
|
||||
def slugify(value, isdir):
|
||||
if isdir:
|
||||
value = slugifyExt(value, regex_pattern=r'[^-a-z0-9_\.]+')
|
||||
else:
|
||||
value = slugifyExt(value)
|
||||
@@ -865,19 +865,19 @@ def slugify(value, isDir):
|
||||
return value
|
||||
|
||||
|
||||
def makeZIP(zipFilename, baseDir, isEPUB=False):
|
||||
zipFilename = os.path.abspath(zipFilename) + '.zip'
|
||||
zipOutput = ZipFile(zipFilename, 'w', ZIP_DEFLATED)
|
||||
if isEPUB:
|
||||
def makeZIP(zipfilename, basedir, isepub=False):
|
||||
zipfilename = os.path.abspath(zipfilename) + '.zip'
|
||||
zipOutput = ZipFile(zipfilename, 'w', ZIP_DEFLATED)
|
||||
if isepub:
|
||||
zipOutput.writestr('mimetype', 'application/epub+zip', ZIP_STORED)
|
||||
for dirpath, _, filenames in os.walk(baseDir):
|
||||
for dirpath, _, filenames in os.walk(basedir):
|
||||
for name in filenames:
|
||||
path = os.path.normpath(os.path.join(dirpath, name))
|
||||
aPath = os.path.normpath(os.path.join(dirpath.replace(baseDir, ''), name))
|
||||
aPath = os.path.normpath(os.path.join(dirpath.replace(basedir, ''), name))
|
||||
if os.path.isfile(path):
|
||||
zipOutput.write(path, aPath)
|
||||
zipOutput.close()
|
||||
return zipFilename
|
||||
return zipfilename
|
||||
|
||||
|
||||
def makeParser():
|
||||
@@ -1039,13 +1039,13 @@ def checkPre(source):
|
||||
try:
|
||||
with TemporaryFile(prefix='KCC-', dir=src):
|
||||
pass
|
||||
except:
|
||||
except Exception:
|
||||
raise UserWarning("Target directory is not writable.")
|
||||
|
||||
|
||||
def makeBook(source, qtGUI=None):
|
||||
def makeBook(source, qtgui=None):
|
||||
global GUI
|
||||
GUI = qtGUI
|
||||
GUI = qtgui
|
||||
if GUI:
|
||||
GUI.progressBarTick.emit('1')
|
||||
else:
|
||||
@@ -1061,7 +1061,7 @@ def makeBook(source, qtGUI=None):
|
||||
y = 1024
|
||||
else:
|
||||
y = image.ProfileData.Profiles[options.profile][1][1]
|
||||
comic2panel.main(['-y ' + str(y), '-i', '-m', path], qtGUI)
|
||||
comic2panel.main(['-y ' + str(y), '-i', '-m', path], qtgui)
|
||||
print("Processing images...")
|
||||
if GUI:
|
||||
GUI.progressBarTick.emit('Processing images')
|
||||
@@ -1192,9 +1192,9 @@ def makeMOBIWorker(item):
|
||||
return [kindlegenErrorCode, kindlegenError, item]
|
||||
|
||||
|
||||
def makeMOBI(work, qtGUI=None):
|
||||
def makeMOBI(work, qtgui=None):
|
||||
global GUI, makeMOBIWorkerPool, makeMOBIWorkerOutput
|
||||
GUI = qtGUI
|
||||
GUI = qtgui
|
||||
makeMOBIWorkerOutput = []
|
||||
availableMemory = virtual_memory().total / 1000000000
|
||||
if availableMemory <= 2:
|
||||
|
||||
@@ -93,6 +93,7 @@ def splitImageTick(output):
|
||||
splitWorkerPool.terminate()
|
||||
|
||||
|
||||
# noinspection PyUnboundLocalVariable
|
||||
def splitImage(work):
|
||||
try:
|
||||
path = work[0]
|
||||
@@ -140,9 +141,7 @@ def splitImage(work):
|
||||
|
||||
if opt.debug:
|
||||
for panel in panelsProcessed:
|
||||
# noinspection PyUnboundLocalVariable
|
||||
draw.rectangle([(0, panel[0]), (widthImg, panel[1])], (0, 255, 0, 128), (0, 0, 255, 255))
|
||||
# noinspection PyUnboundLocalVariable
|
||||
debugImage = Image.alpha_composite(imgOrg.convert(mode='RGBA'), drawImg)
|
||||
debugImage.save(os.path.join(path, os.path.splitext(name)[0] + '-debug.png'), 'PNG')
|
||||
|
||||
@@ -185,7 +184,7 @@ def splitImage(work):
|
||||
return str(sys.exc_info()[1]), sanitizeTrace(sys.exc_info()[2])
|
||||
|
||||
|
||||
def main(argv=None, qtGUI=None):
|
||||
def main(argv=None, qtgui=None):
|
||||
global options, GUI, splitWorkerPool, splitWorkerOutput, mergeWorkerPool, mergeWorkerOutput
|
||||
parser = OptionParser(usage="Usage: kcc-c2p [options] comic_folder", add_help_option=False)
|
||||
mainOptions = OptionGroup(parser, "MANDATORY")
|
||||
@@ -203,8 +202,8 @@ def main(argv=None, qtGUI=None):
|
||||
parser.add_option_group(mainOptions)
|
||||
parser.add_option_group(otherOptions)
|
||||
options, args = parser.parse_args(argv)
|
||||
if qtGUI:
|
||||
GUI = qtGUI
|
||||
if qtgui:
|
||||
GUI = qtgui
|
||||
else:
|
||||
GUI = None
|
||||
if len(args) != 1:
|
||||
|
||||
@@ -299,53 +299,53 @@ class ComicPage:
|
||||
if self.image.size[0] > self.size[0] or self.image.size[1] > self.size[1]:
|
||||
self.image.thumbnail(self.size, Image.LANCZOS)
|
||||
|
||||
def getBoundingBox(self, tmpImg):
|
||||
min_margin = [int(0.005 * i + 0.5) for i in tmpImg.size]
|
||||
max_margin = [int(0.1 * i + 0.5) for i in tmpImg.size]
|
||||
bbox = tmpImg.getbbox()
|
||||
def getBoundingBox(self, tmptmg):
|
||||
min_margin = [int(0.005 * i + 0.5) for i in tmptmg.size]
|
||||
max_margin = [int(0.1 * i + 0.5) for i in tmptmg.size]
|
||||
bbox = tmptmg.getbbox()
|
||||
bbox = (
|
||||
max(0, min(max_margin[0], bbox[0] - min_margin[0])),
|
||||
max(0, min(max_margin[1], bbox[1] - min_margin[1])),
|
||||
min(tmpImg.size[0],
|
||||
max(tmpImg.size[0] - max_margin[0], bbox[2] + min_margin[0])),
|
||||
min(tmpImg.size[1],
|
||||
max(tmpImg.size[1] - max_margin[1], bbox[3] + min_margin[1])),
|
||||
min(tmptmg.size[0],
|
||||
max(tmptmg.size[0] - max_margin[0], bbox[2] + min_margin[0])),
|
||||
min(tmptmg.size[1],
|
||||
max(tmptmg.size[1] - max_margin[1], bbox[3] + min_margin[1])),
|
||||
)
|
||||
return bbox
|
||||
|
||||
def cropPageNumber(self, power):
|
||||
if self.fill != 'white':
|
||||
tmpImg = self.image.convert(mode='L')
|
||||
tmptmg = self.image.convert(mode='L')
|
||||
else:
|
||||
tmpImg = ImageOps.invert(self.image.convert(mode='L'))
|
||||
tmpImg = tmpImg.point(lambda x: x and 255)
|
||||
tmpImg = tmpImg.filter(ImageFilter.MinFilter(size=3))
|
||||
tmpImg = tmpImg.filter(ImageFilter.GaussianBlur(radius=5))
|
||||
tmpImg = tmpImg.point(lambda x: (x >= 16 * power) and x)
|
||||
self.image = self.image.crop(tmpImg.getbbox()) if tmpImg.getbbox() else self.image
|
||||
tmptmg = ImageOps.invert(self.image.convert(mode='L'))
|
||||
tmptmg = tmptmg.point(lambda x: x and 255)
|
||||
tmptmg = tmptmg.filter(ImageFilter.MinFilter(size=3))
|
||||
tmptmg = tmptmg.filter(ImageFilter.GaussianBlur(radius=5))
|
||||
tmptmg = tmptmg.point(lambda x: (x >= 16 * power) and x)
|
||||
self.image = self.image.crop(tmptmg.getbbox()) if tmptmg.getbbox() else self.image
|
||||
|
||||
def cropMargin(self, power):
|
||||
if self.fill != 'white':
|
||||
tmpImg = self.image.convert(mode='L')
|
||||
tmptmg = self.image.convert(mode='L')
|
||||
else:
|
||||
tmpImg = ImageOps.invert(self.image.convert(mode='L'))
|
||||
tmpImg = tmpImg.filter(ImageFilter.GaussianBlur(radius=3))
|
||||
tmpImg = tmpImg.point(lambda x: (x >= 16 * power) and x)
|
||||
self.image = self.image.crop(self.getBoundingBox(tmpImg)) if tmpImg.getbbox() else self.image
|
||||
tmptmg = ImageOps.invert(self.image.convert(mode='L'))
|
||||
tmptmg = tmptmg.filter(ImageFilter.GaussianBlur(radius=3))
|
||||
tmptmg = tmptmg.point(lambda x: (x >= 16 * power) and x)
|
||||
self.image = self.image.crop(self.getBoundingBox(tmptmg)) if tmptmg.getbbox() else self.image
|
||||
|
||||
|
||||
class Cover:
|
||||
def __init__(self, source, target, opt, tomeNumber):
|
||||
def __init__(self, source, target, opt, tomeid):
|
||||
self.options = opt
|
||||
self.source = source
|
||||
self.target = target
|
||||
if tomeNumber == 0:
|
||||
self.tomeNumber = 1
|
||||
if tomeid == 0:
|
||||
self.tomeid = 1
|
||||
else:
|
||||
self.tomeNumber = tomeNumber
|
||||
if self.tomeNumber in self.options.remoteCovers:
|
||||
self.tomeid = tomeid
|
||||
if self.tomeid in self.options.remoteCovers:
|
||||
try:
|
||||
source = urlopen(Request(quote(self.options.remoteCovers[self.tomeNumber]).replace('%3A', ':', 1),
|
||||
source = urlopen(Request(quote(self.options.remoteCovers[self.tomeid]).replace('%3A', ':', 1),
|
||||
headers={'User-Agent': 'KindleComicConverter/' + __version__})).read()
|
||||
self.image = Image.open(BytesIO(source))
|
||||
except Exception:
|
||||
|
||||
@@ -25,17 +25,16 @@ from string import ascii_uppercase, digits
|
||||
|
||||
|
||||
class PdfJpgExtract:
|
||||
def __init__(self, origFileName):
|
||||
self.origFileName = origFileName
|
||||
self.filename = os.path.splitext(origFileName)
|
||||
# noinspection PyUnusedLocal
|
||||
self.path = self.filename[0] + "-KCC-" + ''.join(choice(ascii_uppercase + digits) for x in range(3))
|
||||
def __init__(self, fname):
|
||||
self.fname = fname
|
||||
self.filename = os.path.splitext(fname)
|
||||
self.path = self.filename[0] + "-KCC-" + ''.join(choice(ascii_uppercase + digits) for _ in range(3))
|
||||
|
||||
def getPath(self):
|
||||
return self.path
|
||||
|
||||
def extract(self):
|
||||
pdf = open(self.origFileName, "rb").read()
|
||||
pdf = open(self.fname, "rb").read()
|
||||
startmark = b"\xff\xd8"
|
||||
startfix = 0
|
||||
endmark = b"\xff\xd9"
|
||||
|
||||
@@ -73,8 +73,8 @@ def walkLevel(some_dir, level=1):
|
||||
del dirs[:]
|
||||
|
||||
|
||||
def md5Checksum(filePath):
|
||||
with open(filePath, 'rb') as fh:
|
||||
def md5Checksum(fpath):
|
||||
with open(fpath, 'rb') as fh:
|
||||
m = md5()
|
||||
while True:
|
||||
data = fh.read(8192)
|
||||
@@ -84,8 +84,8 @@ def md5Checksum(filePath):
|
||||
return m.hexdigest()
|
||||
|
||||
|
||||
def check7ZFile(filePath):
|
||||
with open(filePath, 'rb') as fh:
|
||||
def check7ZFile(fpath):
|
||||
with open(fpath, 'rb') as fh:
|
||||
header = fh.read(6)
|
||||
return header == b"7z\xbc\xaf'\x1c"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user