diff --git a/src/calibre/ebooks/htmlz/input.py b/src/calibre/ebooks/htmlz/input.py
index dcf2ed0ed3..d083fcc4ab 100644
--- a/src/calibre/ebooks/htmlz/input.py
+++ b/src/calibre/ebooks/htmlz/input.py
@@ -7,10 +7,12 @@ __copyright__ = '2011, John Schember '
__docformat__ = 'restructuredtext en'
import os
+import posixpath
-from calibre import walk
+from calibre import guess_type, walk
from calibre.customize.conversion import InputFormatPlugin
from calibre.ebooks.chardet import xml_to_unicode
+from calibre.ebooks.metadata.opf2 import OPF
from calibre.utils.zipfile import ZipFile
class HTMLZInput(InputFormatPlugin):
@@ -27,7 +29,7 @@ class HTMLZInput(InputFormatPlugin):
# Extract content from zip archive.
zf = ZipFile(stream)
- zf.extractall('.')
+ zf.extractall()
for x in walk('.'):
if os.path.splitext(x)[1].lower() in ('.html', '.xhtml', '.htm'):
@@ -70,5 +72,24 @@ class HTMLZInput(InputFormatPlugin):
from calibre.ebooks.oeb.transforms.metadata import meta_info_to_oeb_metadata
mi = get_file_type_metadata(stream, file_ext)
meta_info_to_oeb_metadata(mi, oeb.metadata, log)
+
+ # Get the cover path from the OPF.
+ cover_href = None
+ opf = None
+ for x in walk('.'):
+ if os.path.splitext(x)[1].lower() in ('.opf'):
+ opf = x
+ break
+ if opf:
+ opf = OPF(opf)
+ cover_href = posixpath.relpath(opf.cover, os.path.dirname(stream.name))
+ # Set the cover.
+ if cover_href:
+ cdata = None
+ with open(cover_href, 'rb') as cf:
+ cdata = cf.read()
+ id, href = oeb.manifest.generate('cover', cover_href)
+ oeb.manifest.add(id, href, guess_type(cover_href)[0], data=cdata)
+ oeb.guide.add('cover', 'Cover', href)
return oeb
diff --git a/src/calibre/ebooks/htmlz/output.py b/src/calibre/ebooks/htmlz/output.py
index 6d2ad54a12..a1ef57af2c 100644
--- a/src/calibre/ebooks/htmlz/output.py
+++ b/src/calibre/ebooks/htmlz/output.py
@@ -7,11 +7,13 @@ __copyright__ = '2011, John Schember '
__docformat__ = 'restructuredtext en'
import os
+from cStringIO import StringIO
from lxml import etree
from calibre.customize.conversion import OutputFormatPlugin, \
OptionRecommendation
+from calibre.ebooks.metadata.opf2 import OPF, metadata_to_opf
from calibre.ptempfile import TemporaryDirectory
from calibre.utils.zipfile import ZipFile
@@ -79,10 +81,31 @@ class HTMLZOutput(OutputFormatPlugin):
fname = os.path.join(tdir, 'images', images[item.href])
with open(fname, 'wb') as img:
img.write(data)
+
+ # Cover
+ cover_path = None
+ try:
+ cover_data = None
+ if oeb_book.metadata.cover:
+ term = oeb_book.metadata.cover[0].term
+ cover_data = oeb_book.guide[term].item.data
+ if cover_data:
+ from calibre.utils.magick.draw import save_cover_data_to
+ cover_path = os.path.join(tdir, 'cover.jpg')
+ with open(cover_path, 'w') as cf:
+ cf.write('')
+ save_cover_data_to(cover_data, cover_path)
+ except:
+ import traceback
+ traceback.print_exc()
# Metadata
with open(os.path.join(tdir, 'metadata.opf'), 'wb') as mdataf:
- mdataf.write(etree.tostring(oeb_book.metadata.to_opf1()))
+ opf = OPF(StringIO(etree.tostring(oeb_book.metadata.to_opf1())))
+ mi = opf.to_book_metadata()
+ if cover_path:
+ mi.cover = 'cover.jpg'
+ mdataf.write(metadata_to_opf(mi))
htmlz = ZipFile(output_path, 'w')
htmlz.add_dir(tdir)
diff --git a/src/calibre/ebooks/metadata/extz.py b/src/calibre/ebooks/metadata/extz.py
index 18069b2a6a..21c10278e1 100644
--- a/src/calibre/ebooks/metadata/extz.py
+++ b/src/calibre/ebooks/metadata/extz.py
@@ -13,7 +13,7 @@ import posixpath
from cStringIO import StringIO
from calibre.ebooks.metadata import MetaInformation
-from calibre.ebooks.metadata.opf2 import OPF
+from calibre.ebooks.metadata.opf2 import OPF, metadata_to_opf
from calibre.ptempfile import PersistentTemporaryFile
from calibre.utils.zipfile import ZipFile, safe_replace
@@ -31,9 +31,9 @@ def get_metadata(stream, extract_cover=True):
opf = OPF(opf_stream)
mi = opf.to_book_metadata()
if extract_cover:
- cover_name = opf.raster_cover
- if cover_name:
- mi.cover_data = ('jpg', zf.read(cover_name))
+ cover_href = posixpath.relpath(opf.cover, os.path.dirname(stream.name))
+ if cover_href:
+ mi.cover_data = ('jpg', zf.read(cover_href))
except:
return mi
return mi
@@ -59,17 +59,19 @@ def set_metadata(stream, mi):
except:
pass
if new_cdata:
- raster_cover = opf.raster_cover
- if not raster_cover:
- raster_cover = 'cover.jpg'
- cpath = posixpath.join(posixpath.dirname(opf_path), raster_cover)
+ cover = opf.cover
+ if not cover:
+ cover = 'cover.jpg'
+ cpath = posixpath.join(posixpath.dirname(opf_path), cover)
new_cover = _write_new_cover(new_cdata, cpath)
replacements[cpath] = open(new_cover.name, 'rb')
+ mi.cover = cover
# Update the metadata.
- opf.smart_update(mi, replace_metadata=True)
- newopf = StringIO(opf.render())
- safe_replace(stream, opf_path, newopf, extra_replacements=replacements)
+ old_mi = opf.to_book_metadata()
+ old_mi.smart_update(mi)
+ newopf = StringIO(metadata_to_opf(old_mi))
+ safe_replace(stream, opf_path, newopf, extra_replacements=replacements, add_missing=True)
# Cleanup temporary files.
try:
diff --git a/src/calibre/ebooks/oeb/transforms/metadata.py b/src/calibre/ebooks/oeb/transforms/metadata.py
index 19c209b74d..f719ee3eb5 100644
--- a/src/calibre/ebooks/oeb/transforms/metadata.py
+++ b/src/calibre/ebooks/oeb/transforms/metadata.py
@@ -36,7 +36,7 @@ def meta_info_to_oeb_metadata(mi, m, log, override_input_metadata=False):
m.clear('description')
m.add('description', mi.comments)
elif override_input_metadata:
- m.clear('description')
+ m.clear('description')
if not mi.is_null('publisher'):
m.clear('publisher')
m.add('publisher', mi.publisher)