mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Refactor the downloading social metadata message box to allow canceling. Fixes #8234 (Calibre crashes while editing metadata)
This commit is contained in:
parent
ab0bde42fa
commit
4e9070019a
@ -790,7 +790,13 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
if d.opt_get_social_metadata.isChecked():
|
if d.opt_get_social_metadata.isChecked():
|
||||||
d2 = SocialMetadata(book, self)
|
d2 = SocialMetadata(book, self)
|
||||||
d2.exec_()
|
d2.exec_()
|
||||||
if d2.exceptions:
|
if d2.timed_out:
|
||||||
|
warning_dialog(self, _('Timed out'),
|
||||||
|
_('The download of social'
|
||||||
|
' metadata timed out, the servers are'
|
||||||
|
' probably busy. Try again later.'),
|
||||||
|
show=True)
|
||||||
|
elif d2.exceptions:
|
||||||
det = '\n'.join([x[0]+'\n\n'+x[-1]+'\n\n\n' for
|
det = '\n'.join([x[0]+'\n\n'+x[-1]+'\n\n\n' for
|
||||||
x in d2.exceptions])
|
x in d2.exceptions])
|
||||||
warning_dialog(self, _('There were errors'),
|
warning_dialog(self, _('There were errors'),
|
||||||
|
@ -6,16 +6,19 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
|
import time
|
||||||
|
from threading import Thread
|
||||||
|
|
||||||
from PyQt4.Qt import QDialog, QDialogButtonBox, Qt, QLabel, QVBoxLayout, \
|
from PyQt4.Qt import QDialog, QDialogButtonBox, Qt, QLabel, QVBoxLayout, \
|
||||||
SIGNAL, QThread
|
QTimer
|
||||||
|
|
||||||
from calibre.ebooks.metadata import MetaInformation
|
from calibre.ebooks.metadata import MetaInformation
|
||||||
|
|
||||||
class Worker(QThread):
|
class Worker(Thread):
|
||||||
|
|
||||||
def __init__(self, mi, parent):
|
def __init__(self, mi):
|
||||||
QThread.__init__(self, parent)
|
Thread.__init__(self)
|
||||||
|
self.daemon = True
|
||||||
self.mi = MetaInformation(mi)
|
self.mi = MetaInformation(mi)
|
||||||
self.exceptions = []
|
self.exceptions = []
|
||||||
|
|
||||||
@ -25,10 +28,12 @@ class Worker(QThread):
|
|||||||
|
|
||||||
class SocialMetadata(QDialog):
|
class SocialMetadata(QDialog):
|
||||||
|
|
||||||
|
TIMEOUT = 300 # seconds
|
||||||
|
|
||||||
def __init__(self, mi, parent):
|
def __init__(self, mi, parent):
|
||||||
QDialog.__init__(self, parent)
|
QDialog.__init__(self, parent)
|
||||||
|
|
||||||
self.bbox = QDialogButtonBox(QDialogButtonBox.Ok, Qt.Horizontal, self)
|
self.bbox = QDialogButtonBox(QDialogButtonBox.Cancel, Qt.Horizontal, self)
|
||||||
self.mi = mi
|
self.mi = mi
|
||||||
self.layout = QVBoxLayout(self)
|
self.layout = QVBoxLayout(self)
|
||||||
self.label = QLabel(_('Downloading social metadata, please wait...'), self)
|
self.label = QLabel(_('Downloading social metadata, please wait...'), self)
|
||||||
@ -36,15 +41,29 @@ class SocialMetadata(QDialog):
|
|||||||
self.layout.addWidget(self.label)
|
self.layout.addWidget(self.label)
|
||||||
self.layout.addWidget(self.bbox)
|
self.layout.addWidget(self.bbox)
|
||||||
|
|
||||||
self.worker = Worker(mi, self)
|
self.worker = Worker(mi)
|
||||||
self.connect(self.worker, SIGNAL('finished()'), self.accept)
|
self.bbox.rejected.connect(self.reject)
|
||||||
self.connect(self.bbox, SIGNAL('rejected()'), self.reject)
|
|
||||||
self.worker.start()
|
self.worker.start()
|
||||||
|
self.start_time = time.time()
|
||||||
|
self.timed_out = False
|
||||||
|
self.rejected = False
|
||||||
|
QTimer.singleShot(50, self.update)
|
||||||
|
|
||||||
def reject(self):
|
def reject(self):
|
||||||
self.disconnect(self.worker, SIGNAL('finished()'), self.accept)
|
self.rejected = True
|
||||||
QDialog.reject(self)
|
QDialog.reject(self)
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
if self.rejected:
|
||||||
|
return
|
||||||
|
if time.time() - self.start_time > self.TIMEOUT:
|
||||||
|
self.timed_out = True
|
||||||
|
self.reject()
|
||||||
|
return
|
||||||
|
if not self.worker.is_alive():
|
||||||
|
self.accept()
|
||||||
|
QTimer.singleShot(50, self.update)
|
||||||
|
|
||||||
def accept(self):
|
def accept(self):
|
||||||
self.mi.tags = self.worker.mi.tags
|
self.mi.tags = self.worker.mi.tags
|
||||||
self.mi.rating = self.worker.mi.rating
|
self.mi.rating = self.worker.mi.rating
|
||||||
|
Loading…
x
Reference in New Issue
Block a user