diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index 700a072c5b..f871bc20e7 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -85,7 +85,7 @@ class USBMS(CLI, Device): elif on_card == 'cardb' and not self._card_b_prefix: raise ValueError(_('The reader has no storage card in this slot.')) elif on_card and on_card not in ('carda', 'cardb'): - raise DeviceError(_('The reader has no storage card in this slot.')) + raise DeviceError(_('Selected slot: %s is not supported.' % on_card)) if on_card == 'carda': path = os.path.join(self._card_a_prefix, self.EBOOK_DIR_CARD_A) diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index 5b058870bb..288fa01c73 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -29,6 +29,8 @@ from calibre.ebooks.oeb.base import prefixname from calibre.ebooks.oeb.base import urlnormalize from calibre.ebooks.compression.palmdoc import compress_doc +INDEXING = True + # TODO: # - Optionally rasterize tables @@ -99,8 +101,7 @@ def decint(value, direction): def align_block(raw, multiple=4, pad='\0'): - l = len(raw) - extra = l % multiple + extra = len(raw) % multiple if extra == 0: return raw return raw + pad*(multiple - extra) @@ -355,7 +356,7 @@ class MobiWriter(object): def _generate_content(self): self._map_image_names() self._generate_text() - if not self.opts.no_mobi_index: + if INDEXING and not self.opts.no_mobi_index: self._generate_index() self._generate_images() @@ -406,6 +407,7 @@ class MobiWriter(object): self._content_length = len(text) self._text_length = len(text) text = StringIO(text) + buf = [] nrecords = 0 offset = 0 if self._compression != UNCOMPRESSED: @@ -435,9 +437,13 @@ class MobiWriter(object): lsize += 1 record.write(size) self._records.append(record.getvalue()) + buf.append(self._records[-1]) nrecords += 1 offset += RECORD_SIZE data, overlap = self._read_text_record(text) + extra = len(''.join(buf))%4 + if extra > 0 and INDEXING: + self._records[-1] += '\0'*(4-extra) self._text_nrecords = nrecords def _generate_indxt(self, ctoc): @@ -448,7 +454,7 @@ class MobiWriter(object): indices.write('IDXT') c = 0 - last_index = last_name = None + last_name = None def add_node(node, offset, length, count): if self.opts.verbose > 2: @@ -487,20 +493,19 @@ class MobiWriter(object): length = self._content_length - offset add_node(child, offset, length, c) - last_index = c ctoc_offset = self._ctoc_map[child] last_name = "%4d"%c c += 1 return align_block(indxt.getvalue()), c, \ - align_block(indices.getvalue()), last_index, last_name + align_block(indices.getvalue()), last_name def _generate_index(self): self._oeb.log('Generating index...') self._primary_index_record = None ctoc = self._generate_ctoc() - indxt, indxt_count, indices, last_index, last_name = \ + indxt, indxt_count, indices, last_name = \ self._generate_indxt(ctoc) indx1 = StringIO() @@ -529,7 +534,7 @@ class MobiWriter(object): indx1.write(indices) indx1 = indx1.getvalue() - idxt0 = chr(len(last_name)) + last_name + pack('>H', last_index) + idxt0 = chr(len(last_name)) + last_name + pack('>H', indxt_count) idxt0 = align_block(idxt0) indx0 = StringIO() @@ -666,7 +671,8 @@ class MobiWriter(object): metadata = self._oeb.metadata exth = self._build_exth() last_content_record = len(self._records) - 1 - self._generate_end_records() + if INDEXING: + self._generate_end_records() record0 = StringIO() # The PalmDOC Header record0.write(pack('>HHIHHHH', self._compression, 0, @@ -827,6 +833,10 @@ class MobiWriter(object): if index is not None: exth.write(pack('>III', 0xca, 0x0c, index - 1)) nrecs += 1 + if INDEXING: + # Write unknown EXTH records as 0s + for code, size in [(204,4), (205,4), (206,4), (207,4), (300,40)]: + exth.write(pack('>I', code)+'\0'*size) exth = exth.getvalue() trail = len(exth) % 4 pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte @@ -849,7 +859,7 @@ class MobiWriter(object): def _write_header(self): title = str(self._oeb.metadata.title[0]) - title = re.sub('[^-A-Za-z0-9]+', '_', title)[:32] + title = re.sub('[^-A-Za-z0-9]+', '_', title)[:31] title = title + ('\0' * (32 - len(title))) now = int(time.time()) nrecords = len(self._records) @@ -866,4 +876,3 @@ class MobiWriter(object): self._write(record) - diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index f7c00fc0c4..0a77839ce1 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -785,7 +785,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): def _add_books(self, paths, to_device, on_card=None): if on_card is None: - on_card = self.stack.currentIndex() >= 2 + on_card = 'carda' if self.stack.currentIndex() == 2 else 'cardb' if self.stack.currentIndex() == 3 else None if not paths: return from calibre.gui2.add import Adder @@ -795,7 +795,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): Dispatcher(self.__adder_func)) self._adder.add(paths) - def _files_added(self, paths=[], names=[], infos=[], on_card=False): + def _files_added(self, paths=[], names=[], infos=[], on_card=None): if paths: self.upload_books(paths, list(map(sanitize_file_name, names)),