diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py
index 1316cb0..c57dd9d 100755
--- a/kcc/comic2ebook.py
+++ b/kcc/comic2ebook.py
@@ -25,7 +25,9 @@ __docformat__ = 'restructuredtext en'
import os
import sys
-from re import split, sub
+from json import loads
+from urllib.request import Request, urlopen
+from re import split, sub, compile
from stat import S_IWRITE, S_IREAD, S_IEXEC
from zipfile import ZipFile, ZIP_STORED, ZIP_DEFLATED
from tempfile import mkdtemp
@@ -288,7 +290,7 @@ def buildOPF(dstdir, title, filelist, cover=None):
f.close()
-def buildEPUB(path, chapterNames):
+def buildEPUB(path, chapterNames, tomeNumber):
filelist = []
chapterlist = []
cover = None
@@ -416,7 +418,7 @@ def buildEPUB(path, chapterNames):
if cover is None:
cover = os.path.join(os.path.join(path, 'OEBPS', 'Images'),
'cover' + getImageFileName(filelist[-1][1])[1])
- image.Cover(os.path.join(filelist[-1][0], filelist[-1][1]), cover)
+ image.Cover(os.path.join(filelist[-1][0], filelist[-1][1]), cover, options, tomeNumber)
buildNCX(path, options.title, chapterlist, chapterNames)
# Ensure we're sorting files alphabetically
convert = lambda text: int(text) if text.isdigit() else text
@@ -621,6 +623,7 @@ def getOutputFilename(srcpath, wantedname, ext, tomeNumber):
def getComicInfo(path, originalPath):
xmlPath = os.path.join(path, 'ComicInfo.xml')
options.authors = ['KCC']
+ options.remoteCovers = {}
titleSuffix = ''
if options.title == 'defaulttitle':
defaultTitle = True
@@ -666,9 +669,27 @@ def getComicInfo(path, originalPath):
options.authors.sort()
else:
options.authors = ['KCC']
+ if len(xml.getElementsByTagName('ScanInformation')) != 0:
+ coverId = xml.getElementsByTagName('ScanInformation')[0].firstChild.nodeValue
+ coverId = compile('(MCD\\()(\\d+)(\\))').search(coverId)
+ if coverId:
+ options.remoteCovers = getCoversFromMCB(coverId.group(2))
os.remove(xmlPath)
+def getCoversFromMCB(mangaID):
+ covers = {}
+ try:
+ jsonRaw = urlopen(Request('http://manga.joentjuh.nl/json/series/' + mangaID + '/',
+ headers={'User-Agent': 'KindleComicConverter/' + __version__}))
+ jsonData = loads(jsonRaw.readall().decode('utf-8'))
+ for volume in jsonData['volumes']:
+ covers[int(volume['volume'])] = volume['releases'][0]['files']['front']['url']
+ except Exception:
+ return {}
+ return covers
+
+
def getDirectorySize(start_path='.'):
total_size = 0
for dirpath, dirnames, filenames in os.walk(start_path):
@@ -1084,7 +1105,7 @@ def makeBook(source, qtGUI=None):
makeZIP(tome + '_comic', os.path.join(tome, "OEBPS", "Images"))
else:
print("\nCreating EPUB structure...")
- buildEPUB(tome, chapterNames)
+ buildEPUB(tome, chapterNames, tomeNumber)
# actually zip the ePub
if len(tomes) > 1:
filepath.append(getOutputFilename(source, options.output, '.epub', ' ' + str(tomeNumber)))
diff --git a/kcc/image.py b/kcc/image.py
index 5b54bbd..c13da29 100755
--- a/kcc/image.py
+++ b/kcc/image.py
@@ -16,11 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+__version__ = '4.1'
__license__ = 'ISC'
__copyright__ = '2012-2014, Ciro Mattia Gonano , Pawel Jastrzebski '
__docformat__ = 'restructuredtext en'
import os
+from io import BytesIO
+from urllib.request import Request, urlopen
from functools import reduce
from PIL import Image, ImageOps, ImageStat, ImageChops
from .shared import md5Checksum
@@ -472,14 +475,37 @@ class ComicPage:
class Cover:
- def __init__(self, source, target):
+ def __init__(self, source, target, opt, tomeNumber):
+ self.options = opt
self.source = source
self.target = target
- self.image = Image.open(source)
+ if tomeNumber == 0:
+ self.tomeNumber = 1
+ else:
+ self.tomeNumber = tomeNumber
+ if self.tomeNumber in self.options.remoteCovers:
+ try:
+ source = urlopen(Request(self.options.remoteCovers[self.tomeNumber],
+ headers={'User-Agent': 'KindleComicConverter/' + __version__})).read()
+ self.image = Image.open(BytesIO(source))
+ self.processExternal()
+ except Exception:
+ self.image = Image.open(source)
+ self.processInternal()
+ else:
+ self.image = Image.open(source)
+ self.processInternal()
+
+ def processInternal(self):
self.image = self.image.convert('RGB')
- self.process()
+ self.image = self.trim()
self.save()
+ def processExternal(self):
+ self.image = self.image.convert('RGB')
+ self.image.thumbnail(self.options.profileData[1], Image.ANTIALIAS)
+ self.save(True)
+
def trim(self):
bg = Image.new(self.image.mode, self.image.size, self.image.getpixel((0, 0)))
diff = ImageChops.difference(self.image, bg)
@@ -490,12 +516,13 @@ class Cover:
else:
return self.image
- def process(self):
- self.image = self.trim()
-
- def save(self):
+ def save(self, external=False):
+ if external:
+ source = self.options.remoteCovers[self.tomeNumber].split('/')[-1]
+ else:
+ source = self.source
try:
- if os.path.splitext(self.source)[1].lower() == '.png':
+ if os.path.splitext(source)[1].lower() == '.png':
self.image.save(self.target, "PNG", optimize=1)
else:
self.image.save(self.target, "JPEG", optimize=1)