74
74
raise TypeError("stream indices must be integers")
77
class MetadataUpdater(object):
77
class MetadataUpdater(object):
78
78
def __init__(self, stream):
79
79
self.stream = stream
80
80
data = self.data = StreamSlicer(stream)
86
86
image_base, = unpack('>I', record0[108:112])
87
87
flags, = unpack('>I', record0[128:132])
88
88
have_exth = self.have_exth = (flags & 0x40) != 0
89
self.cover_record = self.thumbnail_record = None
91
self.cover_record = self.thumbnail_record = None
92
92
exth_off = unpack('>I', record0[20:24])[0] + 16 + record0.start
93
93
exth = self.exth = StreamSlicer(stream, exth_off, record0.stop)
94
94
nitems, = unpack('>I', exth[8:12])
143
143
exth = ['EXTH', pack('>II', len(exth) + 12, len(recs)), exth, pad]
144
144
exth = ''.join(exth)
145
145
title = (mi.title or _('Unknown')).encode(self.codec, 'replace')
146
if getattr(self, 'exth', None) is None:
147
raise MobiError('No existing EXTH record. Cannot update metadata.')
146
148
title_off = (self.exth.start - self.record0.start) + len(exth)
147
149
title_len = len(title)
148
150
trail = len(self.exth) - len(exth) - len(title)
151
153
self.exth[:] = ''.join([exth, title, '\0' * trail])
152
154
self.record0[84:92] = pack('>II', title_off, title_len)
153
155
self.record0[92:96] = iana2mobi(mi.language)
155
data = mi.cover_data[1]
156
if self.cover_record is not None:
157
size = len(self.cover_record)
158
cover = rescale_image(data, size)
159
cover += '\0' * (size - len(cover))
160
self.cover_record[:] = cover
161
if self.thumbnail_record is not None:
162
size = len(self.thumbnail_record)
163
thumbnail = rescale_image(data, size, dimen=MAX_THUMB_DIMEN)
164
thumbnail += '\0' * (size - len(thumbnail))
165
self.thumbnail_record[:] = thumbnail
156
if mi.cover_data[1] or mi.cover:
158
data = mi.cover_data[1] if mi.cover_data[1] else open(mi.cover, 'rb').read()
162
if self.cover_record is not None:
163
size = len(self.cover_record)
164
cover = rescale_image(data, size)
165
cover += '\0' * (size - len(cover))
166
self.cover_record[:] = cover
167
if self.thumbnail_record is not None:
168
size = len(self.thumbnail_record)
169
thumbnail = rescale_image(data, size, dimen=MAX_THUMB_DIMEN)
170
thumbnail += '\0' * (size - len(thumbnail))
171
self.thumbnail_record[:] = thumbnail
168
174
def set_metadata(stream, mi):