From 61850df263aa74e53d18cf5142b718a271b25594 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 8 Jul 2009 19:23:16 -0600 Subject: [PATCH] When adding books, if reading metadata raises an exception, make error reporting more robust --- src/calibre/ebooks/metadata/worker.py | 40 ++++++++++++++++----------- src/calibre/gui2/add.py | 7 ++++- src/calibre/gui2/main.py | 7 +++++ 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/calibre/ebooks/metadata/worker.py b/src/calibre/ebooks/metadata/worker.py index 3c5ffd1be2..91577a7035 100644 --- a/src/calibre/ebooks/metadata/worker.py +++ b/src/calibre/ebooks/metadata/worker.py @@ -24,21 +24,26 @@ def read_metadata_(task, tdir, notification=lambda x,y:x): from calibre.ebooks.metadata.meta import metadata_from_formats from calibre.ebooks.metadata.opf2 import OPFCreator for x in task: - id, formats = x - if isinstance(formats, basestring): formats = [formats] - mi = metadata_from_formats(formats) - mi.cover = None - cdata = None - if mi.cover_data: - cdata = mi.cover_data[-1] - mi.cover_data = None - opf = OPFCreator(tdir, mi) - with open(os.path.join(tdir, '%s.opf'%id), 'wb') as f: - opf.render(f) - if cdata: - with open(os.path.join(tdir, str(id)), 'wb') as f: - f.write(cdata) - notification(0.5, id) + try: + id, formats = x + if isinstance(formats, basestring): formats = [formats] + mi = metadata_from_formats(formats) + mi.cover = None + cdata = None + if mi.cover_data: + cdata = mi.cover_data[-1] + mi.cover_data = None + opf = OPFCreator(tdir, mi) + with open(os.path.join(tdir, '%s.opf'%id), 'wb') as f: + opf.render(f) + if cdata: + with open(os.path.join(tdir, str(id)), 'wb') as f: + f.write(cdata) + notification(0.5, id) + except: + import traceback + with open(os.path.join(tdir, '%s.error'%id), 'wb') as f: + f.write(traceback.format_exc()) class Progress(object): @@ -49,7 +54,10 @@ class Progress(object): def __call__(self, id): cover = os.path.join(self.tdir, str(id)) if not os.path.exists(cover): cover = None - self.result_queue.put((id, os.path.join(self.tdir, '%s.opf'%id), cover)) + res = os.path.join(self.tdir, '%s.error'%id) + if not os.path.exists(res): + res = res.replace('.error', '.opf') + self.result_queue.put((id, res, cover)) class ReadMetadata(Thread): diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index b5572e34d6..49aa624e12 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -44,6 +44,7 @@ class Adder(QObject): self.pd = ProgressDialog(_('Adding...'), parent=parent) self.spare_server = spare_server self.db = db + self.critical = {} self.pd.setModal(True) self.pd.show() self._parent = parent @@ -123,8 +124,12 @@ class Adder(QObject): return self.pd.value += 1 formats = self.ids.pop(id) - mi = MetaInformation(OPF(opf)) name = self.nmap.pop(id) + if opf.endswith('.error'): + mi = MetaInformation('', [_('Unknown')]) + self.critical[name] = open(opf, 'rb').read().decode('utf-8', 'replace') + else: + mi = MetaInformation(OPF(opf)) if not mi.title: mi.title = os.path.splitext(name)[0] mi.title = mi.title if isinstance(mi.title, unicode) else \ diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index ff797d8aaa..03d0957b42 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -860,6 +860,13 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): self.library_view.model().books_added(self._adder.number_of_books_added) if hasattr(self, 'db_images'): self.db_images.reset() + if self._adder.critical: + det_msg = [] + for name, log in self._adder.critical.items(): + det_msg.append(name+'\n'+log) + error_dialog(self, _('Failed to read metadata'), + _('Failed to read metadata from the following')+':', + det_msg='\n\n'.join(det_msg), show=True) self._adder = None