Adding from ISBN: Show a progress dialog for record creation as well as metadata download. Fixes #9005 (Calibre unresponsive for several minutes when adding many books from ISBN)

This commit is contained in:
Kovid Goyal 2011-02-16 19:11:56 -07:00
parent aefa407f66
commit fdf2dc8dce

View File

@ -8,18 +8,20 @@ __docformat__ = 'restructuredtext en'
import os import os
from functools import partial from functools import partial
from PyQt4.Qt import QPixmap, QMenu from PyQt4.Qt import QPixmap, QMenu, QTimer
from calibre.gui2 import error_dialog, choose_files, \ from calibre.gui2 import error_dialog, choose_files, \
choose_dir, warning_dialog, info_dialog choose_dir, warning_dialog, info_dialog
from calibre.gui2.dialogs.add_empty_book import AddEmptyBookDialog from calibre.gui2.dialogs.add_empty_book import AddEmptyBookDialog
from calibre.gui2.dialogs.progress import ProgressDialog
from calibre.gui2.widgets import IMAGE_EXTENSIONS from calibre.gui2.widgets import IMAGE_EXTENSIONS
from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks import BOOK_EXTENSIONS
from calibre.utils.filenames import ascii_filename from calibre.utils.filenames import ascii_filename
from calibre.constants import preferred_encoding, filesystem_encoding from calibre.constants import preferred_encoding, filesystem_encoding
from calibre.gui2.actions import InterfaceAction from calibre.gui2.actions import InterfaceAction
from calibre.gui2 import config from calibre.gui2 import config
from calibre.ebooks.metadata import MetaInformation
class AddAction(InterfaceAction): class AddAction(InterfaceAction):
@ -95,7 +97,6 @@ class AddAction(InterfaceAction):
dlg = AddEmptyBookDialog(self.gui, self.gui.library_view.model().db, author) dlg = AddEmptyBookDialog(self.gui, self.gui.library_view.model().db, author)
if dlg.exec_() == dlg.Accepted: if dlg.exec_() == dlg.Accepted:
num = dlg.qty_to_add num = dlg.qty_to_add
from calibre.ebooks.metadata import MetaInformation
for x in xrange(num): for x in xrange(num):
mi = MetaInformation(_('Unknown'), dlg.selected_authors) mi = MetaInformation(_('Unknown'), dlg.selected_authors)
self.gui.library_view.model().db.import_book(mi, []) self.gui.library_view.model().db.import_book(mi, [])
@ -105,27 +106,45 @@ class AddAction(InterfaceAction):
self.gui.tags_view.recount() self.gui.tags_view.recount()
def add_isbns(self, books, add_tags=[]): def add_isbns(self, books, add_tags=[]):
from calibre.ebooks.metadata import MetaInformation self.isbn_books = list(books)
ids = set([]) self.add_by_isbn_ids = set()
db = self.gui.library_view.model().db self.isbn_add_tags = add_tags
QTimer.singleShot(10, self.do_one_isbn_add)
self.isbn_add_dialog = ProgressDialog(_('Adding'),
_('Creating book records from ISBNs'), max=len(books),
cancelable=False, parent=self.gui)
self.isbn_add_dialog.exec_()
def do_one_isbn_add(self):
try:
db = self.gui.library_view.model().db
try:
x = self.isbn_books.pop(0)
except IndexError:
self.gui.library_view.model().books_added(self.isbn_add_dialog.value)
self.isbn_add_dialog.accept()
orig = config['overwrite_author_title_metadata']
config['overwrite_author_title_metadata'] = True
try:
self.gui.iactions['Edit Metadata'].do_download_metadata(
self.add_by_isbn_ids)
finally:
config['overwrite_author_title_metadata'] = orig
return
for x in books:
mi = MetaInformation(None) mi = MetaInformation(None)
mi.isbn = x['isbn'] mi.isbn = x['isbn']
if x['path'] is not None: if self.isbn_add_tags:
ids.add(db.import_book(mi, [x['path']])) mi.tags = list(self.isbn_add_tags)
else: fmts = [] if x['path'] is None else [x['path']]
ids.add(db.import_book(mi, [])) self.add_by_isbn_ids.add(db.import_book(mi, fmts))
self.gui.library_view.model().books_added(len(books)) self.isbn_add_dialog.value += 1
orig = config['overwrite_author_title_metadata'] QTimer.singleShot(10, self.do_one_isbn_add)
config['overwrite_author_title_metadata'] = True except:
try: self.isbn_add_dialog.accept()
self.gui.iactions['Edit Metadata'].do_download_metadata(ids) raise
finally:
config['overwrite_author_title_metadata'] = orig
if add_tags and ids:
db.bulk_modify_tags(ids, add=add_tags)
def files_dropped(self, paths): def files_dropped(self, paths):
to_device = self.gui.stack.currentIndex() != 0 to_device = self.gui.stack.currentIndex() != 0