mirror of
https://github.com/ciromattia/kcc
synced 2025-12-13 09:46:25 +00:00
Fixed CBR parsing anomalies (close #133)
This commit is contained in:
@@ -22,6 +22,7 @@ from zipfile import is_zipfile, ZipFile
|
|||||||
from subprocess import STDOUT, PIPE
|
from subprocess import STDOUT, PIPE
|
||||||
from psutil import Popen
|
from psutil import Popen
|
||||||
from shutil import move, copy
|
from shutil import move, copy
|
||||||
|
from scandir import walk
|
||||||
from . import rarfile
|
from . import rarfile
|
||||||
from .shared import check7ZFile as is_7zfile, saferReplace
|
from .shared import check7ZFile as is_7zfile, saferReplace
|
||||||
|
|
||||||
@@ -45,7 +46,7 @@ class CBxArchive:
|
|||||||
cbzFile = ZipFile(self.origFileName)
|
cbzFile = ZipFile(self.origFileName)
|
||||||
filelist = []
|
filelist = []
|
||||||
for f in cbzFile.namelist():
|
for f in cbzFile.namelist():
|
||||||
if f.startswith('__MACOSX') or f.endswith('.DS_Store') or f.endswith('thumbs.db'):
|
if f.startswith('__MACOSX') or f.endswith('.DS_Store') or f.endswith('humbs.db'):
|
||||||
pass # skip MacOS special files
|
pass # skip MacOS special files
|
||||||
elif f.endswith('/'):
|
elif f.endswith('/'):
|
||||||
try:
|
try:
|
||||||
@@ -58,25 +59,18 @@ class CBxArchive:
|
|||||||
|
|
||||||
def extractCBR(self, targetdir):
|
def extractCBR(self, targetdir):
|
||||||
cbrFile = rarfile.RarFile(self.origFileName)
|
cbrFile = rarfile.RarFile(self.origFileName)
|
||||||
filelist = []
|
cbrFile.extractall(targetdir)
|
||||||
for f in cbrFile.namelist():
|
for root, dirnames, filenames in walk(targetdir):
|
||||||
if f.startswith('__MACOSX') or f.endswith('.DS_Store') or f.endswith('thumbs.db'):
|
for filename in filenames:
|
||||||
pass # skip MacOS special files
|
if filename.startswith('__MACOSX') or filename.endswith('.DS_Store') or filename.endswith('humbs.db'):
|
||||||
elif f.endswith('/'):
|
os.remove(os.path.join(root, filename))
|
||||||
try:
|
|
||||||
os.makedirs(os.path.join(targetdir, f))
|
|
||||||
except Exception:
|
|
||||||
pass # the dir exists so we are going to extract the images only.
|
|
||||||
else:
|
|
||||||
filelist.append(f)
|
|
||||||
cbrFile.extractall(targetdir, filelist)
|
|
||||||
|
|
||||||
def extractCB7(self, targetdir):
|
def extractCB7(self, targetdir):
|
||||||
# Workaround for some wide UTF-8 + Popen abnormalities
|
# Workaround for some wide UTF-8 + Popen abnormalities
|
||||||
if sys.platform.startswith('darwin'):
|
if sys.platform.startswith('darwin'):
|
||||||
copy(self.origFileName, os.path.join(os.path.dirname(self.origFileName), 'TMP_KCC_TMP'))
|
copy(self.origFileName, os.path.join(os.path.dirname(self.origFileName), 'TMP_KCC_TMP'))
|
||||||
self.origFileName = os.path.join(os.path.dirname(self.origFileName), 'TMP_KCC_TMP')
|
self.origFileName = os.path.join(os.path.dirname(self.origFileName), 'TMP_KCC_TMP')
|
||||||
output = Popen('7za x "' + self.origFileName + '" -xr!__MACOSX -xr!.DS_Store -xr!thumbs.db -o"'
|
output = Popen('7za x "' + self.origFileName + '" -xr!__MACOSX -xr!.DS_Store -xr!thumbs.db -xr!Thumbs.db -o"'
|
||||||
+ targetdir + '"', stdout=PIPE, stderr=STDOUT, shell=True)
|
+ targetdir + '"', stdout=PIPE, stderr=STDOUT, shell=True)
|
||||||
extracted = False
|
extracted = False
|
||||||
for line in output.stdout:
|
for line in output.stdout:
|
||||||
|
|||||||
@@ -579,7 +579,7 @@ def getWorkFolder(afile):
|
|||||||
if len(afile) > 240:
|
if len(afile) > 240:
|
||||||
raise UserWarning("Path is too long.")
|
raise UserWarning("Path is too long.")
|
||||||
if os.path.isdir(afile):
|
if os.path.isdir(afile):
|
||||||
workdir = mkdtemp('', 'KCC-TMP-')
|
workdir = mkdtemp('', 'KCC-')
|
||||||
try:
|
try:
|
||||||
os.rmdir(workdir)
|
os.rmdir(workdir)
|
||||||
fullPath = os.path.join(workdir, 'OEBPS', 'Images')
|
fullPath = os.path.join(workdir, 'OEBPS', 'Images')
|
||||||
@@ -598,7 +598,7 @@ def getWorkFolder(afile):
|
|||||||
rmtree(path, True)
|
rmtree(path, True)
|
||||||
raise UserWarning("Failed to extract images.")
|
raise UserWarning("Failed to extract images.")
|
||||||
else:
|
else:
|
||||||
workdir = mkdtemp('', 'KCC-TMP-')
|
workdir = mkdtemp('', 'KCC-')
|
||||||
cbx = cbxarchive.CBxArchive(afile)
|
cbx = cbxarchive.CBxArchive(afile)
|
||||||
if cbx.isCbxFile():
|
if cbx.isCbxFile():
|
||||||
try:
|
try:
|
||||||
@@ -935,7 +935,7 @@ def detectMargins(path):
|
|||||||
|
|
||||||
|
|
||||||
def createNewTome():
|
def createNewTome():
|
||||||
tomePathRoot = mkdtemp('', 'KCC-TMP-')
|
tomePathRoot = mkdtemp('', 'KCC-')
|
||||||
tomePath = os.path.join(tomePathRoot, 'OEBPS', 'Images')
|
tomePath = os.path.join(tomePathRoot, 'OEBPS', 'Images')
|
||||||
os.makedirs(tomePath)
|
os.makedirs(tomePath)
|
||||||
return tomePath, tomePathRoot
|
return tomePath, tomePathRoot
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ class MetadataParser:
|
|||||||
self.rawdata = parse(xml_file)
|
self.rawdata = parse(xml_file)
|
||||||
elif is_7zfile(self.source):
|
elif is_7zfile(self.source):
|
||||||
self.compressor = '7z'
|
self.compressor = '7z'
|
||||||
workdir = mkdtemp('', 'KCC-TMP-')
|
workdir = mkdtemp('', 'KCC-')
|
||||||
tmpXML = os.path.join(workdir, 'ComicInfo.xml')
|
tmpXML = os.path.join(workdir, 'ComicInfo.xml')
|
||||||
output = Popen('7za e "' + self.source + '" ComicInfo.xml -o"' + workdir + '"',
|
output = Popen('7za e "' + self.source + '" ComicInfo.xml -o"' + workdir + '"',
|
||||||
stdout=PIPE, stderr=STDOUT, shell=True)
|
stdout=PIPE, stderr=STDOUT, shell=True)
|
||||||
@@ -147,7 +147,7 @@ class MetadataParser:
|
|||||||
with open(self.source, 'w', encoding='utf-8') as f:
|
with open(self.source, 'w', encoding='utf-8') as f:
|
||||||
self.rawdata.writexml(f, encoding='utf-8')
|
self.rawdata.writexml(f, encoding='utf-8')
|
||||||
else:
|
else:
|
||||||
workdir = mkdtemp('', 'KCC-TMP-')
|
workdir = mkdtemp('', 'KCC-')
|
||||||
tmpXML = os.path.join(workdir, 'ComicInfo.xml')
|
tmpXML = os.path.join(workdir, 'ComicInfo.xml')
|
||||||
with open(tmpXML, 'w', encoding='utf-8') as f:
|
with open(tmpXML, 'w', encoding='utf-8') as f:
|
||||||
self.rawdata.writexml(f, encoding='utf-8')
|
self.rawdata.writexml(f, encoding='utf-8')
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class PdfJpgExtract:
|
|||||||
self.origFileName = origFileName
|
self.origFileName = origFileName
|
||||||
self.filename = os.path.splitext(origFileName)
|
self.filename = os.path.splitext(origFileName)
|
||||||
# noinspection PyUnusedLocal
|
# noinspection PyUnusedLocal
|
||||||
self.path = self.filename[0] + "-KCC-TMP-" + ''.join(choice(ascii_uppercase + digits) for x in range(3))
|
self.path = self.filename[0] + "-KCC-" + ''.join(choice(ascii_uppercase + digits) for x in range(3))
|
||||||
|
|
||||||
def getPath(self):
|
def getPath(self):
|
||||||
return self.path
|
return self.path
|
||||||
|
|||||||
@@ -104,9 +104,9 @@ def saferReplace(old, new):
|
|||||||
|
|
||||||
|
|
||||||
def removeFromZIP(zipfname, *filenames):
|
def removeFromZIP(zipfname, *filenames):
|
||||||
tempdir = mkdtemp('', 'KCC-TMP-')
|
tempdir = mkdtemp('', 'KCC-')
|
||||||
try:
|
try:
|
||||||
tempname = os.path.join(tempdir, 'KCC-TMP.zip')
|
tempname = os.path.join(tempdir, 'KCC.zip')
|
||||||
with ZipFile(zipfname, 'r') as zipread:
|
with ZipFile(zipfname, 'r') as zipread:
|
||||||
with ZipFile(tempname, 'w', compression=ZIP_DEFLATED) as zipwrite:
|
with ZipFile(tempname, 'w', compression=ZIP_DEFLATED) as zipwrite:
|
||||||
for item in zipread.infolist():
|
for item in zipread.infolist():
|
||||||
|
|||||||
Reference in New Issue
Block a user