mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
News download: Rationalize cover processing. Fixes #6852 (ebook-convert ieeespectrum.recipe .mobi crashes)
This commit is contained in:
parent
8c74a347d7
commit
0e8017ade6
@ -60,15 +60,15 @@ def identify(path):
|
||||
data = open(path, 'rb').read()
|
||||
return identify_data(data)
|
||||
|
||||
def add_borders_to_image(path_to_image, left=0, top=0, right=0, bottom=0,
|
||||
border_color='#ffffff'):
|
||||
def add_borders_to_image(img_data, left=0, top=0, right=0, bottom=0,
|
||||
border_color='#ffffff', fmt='jpg'):
|
||||
img = Image()
|
||||
img.open(path_to_image)
|
||||
img.load(img_data)
|
||||
lwidth, lheight = img.size
|
||||
canvas = create_canvas(lwidth+left+right, lheight+top+bottom,
|
||||
border_color)
|
||||
canvas.compose(img, left, top)
|
||||
canvas.save(path_to_image)
|
||||
return canvas.export(fmt)
|
||||
|
||||
def create_text_wand(font_size, font_path=None):
|
||||
if font_path is None:
|
||||
|
@ -7,7 +7,7 @@ Defines various abstract base classes that can be subclassed to create powerful
|
||||
__docformat__ = "restructuredtext en"
|
||||
|
||||
|
||||
import os, time, traceback, re, urlparse, sys
|
||||
import os, time, traceback, re, urlparse, sys, cStringIO
|
||||
from collections import defaultdict
|
||||
from functools import partial
|
||||
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.ptempfile import PersistentTemporaryFile
|
||||
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):
|
||||
pass
|
||||
@ -948,38 +949,36 @@ class BasicNewsRecipe(Recipe):
|
||||
try:
|
||||
cu = self.get_cover_url()
|
||||
except Exception, err:
|
||||
cu = None
|
||||
self.log.error(_('Could not download cover: %s')%str(err))
|
||||
self.log.debug(traceback.format_exc())
|
||||
if cu is not None:
|
||||
ext = cu.split('/')[-1].rpartition('.')[-1]
|
||||
if '?' in ext:
|
||||
ext = ''
|
||||
ext = ext.lower() if ext and '/' not in ext else 'jpg'
|
||||
cpath = os.path.join(self.output_dir, 'cover.'+ext)
|
||||
else:
|
||||
cdata = None
|
||||
if os.access(cu, os.R_OK):
|
||||
with open(cpath, 'wb') as cfile:
|
||||
cfile.write(open(cu, 'rb').read())
|
||||
cdata = open(cu, 'rb').read()
|
||||
else:
|
||||
self.report_progress(1, _('Downloading cover from %s')%cu)
|
||||
with nested(open(cpath, 'wb'), closing(self.browser.open(cu))) as (cfile, r):
|
||||
cfile.write(r.read())
|
||||
if self.cover_margins[0] or self.cover_margins[1]:
|
||||
from calibre.utils.magick.draw import add_borders_to_image
|
||||
add_borders_to_image(cpath,
|
||||
left=self.cover_margins[0],right=self.cover_margins[0],
|
||||
top=self.cover_margins[1],bottom=self.cover_margins[1],
|
||||
border_color=self.cover_margins[2])
|
||||
if ext.lower() == 'pdf':
|
||||
with closing(self.browser.open(cu)) as r:
|
||||
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 = open(cpath, 'rb')
|
||||
stream = cStringIO.StringIO(cdata)
|
||||
cdata = None
|
||||
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])
|
||||
cdata = mi.cover_data[1]
|
||||
if not cdata:
|
||||
return
|
||||
if self.cover_margins[0] or self.cover_margins[1]:
|
||||
cdata = add_borders_to_image(cdata,
|
||||
left=self.cover_margins[0],right=self.cover_margins[0],
|
||||
top=self.cover_margins[1],bottom=self.cover_margins[1],
|
||||
border_color=self.cover_margins[2])
|
||||
|
||||
cpath = os.path.join(self.output_dir, 'cover.jpg')
|
||||
save_cover_data_to(cdata, cpath)
|
||||
self.cover_path = cpath
|
||||
|
||||
def download_cover(self):
|
||||
@ -1422,7 +1421,6 @@ class CalibrePeriodical(BasicNewsRecipe):
|
||||
return br
|
||||
|
||||
def download(self):
|
||||
import cStringIO
|
||||
self.log('Fetching downloaded recipe')
|
||||
try:
|
||||
raw = self.browser.open_novisit(
|
||||
|
Loading…
x
Reference in New Issue
Block a user