about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaweł Jastrzębski <pawelj@vulturis.eu>2014-06-21 18:39:18 +0200
committerPaweł Jastrzębski <pawelj@iosphe.re>2014-07-03 18:16:56 +0200
commit623f615dd929d01e6dee2d6a8afaf206f0b8bb32 (patch)
treef50e7130a0be29681d7b12553c41de4d74118bbf
parentMade KindleGen detection more foolproof (diff)
downloadkcc-623f615dd929d01e6dee2d6a8afaf206f0b8bb32.tar.gz
kcc-623f615dd929d01e6dee2d6a8afaf206f0b8bb32.tar.bz2
kcc-623f615dd929d01e6dee2d6a8afaf206f0b8bb32.zip
Added Manga Cover Database support
-rwxr-xr-xkcc/comic2ebook.py29
-rwxr-xr-xkcc/image.py43
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)