From aca962fd37e0e7cceaa2b6261826afa3318c7a37 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 3 Jul 2009 11:54:56 -0600 Subject: [PATCH] Set pubdate when setting metadata in MOBI files (needed for periodical indexing) --- src/calibre/ebooks/metadata/mobi.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/mobi.py b/src/calibre/ebooks/metadata/mobi.py index f49a57a7c6..535dddf2a7 100644 --- a/src/calibre/ebooks/metadata/mobi.py +++ b/src/calibre/ebooks/metadata/mobi.py @@ -11,11 +11,14 @@ __docformat__ = 'restructuredtext en' from struct import pack, unpack from cStringIO import StringIO +from datetime import datetime + from calibre.ebooks.mobi import MobiError from calibre.ebooks.mobi.writer import rescale_image, MAX_THUMB_DIMEN from calibre.ebooks.mobi.langcodes import iana2mobi class StreamSlicer(object): + def __init__(self, stream, start=0, stop=None): self._stream = stream self.start = start @@ -84,17 +87,22 @@ class MetadataUpdater(object): flags, = unpack('>I', record0[128:132]) have_exth = self.have_exth = (flags & 0x40) != 0 self.cover_record = self.thumbnail_record = None + self.timestamp = None if not have_exth: return exth_off = unpack('>I', record0[20:24])[0] + 16 + record0.start exth = self.exth = StreamSlicer(stream, exth_off, record0.stop) nitems, = unpack('>I', exth[8:12]) pos = 12 + # Store any EXTH fields not specifiable in GUI for i in xrange(nitems): id, size = unpack('>II', exth[pos:pos + 8]) content = exth[pos + 8: pos + size] pos += size - if id == 201: + + if id == 106: + self.timestamp = content + elif id == 201: rindex, = self.cover_rindex, = unpack('>I', content) self.cover_record = self.record(rindex + image_base) elif id == 202: @@ -134,6 +142,16 @@ class MetadataUpdater(object): if mi.tags: subjects = '; '.join(mi.tags) recs.append((105, subjects.encode(self.codec, 'replace'))) + + if mi.pubdate: + recs.append((106, str(mi.pubdate).encode(self.codec, 'replace'))) + elif mi.timestamp: + recs.append((106, str(mi.timestamp).encode(self.codec, 'replace'))) + elif self.timestamp: + recs.append(106, self.timestamp) + else: + recs.append((106, str(datetime.now()).encode(self.codec, 'replace'))) + if self.cover_record is not None: recs.append((201, pack('>I', self.cover_rindex))) recs.append((203, pack('>I', 0)))