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):