News download: Rationalize cover processing. Fixes #6852 (ebook-convert ieeespectrum.recipe .mobi crashes)

This commit is contained in:
Kovid Goyal 2010-09-21 16:45:42 -06:00
parent 8c74a347d7
commit 0e8017ade6
2 changed files with 28 additions and 30 deletions

View File

@ -60,15 +60,15 @@ def identify(path):
data = open(path, 'rb').read() data = open(path, 'rb').read()
return identify_data(data) return identify_data(data)
def add_borders_to_image(path_to_image, left=0, top=0, right=0, bottom=0, def add_borders_to_image(img_data, left=0, top=0, right=0, bottom=0,
border_color='#ffffff'): border_color='#ffffff', fmt='jpg'):
img = Image() img = Image()
img.open(path_to_image) img.load(img_data)
lwidth, lheight = img.size lwidth, lheight = img.size
canvas = create_canvas(lwidth+left+right, lheight+top+bottom, canvas = create_canvas(lwidth+left+right, lheight+top+bottom,
border_color) border_color)
canvas.compose(img, left, top) canvas.compose(img, left, top)
canvas.save(path_to_image) return canvas.export(fmt)
def create_text_wand(font_size, font_path=None): def create_text_wand(font_size, font_path=None):
if font_path is None: if font_path is None:

View File

@ -7,7 +7,7 @@ Defines various abstract base classes that can be subclassed to create powerful
__docformat__ = "restructuredtext en" __docformat__ = "restructuredtext en"
import os, time, traceback, re, urlparse, sys import os, time, traceback, re, urlparse, sys, cStringIO
from collections import defaultdict from collections import defaultdict
from functools import partial from functools import partial
from contextlib import nested, closing from contextlib import nested, closing
@ -27,6 +27,7 @@ from calibre.web.fetch.simple import RecursiveFetcher
from calibre.utils.threadpool import WorkRequest, ThreadPool, NoResultsPending from calibre.utils.threadpool import WorkRequest, ThreadPool, NoResultsPending
from calibre.ptempfile import PersistentTemporaryFile from calibre.ptempfile import PersistentTemporaryFile
from calibre.utils.date import now as nowf from calibre.utils.date import now as nowf
from calibre.utils.magick.draw import save_cover_data_to, add_borders_to_image
class LoginFailed(ValueError): class LoginFailed(ValueError):
pass pass
@ -948,38 +949,36 @@ class BasicNewsRecipe(Recipe):
try: try:
cu = self.get_cover_url() cu = self.get_cover_url()
except Exception, err: except Exception, err:
cu = None
self.log.error(_('Could not download cover: %s')%str(err)) self.log.error(_('Could not download cover: %s')%str(err))
self.log.debug(traceback.format_exc()) self.log.debug(traceback.format_exc())
if cu is not None: else:
ext = cu.split('/')[-1].rpartition('.')[-1] cdata = None
if '?' in ext:
ext = ''
ext = ext.lower() if ext and '/' not in ext else 'jpg'
cpath = os.path.join(self.output_dir, 'cover.'+ext)
if os.access(cu, os.R_OK): if os.access(cu, os.R_OK):
with open(cpath, 'wb') as cfile: cdata = open(cu, 'rb').read()
cfile.write(open(cu, 'rb').read())
else: else:
self.report_progress(1, _('Downloading cover from %s')%cu) self.report_progress(1, _('Downloading cover from %s')%cu)
with nested(open(cpath, 'wb'), closing(self.browser.open(cu))) as (cfile, r): with closing(self.browser.open(cu)) as r:
cfile.write(r.read()) cdata = r.read()
if not cdata:
return
ext = cu.split('/')[-1].rpartition('.')[-1].lower().strip()
if ext == 'pdf':
from calibre.ebooks.metadata.pdf import get_metadata
stream = cStringIO.StringIO(cdata)
cdata = None
mi = get_metadata(stream)
if mi.cover_data and mi.cover_data[1]:
cdata = mi.cover_data[1]
if not cdata:
return
if self.cover_margins[0] or self.cover_margins[1]: if self.cover_margins[0] or self.cover_margins[1]:
from calibre.utils.magick.draw import add_borders_to_image cdata = add_borders_to_image(cdata,
add_borders_to_image(cpath,
left=self.cover_margins[0],right=self.cover_margins[0], left=self.cover_margins[0],right=self.cover_margins[0],
top=self.cover_margins[1],bottom=self.cover_margins[1], top=self.cover_margins[1],bottom=self.cover_margins[1],
border_color=self.cover_margins[2]) border_color=self.cover_margins[2])
if ext.lower() == 'pdf':
from calibre.ebooks.metadata.pdf import get_metadata cpath = os.path.join(self.output_dir, 'cover.jpg')
stream = open(cpath, 'rb') save_cover_data_to(cdata, cpath)
mi = get_metadata(stream)
cpath = None
if mi.cover_data and mi.cover_data[1]:
cpath = os.path.join(self.output_dir,
'cover.'+mi.cover_data[0])
with open(cpath, 'wb') as f:
f.write(mi.cover_data[1])
self.cover_path = cpath self.cover_path = cpath
def download_cover(self): def download_cover(self):
@ -1422,7 +1421,6 @@ class CalibrePeriodical(BasicNewsRecipe):
return br return br
def download(self): def download(self):
import cStringIO
self.log('Fetching downloaded recipe') self.log('Fetching downloaded recipe')
try: try:
raw = self.browser.open_novisit( raw = self.browser.open_novisit(