From 1ea008c8f3e15a98dfba5092512e333e5c46fb83 Mon Sep 17 00:00:00 2001 From: Alex Xu Date: Fri, 17 May 2024 09:56:04 -0700 Subject: [PATCH] reduce dependency on 7z, unar, homebrew by using builtin tar (#693) * reduce dependency on 7z, unar, homebrew by using builtin tar * update readme * fix typo * add editor text * remove unar * Revert "remove unar" This reverts commit 2c4b239d6709fbf5e10ad130aa7f512ca462ee78. * Revert "fix typo" This reverts commit 79752c7f3807089a6a8374a27e84298a258df8a0. * Revert "update readme" This reverts commit 4f5c727a2d889eca05a769e0a97044cc2bfd06eb. --- kindlecomicconverter/KCC_gui.py | 16 ++++++++++++---- kindlecomicconverter/comic2ebook.py | 3 +++ kindlecomicconverter/comicarchive.py | 16 +++++++++++----- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/kindlecomicconverter/KCC_gui.py b/kindlecomicconverter/KCC_gui.py index 2f7d215..42a5adc 100644 --- a/kindlecomicconverter/KCC_gui.py +++ b/kindlecomicconverter/KCC_gui.py @@ -462,7 +462,7 @@ class KCCGUI(KCC_ui.Ui_mainWindow): if self.needClean: self.needClean = False GUI.jobList.clear() - if self.sevenzip: + if self.tar or self.sevenzip: fnames = QtWidgets.QFileDialog.getOpenFileNames(MW, 'Select file', self.lastPath, 'Comic (*.cbz *.cbr *.cb7 *.zip *.rar *.7z *.pdf);;All (*.*)') else: @@ -492,6 +492,8 @@ class KCCGUI(KCC_ui.Ui_mainWindow): else: fname = [''] self.showDialog("Editor is disabled due to a lack of 7z.", 'error') + self.addMessage('Install 7z (link)' + ' to enable metadata editing.', 'warning') if fname[0] != '': if sys.platform.startswith('win'): sname = fname[0].replace('/', '\\') @@ -802,7 +804,7 @@ class KCCGUI(KCC_ui.Ui_mainWindow): self.needClean = False GUI.jobList.clear() formats = ['.pdf'] - if self.sevenzip: + if self.tar or self.sevenzip: formats.extend(['.cb7', '.7z', '.cbz', '.zip', '.cbr', '.rar']) if os.path.isdir(message): GUI.jobList.addItem(message) @@ -1028,13 +1030,19 @@ class KCCGUI(KCC_ui.Ui_mainWindow): self.addMessage('Since you are a new user of KCC please see few ' 'important tips.', 'info') + try: + subprocess_run_silent(['tar'], stdout=PIPE, stderr=STDOUT) + self.tar = True + except FileNotFoundError: + self.tar = False try: subprocess_run_silent(['7z'], stdout=PIPE, stderr=STDOUT) self.sevenzip = True except FileNotFoundError: self.sevenzip = False - self.addMessage('Install 7z (link)' - ' to enable CBZ/CBR/ZIP/etc processing.', 'warning') + if not self.tar: + self.addMessage('Install 7z (link)' + ' to enable CBZ/CBR/ZIP/etc processing.', 'warning') self.detectKindleGen(True) APP.messageFromOtherInstance.connect(self.handleMessage) diff --git a/kindlecomicconverter/comic2ebook.py b/kindlecomicconverter/comic2ebook.py index 8531b9b..182fb2d 100755 --- a/kindlecomicconverter/comic2ebook.py +++ b/kindlecomicconverter/comic2ebook.py @@ -644,6 +644,9 @@ def getWorkFolder(afile): try: cbx = comicarchive.ComicArchive(afile) path = cbx.extract(workdir) + tdir = os.listdir(workdir) + if 'ComicInfo.xml' in tdir: + tdir.remove('ComicInfo.xml') except OSError as e: rmtree(workdir, True) raise UserWarning(e) diff --git a/kindlecomicconverter/comicarchive.py b/kindlecomicconverter/comicarchive.py index a256973..23cfac4 100644 --- a/kindlecomicconverter/comicarchive.py +++ b/kindlecomicconverter/comicarchive.py @@ -23,7 +23,7 @@ import platform import subprocess import distro from shutil import move -from subprocess import STDOUT, PIPE +from subprocess import STDOUT, PIPE, CalledProcessError from xml.dom.minidom import parseString from xml.parsers.expat import ExpatError from .shared import subprocess_run_silent @@ -37,7 +37,10 @@ class ComicArchive: self.type = None if not os.path.isfile(self.filepath): raise OSError('File not found.') - process = subprocess_run_silent(['7z', 'l', '-y', '-p1', self.filepath], stderr=STDOUT, stdout=PIPE) + try: + process = subprocess_run_silent(['7z', 'l', '-y', '-p1', self.filepath], stderr=STDOUT, stdout=PIPE) + except FileNotFoundError: + return for line in process.stdout.splitlines(): if b'Type =' in line: self.type = line.rstrip().decode().split(' = ')[1].upper() @@ -54,6 +57,12 @@ class ComicArchive: def extract(self, targetdir): if not os.path.isdir(targetdir): raise OSError('Target directory doesn\'t exist.') + try: + process = subprocess_run_silent(['tar', '-xf', self.filepath, '-C', targetdir], + stdout=PIPE, stderr=STDOUT, check=True) + return targetdir + except (FileNotFoundError, CalledProcessError): + pass process = subprocess_run_silent(['7z', 'x', '-y', '-xr!__MACOSX', '-xr!.DS_Store', '-xr!thumbs.db', '-xr!Thumbs.db', '-o' + targetdir, self.filepath], stdout=PIPE, stderr=STDOUT) if process.returncode != 0 and distro.id() == 'fedora': @@ -66,9 +75,6 @@ class ComicArchive: stdout=PIPE, stderr=STDOUT) elif process.returncode != 0: raise OSError(EXTRACTION_ERROR) - tdir = os.listdir(targetdir) - if 'ComicInfo.xml' in tdir: - tdir.remove('ComicInfo.xml') return targetdir def addFile(self, sourcefile):