diff --git a/kcc.py b/kcc.py index f53ab11..ea8fe68 100644 --- a/kcc.py +++ b/kcc.py @@ -77,7 +77,7 @@ elif sys.platform.startswith('win'): # Implementing detection of already running KCC instance and forwarding argv to it class QApplicationMessaging(QtWidgets.QApplication): - messageFromOtherInstance = QtCore.pyqtSignal(str) + messageFromOtherInstance = QtCore.pyqtSignal(bytes) def __init__(self, argv): QtWidgets.QApplication.__init__(self, argv) @@ -102,7 +102,7 @@ class QApplicationMessaging(QtWidgets.QApplication): def handleMessage(self): socket = self._server.nextPendingConnection() if socket.waitForReadyRead(self._timeout): - self.messageFromOtherInstance.emit(socket.readAll().data().decode('utf8')) + self.messageFromOtherInstance.emit(socket.readAll().data()) def sendMessage(self, message): if self.isRunning(): @@ -110,7 +110,8 @@ class QApplicationMessaging(QtWidgets.QApplication): socket.connectToServer(self._key, QtCore.QIODevice.WriteOnly) if not socket.waitForConnected(self._timeout): return False - socket.write(message.encode('utf8')) + # noinspection PyArgumentList + socket.write(bytes(message, 'UTF-8')) if not socket.waitForBytesWritten(self._timeout): return False socket.disconnectFromServer() @@ -133,7 +134,7 @@ if __name__ == "__main__": KCCAplication = QApplicationMessaging(sys.argv) if KCCAplication.isRunning(): if len(sys.argv) > 1: - KCCAplication.sendMessage(sys.argv[1].decode(sys.getfilesystemencoding())) + KCCAplication.sendMessage(sys.argv[1]) sys.exit(0) else: messageBox = QtWidgets.QMessageBox() @@ -146,5 +147,5 @@ if __name__ == "__main__": KCCWindow = QMainWindowKCC() KCCUI = KCC_gui.KCCGUI(KCCAplication, KCCWindow) if len(sys.argv) > 1: - KCCUI.handleMessage(sys.argv[1].decode(sys.getfilesystemencoding())) + KCCUI.handleMessage(sys.argv[1]) sys.exit(KCCAplication.exec_()) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index da5d036..b8528c0 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -129,7 +129,7 @@ class WebServerHandler(BaseHTTPRequestHandler): '\n' '\n', 'UTF-8')) elif sendReply: - outputFile = GUI.completedWork[urllib.parse.unquote(self.path[1:])].decode('utf-8') + outputFile = GUI.completedWork[urllib.parse.unquote(self.path[1:])] fp = open(outputFile, 'rb') self.send_response(200) self.send_header('Content-type', mimetype) @@ -243,8 +243,7 @@ class KindleGenThread(QtCore.QRunnable): kindlegenError = '' try: if os.path.getsize(self.work) < 367001600: - output = Popen('kindlegen -locale en "' + self.work.encode(sys.getfilesystemencoding()).decode('utf-8') - + '"', stdout=PIPE, stderr=STDOUT, shell=True) + output = Popen('kindlegen -locale en "' + self.work + '"', stdout=PIPE, stderr=STDOUT, shell=True) for line in output.stdout: line = line.decode('utf-8') # ERROR: Generic error @@ -486,7 +485,7 @@ class WorkerThread(QtCore.QThread): GUI.progress.content = '' mobiPath = item.replace('.epub', '.mobi') os.remove(mobiPath + '_toclean') - GUI.completedWork[os.path.basename(mobiPath).encode('utf-8')] = mobiPath.encode('utf-8') + GUI.completedWork[os.path.basename(mobiPath)] = mobiPath MW.addMessage.emit('Cleaning MOBI files... Done!', 'info', True) else: GUI.progress.content = '' @@ -516,7 +515,7 @@ class WorkerThread(QtCore.QThread): False) else: for item in outputPath: - GUI.completedWork[os.path.basename(item).encode('utf-8')] = item.encode('utf-8') + GUI.completedWork[os.path.basename(item)] = item GUI.progress.content = '' GUI.progress.stop() MW.hideProgressBar.emit() diff --git a/kcc/cbxarchive.py b/kcc/cbxarchive.py index 1e288cd..09ce2f9 100644 --- a/kcc/cbxarchive.py +++ b/kcc/cbxarchive.py @@ -21,7 +21,6 @@ __docformat__ = 'restructuredtext en' import os import zipfile -import locale from subprocess import STDOUT, PIPE from psutil import Popen from shutil import move @@ -59,7 +58,7 @@ class CBxArchive: cbzFile.extractall(targetdir, filelist) def extractCBR(self, targetdir): - cbrFile = rarfile.RarFile(self.origFileName.encode(locale.getpreferredencoding())) + cbrFile = rarfile.RarFile(self.origFileName) filelist = [] for f in cbrFile.namelist(): if f.startswith('__MACOSX') or f.endswith('.DS_Store') or f.endswith('thumbs.db'): @@ -70,16 +69,15 @@ class CBxArchive: except Exception: pass # the dir exists so we are going to extract the images only. else: - filelist.append(f.encode(locale.getpreferredencoding())) + filelist.append(f) cbrFile.extractall(targetdir, filelist) def extractCB7(self, targetdir): - output = Popen('7za x "' + self.origFileName.encode(locale.getpreferredencoding()) + - '" -xr!__MACOSX -xr!.DS_Store -xr!thumbs.db -o"' + targetdir + '"', - stdout=PIPE, stderr=STDOUT, shell=True) + output = Popen('7za x "' + self.origFileName + '" -xr!__MACOSX -xr!.DS_Store -xr!thumbs.db -o"' + + targetdir + '"', stdout=PIPE, stderr=STDOUT, shell=True) extracted = False for line in output.stdout: - if "Everything is Ok" in line: + if b"Everything is Ok" in line: extracted = True if not extracted: raise OSError @@ -97,6 +95,10 @@ class CBxArchive: adir.remove('ComicInfo.xml') if len(adir) == 1 and os.path.isdir(os.path.join(targetdir, adir[0])): for f in os.listdir(os.path.join(targetdir, adir[0])): + # If directory names contain UTF-8 chars shutil.move can't clean up the mess alone + if os.path.isdir(os.path.join(targetdir, f)): + os.rename(os.path.join(targetdir, adir[0], f), os.path.join(targetdir, adir[0], f + '-A')) + f += '-A' move(os.path.join(targetdir, adir[0], f), targetdir) os.rmdir(os.path.join(targetdir, adir[0])) return targetdir diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 4cc0573..7a7edb7 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -78,7 +78,7 @@ def buildHTML(path, imgfile): if not os.path.exists(htmlpath): os.makedirs(htmlpath) htmlfile = os.path.join(htmlpath, filename[0] + '.html') - f = open(htmlfile, "w") + f = open(htmlfile, "w", encoding='UTF-8') f.writelines(["\n", "\n", @@ -189,9 +189,8 @@ def buildHTML(path, imgfile): def buildNCX(dstdir, title, chapters): options.uuid = str(uuid4()) - #options.uuid = options.uuid.encode('utf-8') ncxfile = os.path.join(dstdir, 'OEBPS', 'toc.ncx') - f = open(ncxfile, "w") + f = open(ncxfile, "w", encoding='UTF-8') f.writelines(["\n", "\n", @@ -227,7 +226,7 @@ def buildOPF(dstdir, title, filelist, cover=None): writingmode = "horizontal-rl" else: writingmode = "horizontal-lr" - f = open(opffile, "w") + f = open(opffile, "w", encoding='UTF-8') f.writelines(["\n", "\n", @@ -284,7 +283,7 @@ def buildOPF(dstdir, title, filelist, cover=None): f.write("\n\n\n\n") f.close() os.mkdir(os.path.join(dstdir, 'META-INF')) - f = open(os.path.join(dstdir, 'META-INF', 'container.xml'), 'w') + f = open(os.path.join(dstdir, 'META-INF', 'container.xml'), 'w', encoding='UTF-8') f.writelines(["\n", "\n", "\n", @@ -426,7 +425,7 @@ def genEpubStruct(path): cover = None _, deviceres, _, _, panelviewsize = options.profileData os.mkdir(os.path.join(path, 'OEBPS', 'Text')) - f = open(os.path.join(path, 'OEBPS', 'Text', 'style.css'), 'w') + f = open(os.path.join(path, 'OEBPS', 'Text', 'style.css'), 'w', encoding='UTF-8') # DON'T COMPRESS CSS. KINDLE WILL FAIL TO PARSE IT. # Generic Panel View support + Margins fix for Non-Kindle devices. f.writelines(["@page {\n",