def add(self, id, opf, cover, name): formats = self.ids.pop(id) if opf.endswith(".error"): mi = MetaInformation("", [_("Unknown")]) self.critical[name] = open(opf, "rb").read().decode("utf-8", "replace") else: try: mi = OPF(opf).to_book_metadata() except: import traceback mi = MetaInformation("", [_("Unknown")]) self.critical[name] = traceback.format_exc() formats = self.process_formats(opf, formats) if not mi.title: mi.title = os.path.splitext(name)[0] mi.title = mi.title if isinstance(mi.title, unicode) else mi.title.decode(preferred_encoding, "replace") if mi.application_id == "__calibre_dummy__": mi.application_id = None if self.db is not None: if cover: with open(cover, "rb") as f: cover = f.read() orig_formats = formats formats = [f2 for f2 in formats if not f2.lower().endswith(".opf")] if prefs["add_formats_to_existing"]: # automerge is on identical_book_list = self.db.find_identical_books(mi) if identical_book_list: # books with same author and nearly same title exist in db self.merged_books.add((mi.title, " & ".join(mi.authors))) seen_fmts = set([]) for identical_book in identical_book_list: ib_fmts = self.db.formats(identical_book, index_is_id=True) if ib_fmts: seen_fmts |= set(ib_fmts.split(",")) replace = gprefs["automerge"] == "overwrite" self.add_formats(identical_book, formats, replace=replace) if gprefs["automerge"] == "new record": incoming_fmts = set([os.path.splitext(path)[-1].replace(".", "").upper() for path in formats]) if incoming_fmts.intersection(seen_fmts): # There was at least one duplicate format # so create a new record and put the # incoming formats into it # We should arguably put only the duplicate # formats, but no real harm is done by having # all formats id_ = self.db.create_book_entry(mi, cover=cover, add_duplicates=True) self.number_of_books_added += 1 self.add_formats(id_, formats) else: # books with same author and nearly same title do not exist in db id_ = self.db.create_book_entry(mi, cover=cover, add_duplicates=True) self.number_of_books_added += 1 self.add_formats(id_, formats) else: # automerge is off id_ = self.db.create_book_entry(mi, cover=cover, add_duplicates=False) if id_ is None: self.duplicates.append((mi, cover, orig_formats)) else: self.add_formats(id_, formats) self.auto_convert_books.add(id_) self.number_of_books_added += 1 else: self.names.append(name) self.paths.append(formats[0]) self.infos.append(mi) return mi.title
def add(self, id, opf, cover, name): formats = self.ids.pop(id) if opf.endswith('.error'): mi = MetaInformation('', [_('Unknown')]) self.critical[name] = open(opf, 'rb').read().decode('utf-8', 'replace') else: try: mi = OPF(opf).to_book_metadata() except: import traceback mi = MetaInformation('', [_('Unknown')]) self.critical[name] = traceback.format_exc() formats = self.process_formats(opf, formats) if not mi.title: mi.title = os.path.splitext(name)[0] mi.title = mi.title if isinstance(mi.title, unicode) else \ mi.title.decode(preferred_encoding, 'replace') if mi.application_id == '__calibre_dummy__': mi.application_id = None if self.db is not None: if cover: with open(cover, 'rb') as f: cover = f.read() orig_formats = formats formats = [f for f in formats if not f.lower().endswith('.opf')] if prefs['add_formats_to_existing']: #automerge is on identical_book_list = self.db.find_identical_books(mi) if identical_book_list: # books with same author and nearly same title exist in db self.merged_books.add(mi.title) seen_fmts = set([]) for identical_book in identical_book_list: ib_fmts = self.db.formats(identical_book, index_is_id=True) if ib_fmts: seen_fmts |= set(ib_fmts.split(',')) replace = gprefs['automerge'] == 'overwrite' self.add_formats(identical_book, formats, replace=replace) if gprefs['automerge'] == 'new record': incoming_fmts = \ set([os.path.splitext(path)[-1].replace('.', '').upper() for path in formats]) if incoming_fmts.intersection(seen_fmts): # There was at least one duplicate format # so create a new record and put the # incoming formats into it # We should arguably put only the duplicate # formats, but no real harm is done by having # all formats id_ = self.db.create_book_entry( mi, cover=cover, add_duplicates=True) self.number_of_books_added += 1 self.add_formats(id_, formats) else: # books with same author and nearly same title do not exist in db id_ = self.db.create_book_entry(mi, cover=cover, add_duplicates=True) self.number_of_books_added += 1 self.add_formats(id_, formats) else: #automerge is off id_ = self.db.create_book_entry(mi, cover=cover, add_duplicates=False) if id_ is None: self.duplicates.append((mi, cover, orig_formats)) else: self.add_formats(id_, formats) self.number_of_books_added += 1 else: self.names.append(name) self.paths.append(formats[0]) self.infos.append(mi) return mi.title