From 5091859c49e9d24cffdb19acd1a665a50e88dee8 Mon Sep 17 00:00:00 2001 From: GRiker Date: Fri, 26 Mar 2010 04:44:52 -0700 Subject: [PATCH 1/2] GwR improved diagnostics for metadata, cover failures --- src/calibre/ebooks/metadata/topaz.py | 8 ++++---- src/calibre/ebooks/mobi/reader.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/metadata/topaz.py b/src/calibre/ebooks/metadata/topaz.py index df25172531..233ce78f25 100644 --- a/src/calibre/ebooks/metadata/topaz.py +++ b/src/calibre/ebooks/metadata/topaz.py @@ -4,7 +4,7 @@ __copyright__ = '2010, Greg Riker ' __docformat__ = 'restructuredtext en' ''' Read/write metadata from Amazon's topaz format ''' -import StringIO, sys +import os, StringIO, sys from struct import pack from calibre.ebooks.metadata import MetaInformation @@ -83,7 +83,7 @@ class MetadataUpdater(object): sig = self.data[:4] if not sig.startswith('TPZ'): - raise ValueError('Not a Topaz file') + raise ValueError("'%s': unexpected Topaz signature '%s'" % (os.path.basename(stream.name),self.data[:4])) offset = 4 self.header_records, consumed = self.decode_vwi(self.data[offset:offset+4]) @@ -92,13 +92,13 @@ class MetadataUpdater(object): # First integrity test - metadata header if not 'metadata' in self.topaz_headers: - raise ValueError('Invalid Topaz format - no metadata record') + raise ValueError("'%s': Topaz metadata record missing" % os.path.basename(stream.name)) # Second integrity test - metadata body md_offset = self.topaz_headers['metadata']['blocks'][0]['offset'] md_offset += self.base if self.data[md_offset+1:md_offset+9] != 'metadata': - raise ValueError('Damaged metadata record') + raise ValueError("'%s': damaged Topaz metadata record" % os.path.basename(stream.name)) def book_length(self): ''' convenience method for retrieving book length ''' diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index c4829ec22f..ac98660e09 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -833,7 +833,7 @@ def get_metadata(stream): try: im = PILImage.open(buf) except: - log.exception('Failed to read MOBI cover') + log.exception("Failed to read MOBI cover: '%s'" % os.path.basename(stream.name)) else: obuf = cStringIO.StringIO() im.convert('RGB').save(obuf, format='JPEG') From 9c38a1b5b84afce49c1950cf366e5398530f30de Mon Sep 17 00:00:00 2001 From: GRiker Date: Fri, 26 Mar 2010 13:07:09 -0700 Subject: [PATCH 2/2] GwR fixes for tickets 2279, 4652, 5162 --- src/calibre/ebooks/metadata/mobi.py | 13 ++++++++++++- src/calibre/ebooks/oeb/reader.py | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/metadata/mobi.py b/src/calibre/ebooks/metadata/mobi.py index fd1a1c3947..7581b560cd 100644 --- a/src/calibre/ebooks/metadata/mobi.py +++ b/src/calibre/ebooks/metadata/mobi.py @@ -331,7 +331,7 @@ class MetadataUpdater(object): authors = mi.author_sort update_exth_record((100, authors.encode(self.codec, 'replace'))) elif mi.authors: - authors = '; '.join(mi.authors) + authors = ';'.join(mi.authors) update_exth_record((100, authors.encode(self.codec, 'replace'))) if mi.publisher: update_exth_record((101, mi.publisher.encode(self.codec, 'replace'))) @@ -349,6 +349,17 @@ class MetadataUpdater(object): if mi.tags: subjects = '; '.join(mi.tags) update_exth_record((105, subjects.encode(self.codec, 'replace'))) + + # >>> Begin patch for ticket #4652 <<< + kindle_doc_types = set([u'[kindle_ebok]',u'[kindle_pdoc]']) + doc_type = list(kindle_doc_types.intersection(set(mi.tags)))[0] + if doc_type: + if doc_type == '[kindle_ebok]': + update_exth_record((501,str('EBOK'))) + elif doc_type == '[kindle_pdoc]': + update_exth_record((501, str('PDOC'))) + # >>> End patch + if mi.pubdate: update_exth_record((106, str(mi.pubdate).encode(self.codec, 'replace'))) elif mi.timestamp: diff --git a/src/calibre/ebooks/oeb/reader.py b/src/calibre/ebooks/oeb/reader.py index 9043db97f1..e829891a45 100644 --- a/src/calibre/ebooks/oeb/reader.py +++ b/src/calibre/ebooks/oeb/reader.py @@ -359,7 +359,7 @@ class OEBReader(object): self._toc_from_navpoint(item, node, child) def _toc_from_ncx(self, item): - if item is None: + if (item is None) or (item.data is None): return False self.log.debug('Reading TOC from NCX...') ncx = item.data