From 77361444108f2e7ab3825ece60df4cd522d8d393 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 15 Apr 2011 15:31:55 -0600 Subject: [PATCH] MOBI Output: Ensure that MOBI files always have 8KB worth of null bytes at the end of record 0. This appears to be necessary for Amazon to be able to add DRM to calibre generated MOBI files sent to their publishing service. --- src/calibre/ebooks/metadata/mobi.py | 1 + src/calibre/ebooks/mobi/debug.py | 5 ++++- src/calibre/ebooks/mobi/writer.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/metadata/mobi.py b/src/calibre/ebooks/metadata/mobi.py index ffdef77d11..15fdceff15 100644 --- a/src/calibre/ebooks/metadata/mobi.py +++ b/src/calibre/ebooks/metadata/mobi.py @@ -259,6 +259,7 @@ class MetadataUpdater(object): trail = len(new_record0.getvalue()) % 4 pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte new_record0.write(pad) + new_record0.write('\0'*(1024*8)) # Rebuild the stream, update the pdbrecords pointers self.patchSection(0,new_record0.getvalue()) diff --git a/src/calibre/ebooks/mobi/debug.py b/src/calibre/ebooks/mobi/debug.py index 36aba39d65..86ed3e9ef9 100644 --- a/src/calibre/ebooks/mobi/debug.py +++ b/src/calibre/ebooks/mobi/debug.py @@ -274,7 +274,7 @@ class MOBIHeader(object): self.exth = EXTHHeader(self.raw[self.exth_offset:]) self.end_of_exth = self.exth_offset + self.exth.length - self.bytes_after_exth = len(self.raw) - self.end_of_exth + self.bytes_after_exth = self.fullname_offset - self.end_of_exth def __str__(self): ans = ['*'*20 + ' MOBI Header '+ '*'*20] @@ -321,6 +321,9 @@ class MOBIHeader(object): ans += '\n\n' + str(self.exth) ans += '\n\nBytes after EXTH: %d'%self.bytes_after_exth + ans += '\nNumber of bytes after full name: %d' % (len(self.raw) - (self.fullname_offset + + self.fullname_length)) + ans += '\nRecord 0 length: %d'%len(self.raw) return ans diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index fc47b26c02..ddcba63eca 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -1511,7 +1511,7 @@ class MobiWriter(object): record0.write(exth) record0.write(title) record0 = record0.getvalue() - self._records[0] = record0 + ('\0' * (2452 - len(record0))) + self._records[0] = record0 + ('\0' * (1024*8)) def _build_exth(self): oeb = self._oeb