diff --git a/src/calibre/ebooks/mobi/debug.py b/src/calibre/ebooks/mobi/debug.py index ca1da86ac2..f15c78736e 100644 --- a/src/calibre/ebooks/mobi/debug.py +++ b/src/calibre/ebooks/mobi/debug.py @@ -1421,7 +1421,7 @@ class MOBIFile(object): # {{{ except: pass if fmt is not None: - self.image_records.append(ImageRecord(i, r, fmt)) + self.image_records.append(ImageRecord(len(self.image_records)+1, r, fmt)) else: self.binary_records.append(BinaryRecord(i, r)) diff --git a/src/calibre/ebooks/mobi/utils.py b/src/calibre/ebooks/mobi/utils.py index e16871fec4..5e31cf0301 100644 --- a/src/calibre/ebooks/mobi/utils.py +++ b/src/calibre/ebooks/mobi/utils.py @@ -314,6 +314,8 @@ def detect_periodical(toc, log=None): Detect if the TOC object toc contains a periodical that conforms to the structure required by kindlegen to generate a periodical. ''' + if toc.count() < 1 or not toc[0].klass == 'periodical': + return False for node in toc.iterdescendants(): if node.depth() == 1 and node.klass != 'article': if log is not None: diff --git a/src/calibre/ebooks/mobi/writer2/main.py b/src/calibre/ebooks/mobi/writer2/main.py index 00a333ce9d..c1fafc3f8b 100644 --- a/src/calibre/ebooks/mobi/writer2/main.py +++ b/src/calibre/ebooks/mobi/writer2/main.py @@ -97,6 +97,9 @@ class MobiWriter(object): # Indexing {{{ def generate_index(self): self.primary_index_record_idx = None + if self.oeb.toc.count() < 1: + self.log.warn('No TOC, MOBI index not generated') + return try: self.indexer = Indexer(self.serializer, self.last_text_record_idx, len(self.records[self.last_text_record_idx]), @@ -147,15 +150,19 @@ class MobiWriter(object): oeb.logger.info('Serializing images...') self.image_records = [] self.image_map = {} + self.masthead_offset = 0 + index = 1 - mh_href = self.masthead_offset = None + mh_href = None if 'masthead' in oeb.guide: mh_href = oeb.guide['masthead'].href + self.image_records.append(None) + index += 1 elif self.is_periodical: # Generate a default masthead - data = generate_masthead(unicode(self.oeb.metadata('title')[0])) + data = generate_masthead(unicode(self.oeb.metadata['title'][0])) self.image_records.append(data) - self.masthead_offset = 0 + index += 1 cover_href = self.cover_offset = self.thumbnail_offset = None if (oeb.metadata.cover and @@ -172,13 +179,16 @@ class MobiWriter(object): oeb.logger.warn('Bad image file %r' % item.href) continue else: - self.image_map[item.href] = len(self.image_records) - self.image_records.append(data) + if mh_href and item.href == mh_href: + self.image_records[0] = data + continue - if item.href == mh_href: - self.masthead_offset = len(self.image_records) - 1 - elif item.href == cover_href: - self.cover_offset = len(self.image_records) - 1 + self.image_records.append(data) + self.image_map[item.href] = index + index += 1 + + if cover_href and item.href == cover_href: + self.cover_offset = self.image_map[item.href] - 1 try: data = rescale_image(item.data, dimen=MAX_THUMB_DIMEN, maxsizeb=MAX_THUMB_SIZE) @@ -186,10 +196,14 @@ class MobiWriter(object): oeb.logger.warn('Failed to generate thumbnail') else: self.image_records.append(data) - self.thumbnail_offset = len(self.image_records) - 1 + self.thumbnail_offset = index - 1 + index += 1 finally: item.unload_data_from_memory() + if self.image_records[0] is None: + raise ValueError('Failed to find masthead image in manifest') + # }}} # Text {{{ diff --git a/src/calibre/ebooks/mobi/writer2/serializer.py b/src/calibre/ebooks/mobi/writer2/serializer.py index fe5dee3258..377b29655c 100644 --- a/src/calibre/ebooks/mobi/writer2/serializer.py +++ b/src/calibre/ebooks/mobi/writer2/serializer.py @@ -37,6 +37,7 @@ class Serializer(object): is written after every element of the spine in ``oeb``. ''' self.oeb = oeb + # Map of image hrefs to image index in the MOBI file self.images = images self.logger = oeb.logger self.is_periodical = is_periodical