diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index dc709f221e..8c515d4c3b 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -22,7 +22,6 @@ from calibre.constants import preferred_encoding, filesystem_encoding from calibre.gui2.actions import InterfaceAction from calibre.gui2 import question_dialog from calibre.ebooks.metadata import MetaInformation -from calibre.ebooks.metadata.sources.base import msprefs def get_filters(): return [ @@ -181,17 +180,9 @@ class AddAction(InterfaceAction): except IndexError: self.gui.library_view.model().books_added(self.isbn_add_dialog.value) self.isbn_add_dialog.accept() - orig = msprefs['ignore_fields'] - new = list(orig) - for x in ('title', 'authors'): - if x in new: - new.remove(x) - msprefs['ignore_fields'] = new - try: - self.gui.iactions['Edit Metadata'].download_metadata( - ids=self.add_by_isbn_ids) - finally: - msprefs['ignore_fields'] = orig + self.gui.iactions['Edit Metadata'].download_metadata( + ids=self.add_by_isbn_ids, ensure_fields=frozenset(['title', + 'authors'])) return diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 28e2f21d23..527beae0ab 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -66,7 +66,7 @@ class EditMetadataAction(InterfaceAction): self.action_merge.setEnabled(enabled) # Download metadata {{{ - def download_metadata(self, ids=None): + def download_metadata(self, ids=None, ensure_fields=None): if ids is None: rows = self.gui.library_view.selectionModel().selectedRows() if not rows or len(rows) == 0: @@ -76,7 +76,8 @@ class EditMetadataAction(InterfaceAction): ids = [db.id(row.row()) for row in rows] from calibre.gui2.metadata.bulk_download import start_download start_download(self.gui, ids, - Dispatcher(self.metadata_downloaded)) + Dispatcher(self.metadata_downloaded), + ensure_fields=ensure_fields) def metadata_downloaded(self, job): if job.failed: diff --git a/src/calibre/gui2/metadata/bulk_download.py b/src/calibre/gui2/metadata/bulk_download.py index ad7018401b..182881f02d 100644 --- a/src/calibre/gui2/metadata/bulk_download.py +++ b/src/calibre/gui2/metadata/bulk_download.py @@ -98,7 +98,7 @@ def split_jobs(ids, batch_size=100): ids = ids[batch_size:] return ans -def start_download(gui, ids, callback): +def start_download(gui, ids, callback, ensure_fields=None): d = ConfirmDialog(ids, gui) ret = d.exec_() d.b.clicked.disconnect() @@ -108,7 +108,8 @@ def start_download(gui, ids, callback): for batch in split_jobs(ids): job = ThreadedJob('metadata bulk download', _('Download metadata for %d books')%len(batch), - download, (batch, gui.current_db, d.identify, d.covers), {}, callback) + download, (batch, gui.current_db, d.identify, d.covers, + ensure_fields), {}, callback) gui.job_manager.run_threaded_job(job) gui.status_bar.show_message(_('Metadata download started'), 3000) @@ -127,10 +128,10 @@ def get_job_details(job): det_msg = '\n'.join(det_msg) return id_map, failed_ids, failed_covers, all_failed, det_msg -def merge_result(oldmi, newmi): +def merge_result(oldmi, newmi, ensure_fields=None): dummy = Metadata(_('Unknown')) for f in msprefs['ignore_fields']: - if ':' not in f: + if ':' not in f and (ensure_fields and f not in ensure_fields): setattr(newmi, f, getattr(dummy, f)) fields = set() for plugin in metadata_plugins(['identify']): @@ -154,7 +155,7 @@ def merge_result(oldmi, newmi): return newmi -def download(ids, db, do_identify, covers, +def download(ids, db, do_identify, covers, ensure_fields, log=None, abort=None, notifications=None): ids = list(ids) metadata = [db.get_metadata(i, index_is_id=True, get_user_categories=False) @@ -184,7 +185,7 @@ def download(ids, db, do_identify, covers, pass if results: all_failed = False - mi = merge_result(mi, results[0]) + mi = merge_result(mi, results[0], ensure_fields=ensure_fields) identifiers = mi.identifiers if not mi.is_null('rating'): # set_metadata expects a rating out of 10 @@ -193,7 +194,7 @@ def download(ids, db, do_identify, covers, log.error('Failed to download metadata for', title) failed_ids.add(i) # We don't want set_metadata operating on anything but covers - mi = merge_result(mi, mi) + mi = merge_result(mi, mi, ensure_fields=ensure_fields) if covers: cdata = download_cover(log, title=title, authors=authors, identifiers=identifiers)