mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
MOBI Input: Warn about corrupted trailing data entries, instead of aborting. Getting some, even partially corrupted text is better than no text. See #1521830 (Calibre will not open or convert good mobi file)
This commit is contained in:
parent
1915bb64cd
commit
3df3d5423a
@ -38,6 +38,7 @@ class MobiReader(object):
|
|||||||
self.log = log
|
self.log = log
|
||||||
self.debug = debug
|
self.debug = debug
|
||||||
self.embedded_mi = None
|
self.embedded_mi = None
|
||||||
|
self.warned_about_trailing_entry_corruption = False
|
||||||
self.base_css_rules = textwrap.dedent('''
|
self.base_css_rules = textwrap.dedent('''
|
||||||
body { text-align: justify }
|
body { text-align: justify }
|
||||||
|
|
||||||
@ -740,12 +741,21 @@ class MobiReader(object):
|
|||||||
flags = self.book_header.extra_flags >> 1
|
flags = self.book_header.extra_flags >> 1
|
||||||
while flags:
|
while flags:
|
||||||
if flags & 1:
|
if flags & 1:
|
||||||
num += sizeof_trailing_entry(data, size - num)
|
try:
|
||||||
|
num += sizeof_trailing_entry(data, size - num)
|
||||||
|
except IndexError:
|
||||||
|
self.warn_about_trailing_entry_corruption()
|
||||||
|
return 0
|
||||||
flags >>= 1
|
flags >>= 1
|
||||||
if self.book_header.extra_flags & 1:
|
if self.book_header.extra_flags & 1:
|
||||||
num += (ord(data[size - num - 1]) & 0x3) + 1
|
num += (ord(data[size - num - 1]) & 0x3) + 1
|
||||||
return num
|
return num
|
||||||
|
|
||||||
|
def warn_about_trailing_entry_corruption(self):
|
||||||
|
if not self.warned_about_trailing_entry_corruption:
|
||||||
|
self.warned_about_trailing_entry_corruption = True
|
||||||
|
self.log.warn('The trailing data entries in this MOBI file are corrupted, you might see corrupted text in the output')
|
||||||
|
|
||||||
def text_section(self, index):
|
def text_section(self, index):
|
||||||
data = self.sections[index][0]
|
data = self.sections[index][0]
|
||||||
trail_size = self.sizeof_trailing_entries(data)
|
trail_size = self.sizeof_trailing_entries(data)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user