From b86e9f0f27b5e98b5a00104a4d3545502fc38ed3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 7 Jul 2019 18:14:13 +0530 Subject: [PATCH] py3: Various MOBI fixes found while reviewing the previous py3 merge --- src/calibre/ebooks/mobi/debug/headers.py | 5 +++++ src/calibre/ebooks/mobi/debug/mobi6.py | 25 +++++++++++++---------- src/calibre/ebooks/mobi/debug/mobi8.py | 15 +++++++------- src/calibre/ebooks/mobi/reader/headers.py | 14 ++++++------- src/calibre/ebooks/mobi/reader/index.py | 3 +++ src/calibre/ebooks/mobi/reader/mobi6.py | 2 +- src/calibre/ebooks/mobi/utils.py | 4 ++-- src/polyglot/builtins.py | 16 +++++++++++++++ 8 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/calibre/ebooks/mobi/debug/headers.py b/src/calibre/ebooks/mobi/debug/headers.py index b931b4b1da..308d7c262b 100644 --- a/src/calibre/ebooks/mobi/debug/headers.py +++ b/src/calibre/ebooks/mobi/debug/headers.py @@ -28,6 +28,7 @@ class PalmDOCAttributes(object): def __str__(self): return '%s: %s'%(self.name, bool(self.val)) + __unicode__ = __str__ def __init__(self, raw): self.val = struct.unpack(b'L', content) @@ -302,14 +302,14 @@ class MetadataHeader(BookHeader): try: if self.section_data(kf8_header_index-1) == b'BOUNDARY': return 'joint' - except: + except Exception: pass return None def identity(self): self.stream.seek(60) ident = self.stream.read(8).upper() - if ident not in [b'BOOKMOBI', b'TEXTREAD']: + if ident not in (b'BOOKMOBI', b'TEXTREAD'): raise MobiError('Unknown book type: %s' % ident) return ident diff --git a/src/calibre/ebooks/mobi/reader/index.py b/src/calibre/ebooks/mobi/reader/index.py index 15d406de99..78c5c9acfc 100644 --- a/src/calibre/ebooks/mobi/reader/index.py +++ b/src/calibre/ebooks/mobi/reader/index.py @@ -123,6 +123,9 @@ class CNCX(object): # {{{ def iteritems(self): return iteritems(self.records) + + def items(self): + return iteritems(self.records) # }}} diff --git a/src/calibre/ebooks/mobi/reader/mobi6.py b/src/calibre/ebooks/mobi/reader/mobi6.py index abc648f806..a5357c842c 100644 --- a/src/calibre/ebooks/mobi/reader/mobi6.py +++ b/src/calibre/ebooks/mobi/reader/mobi6.py @@ -89,7 +89,7 @@ class MobiReader(object): self.num_sections, = struct.unpack('>H', raw[76:78]) self.ident = self.header[0x3C:0x3C + 8].upper() - if self.ident not in [b'BOOKMOBI', b'TEXTREAD']: + if self.ident not in (b'BOOKMOBI', b'TEXTREAD'): raise MobiError('Unknown book type: %s' % repr(self.ident)) self.sections = [] diff --git a/src/calibre/ebooks/mobi/utils.py b/src/calibre/ebooks/mobi/utils.py index baf51e01d4..faf7e5a6b5 100644 --- a/src/calibre/ebooks/mobi/utils.py +++ b/src/calibre/ebooks/mobi/utils.py @@ -223,7 +223,7 @@ def get_trailing_data(record, extra_data_flags): if extra_data_flags & 0b1: # Only the first two bits are used for the size since there can # never be more than 3 trailing multibyte chars - sz = (ord(record[-1]) & 0b11) + 1 + sz = (ord(record[-1:]) & 0b11) + 1 consumed = 1 if sz > consumed: data[0] = record[-sz:-consumed] @@ -298,7 +298,7 @@ def decode_tbs(byts, flag_size=4): extra[0b0010] = x consumed += consumed2 if flags & 0b0100: - extra[0b0100] = ord(byts[0]) + extra[0b0100] = ord(byts[0:1]) byts = byts[1:] consumed += 1 if flags & 0b0001: diff --git a/src/polyglot/builtins.py b/src/polyglot/builtins.py index f68602640e..bf036ff459 100644 --- a/src/polyglot/builtins.py +++ b/src/polyglot/builtins.py @@ -182,3 +182,19 @@ else: def reload(module): return builtins.reload(module) + + +def print_to_binary_file(fileobj, encoding='utf-8'): + + def print(*a, **kw): + f = kw.get('file', fileobj) + if a: + sep = as_bytes(kw.get('sep', ' '), encoding) + for x in a: + x = as_bytes(x, encoding) + f.write(x) + if x is not a[-1]: + f.write(sep) + f.write(as_bytes(kw.get('end', '\n'))) + + return print