From f0006a7db7d1c1941173ad8e8b728b101d2a6f9d Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 23 Feb 2012 20:32:24 -0600 Subject: [PATCH] Moving image resize code up to when img is collected rather than written. --- fanficdownloader/adapters/base_adapter.py | 2 +- fanficdownloader/story.py | 24 +++++++++++++++++++++-- fanficdownloader/writers/writer_epub.py | 11 ++++++----- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/fanficdownloader/adapters/base_adapter.py b/fanficdownloader/adapters/base_adapter.py index 4fcc1e2..aeec423 100644 --- a/fanficdownloader/adapters/base_adapter.py +++ b/fanficdownloader/adapters/base_adapter.py @@ -261,7 +261,7 @@ class BaseSiteAdapter(Configurable): if self.getConfig('include_images'): acceptable_attributes.extend(('src','alt')) for img in soup.findAll('img'): - img['src']=self.story.addImgUrl(url,img['src'],self._fetchUrlRaw) + img['src']=self.story.addImgUrl(self,url,img['src'],self._fetchUrlRaw) for attr in soup._getAttrMap().keys(): if attr not in acceptable_attributes: diff --git a/fanficdownloader/story.py b/fanficdownloader/story.py index 5d711df..9384a42 100644 --- a/fanficdownloader/story.py +++ b/fanficdownloader/story.py @@ -21,6 +21,22 @@ from base64 import b64encode from htmlcleanup import conditionalRemoveEntities, removeAllEntities +# Create convert_image method depending on which graphics lib we can +# load. Preferred: calibre, PIL, none +try: + from calibre.utils.magick.draw import minify_image + + def convert_image(data,sizes,grayscale): + img = minify_image(data, minify_to=sizes) + if grayscale: + img.type = "GrayscaleType" + return img.export('JPG') +except: + # Problem: writer_epub assumes image is jpg. + def convert_image(data,sizes,grayscale): + return data + + # The list comes from ffnet, the only multi-language site we support # at the time of writing. Values are taken largely from pycountry, # but with some corrections and guesses. @@ -160,7 +176,7 @@ class Story: # pass fetch in from adapter in case we need the cookies collected # as well as it's a base_story class method. - def addImgUrl(self,parenturl,url,fetch): + def addImgUrl(self,configurable,parenturl,url,fetch): if url.startswith("http") : imgurl = url elif parenturl != None: @@ -188,7 +204,11 @@ class Story: parsedUrl = urlparse.urlparse(imgurl) # newsrc = "images/%s.jpg"%( # self.imgurls.index(imgurl)) - data = fetch(imgurl) + sizes = [ int(x) for x in configurable.getConfigList('image_max_size') ] + data = convert_image(fetch(imgurl), + sizes, + configurable.getConfig('grayscale_images')) + print("\nimgurl\nimage size:%d\n"%len(data)) self.imgurldata.append((newsrc,data)) # else: # newsrc = "images/%s.jpg"%( diff --git a/fanficdownloader/writers/writer_epub.py b/fanficdownloader/writers/writer_epub.py index 95f4a39..eabd8b1 100644 --- a/fanficdownloader/writers/writer_epub.py +++ b/fanficdownloader/writers/writer_epub.py @@ -278,16 +278,17 @@ ${value}
itemrefs.append("file%04d"%i) if self.getConfig('include_images'): - from calibre.utils.magick.draw import minify_image + #from calibre.utils.magick.draw import minify_image imgcount=0 sizes = [ int(x) for x in self.getConfigList('image_max_size') ] for (newsrc,data) in self.story.getImgUrls(): imgfile = "OEBPS/"+newsrc - saveimg = minify_image(data, minify_to=sizes) - if self.getConfig('grayscale_images'): - saveimg.type = "GrayscaleType" - outputepub.writestr(imgfile,saveimg.export('JPG')) + # saveimg = minify_image(data, minify_to=sizes) + # if self.getConfig('grayscale_images'): + # saveimg.type = "GrayscaleType" + # outputepub.writestr(imgfile,saveimg.export('JPG')) + outputepub.writestr(imgfile,data) items.append(("image%04d"%imgcount, imgfile, "image/jpeg",