Fix bug #3073: Gracefully ignore invalid images. Fix bug #3071: Set metadata for FB2 output.

This commit is contained in:
John Schember 2009-08-04 19:08:53 -04:00
parent bd61339034
commit aebc9bd8bc
4 changed files with 58 additions and 31 deletions

View File

@ -17,7 +17,7 @@ from calibre import prepare_string_for_xml
from calibre.constants import __appname__, __version__
from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace
from calibre.ebooks.oeb.stylizer import Stylizer
from calibre.ebooks.oeb.base import OEB_IMAGES
from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES
TAG_MAP = {
'b' : 'strong',
@ -60,12 +60,32 @@ class FB2MLizer(object):
return u'<?xml version="1.0" encoding="UTF-8"?>\n%s' % etree.tostring(etree.fromstring(output), encoding=unicode, pretty_print=True)
def fb2_header(self):
author_first = u''
author_middle = u''
author_last = u''
author_parts = self.oeb_book.metadata.creator[0].value.split(' ')
if len(author_parts) == 1:
author_last = author_parts[0]
elif len(author_parts == 2):
author_first = author_parts[0]
author_last = author_parts[1]
else:
author_first = author_parts[0]
author_middle = ' '.join(author_parts[1:-2])
author_last = author_parts[-1]
return u'<FictionBook xmlns:xlink="http://www.w3.org/1999/xlink" ' \
'xmlns="http://www.gribuser.ru/xml/fictionbook/2.0">\n' \
'<description>\n<title-info><book-title>%s</book-title> ' \
'<description>\n<title-info>\n ' \
'<author>\n<first-name>%s</first-name>\n<middle-name>%s' \
'</middle-name>\n<last-name>%s</last-name>\n</author>\n' \
'<book-title>%s</book-title> ' \
'</title-info><document-info> ' \
'<program-used>%s - %s</program-used></document-info>\n' \
'</description>\n<body>\n<section>' % (self.oeb_book.metadata.title[0].value, __appname__, __version__)
'</description>\n<body>\n<section>' % (author_first, author_middle,
author_last, self.oeb_book.metadata.title[0].value,
__appname__, __version__)
def fb2_body_footer(self):
return u'\n</section>\n</body>'
@ -76,7 +96,7 @@ class FB2MLizer(object):
def fb2mlize_images(self):
images = u''
for item in self.oeb_book.manifest:
if item.media_type in OEB_IMAGES:
if item.media_type in OEB_RASTER_IMAGES:
raw_data = b64encode(item.data)
# Don't put the encoded image on a single line.
data = ''

View File

@ -20,7 +20,7 @@ except ImportError:
import cStringIO
from calibre.ebooks.pdb.formatwriter import FormatWriter
from calibre.ebooks.oeb.base import OEB_IMAGES
from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES
from calibre.ebooks.pdb.header import PdbHeaderBuilder
from calibre.ebooks.pdb.ereader import image_name
from calibre.ebooks.pml.pmlml import PMLMLizer
@ -72,21 +72,24 @@ class Writer(FormatWriter):
images = []
for item in manifest:
if item.media_type in OEB_IMAGES:
header = 'PNG '
if item.media_type in OEB_RASTER_IMAGES:
try:
im = Image.open(cStringIO.StringIO(item.data)).convert('P')
im.thumbnail((300,300), Image.ANTIALIAS)
header += image_name(item.href)
header = header.ljust(62, '\x00')
data = cStringIO.StringIO()
im.save(data, 'PNG')
data = data.getvalue()
im = Image.open(cStringIO.StringIO(item.data)).convert('P')
im.thumbnail((300,300), Image.ANTIALIAS)
header = 'PNG '
header += image_name(item.href)
header = header.ljust(62, '\x00')
data = cStringIO.StringIO()
im.save(data, 'PNG')
data = data.getvalue()
if len(data) + len(header) < 65505:
images.append((header, data))
if len(data) + len(header) < 65505:
images.append((header, data))
except Exception as e:
self.log.error('Error: Could not include file %s becuase ' \
'%s.' % (item.href, e))
return images

View File

@ -19,7 +19,7 @@ import cStringIO
from calibre.ebooks.rb.rbml import RBMLizer
from calibre.ebooks.rb import HEADER
from calibre.ebooks.rb import unique_name
from calibre.ebooks.oeb.base import OEB_IMAGES
from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES
from calibre.constants import __appname__, __version__
TEXT_RECORD_SIZE = 4096
@ -116,20 +116,24 @@ class RBWriter(object):
used_names = []
for item in manifest:
if item.media_type in OEB_IMAGES:
data = ''
if item.media_type in OEB_RASTER_IMAGES:
try:
data = ''
im = Image.open(cStringIO.StringIO(item.data)).convert('L')
data = cStringIO.StringIO()
im.save(data, 'PNG')
data = data.getvalue()
im = Image.open(cStringIO.StringIO(item.data)).convert('L')
data = cStringIO.StringIO()
im.save(data, 'PNG')
data = data.getvalue()
name = '%s.png' % os.path.splitext(os.path.basename(item.href))[0]
name = unique_name(name, used_names)
used_names.append(name)
self.name_map[os.path.basename(item.href)] = name
name = '%s.png' % os.path.splitext(os.path.basename(item.href))[0]
name = unique_name(name, used_names)
used_names.append(name)
self.name_map[os.path.basename(item.href)] = name
images.append((name, data))
images.append((name, data))
except Exception as e:
self.log.error('Error: Could not include file %s becuase ' \
'%s.' % (item.href, e))
return images

View File

@ -20,7 +20,7 @@ except ImportError:
import cStringIO
from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace, \
OEB_IMAGES
OEB_RASTER_IMAGES
from calibre.ebooks.oeb.stylizer import Stylizer
from calibre.ebooks.metadata import authors_to_string
@ -115,7 +115,7 @@ class RTFMLizer(object):
def insert_images(self, text):
for item in self.oeb_book.manifest:
if item.media_type in OEB_IMAGES:
if item.media_type in OEB_RASTER_IMAGES:
src = os.path.basename(item.href)
data, width, height = self.image_to_hexstring(item.data)
text = text.replace('SPECIAL_IMAGE-%s-REPLACE_ME' % src, '\n\n{\\*\\shppict{\\pict\\picw%i\\pich%i\\jpegblip \n%s\n}}\n\n' % (width, height, data))