diff options
author | Paweł Jastrzębski <pawelj@vulturis.eu> | 2014-06-21 18:39:18 +0200 |
---|---|---|
committer | Paweł Jastrzębski <pawelj@iosphe.re> | 2014-07-03 18:16:56 +0200 |
commit | 623f615dd929d01e6dee2d6a8afaf206f0b8bb32 (patch) | |
tree | f50e7130a0be29681d7b12553c41de4d74118bbf | |
parent | Made KindleGen detection more foolproof (diff) | |
download | kcc-623f615dd929d01e6dee2d6a8afaf206f0b8bb32.tar.gz kcc-623f615dd929d01e6dee2d6a8afaf206f0b8bb32.tar.bz2 kcc-623f615dd929d01e6dee2d6a8afaf206f0b8bb32.zip |
Added Manga Cover Database support
-rwxr-xr-x | kcc/comic2ebook.py | 29 | ||||
-rwxr-xr-x | kcc/image.py | 43 |
2 files changed, 60 insertions, 12 deletions
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 <http://www.gnu.org/licenses/>. +__version__ = '4.1' __license__ = 'ISC' __copyright__ = '2012-2014, Ciro Mattia Gonano <ciromattia@gmail.com>, Pawel Jastrzebski <pawelj@iosphe.re>' __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) |