mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add a mechanism to abort conversions and show the user a simple message instead of an error dialog
This commit is contained in:
parent
f0f490971e
commit
b81df9522a
@ -1,4 +1,25 @@
|
|||||||
from __future__ import with_statement
|
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
|
||||||
__license__ = 'GPL 3'
|
from __future__ import (unicode_literals, division, absolute_import,
|
||||||
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
print_function)
|
||||||
|
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
|
|
||||||
|
class ConversionUserFeedBack(Exception):
|
||||||
|
|
||||||
|
def __init__(self, title, msg, level='info', det_msg=''):
|
||||||
|
''' Show a simple message to the user
|
||||||
|
|
||||||
|
:param title: The title (very short description)
|
||||||
|
:param msg: The message to show the user
|
||||||
|
:param level: Must be one of 'info', 'warn' or 'error'
|
||||||
|
:param det_msg: Optional detailed message to show the user
|
||||||
|
'''
|
||||||
|
import json
|
||||||
|
Exception.__init__(self, json.dumps({'msg':msg, 'level':level,
|
||||||
|
'det_msg':det_msg, 'title':title}))
|
||||||
|
self.title, self.msg, self.det_msg = title, msg, det_msg
|
||||||
|
self.level = level
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ from calibre.utils.logging import Log
|
|||||||
from calibre.constants import preferred_encoding
|
from calibre.constants import preferred_encoding
|
||||||
from calibre.customize.conversion import OptionRecommendation
|
from calibre.customize.conversion import OptionRecommendation
|
||||||
from calibre import patheq
|
from calibre import patheq
|
||||||
|
from calibre.ebooks.conversion import ConversionUserFeedBack
|
||||||
|
|
||||||
USAGE = '%prog ' + _('''\
|
USAGE = '%prog ' + _('''\
|
||||||
input_file output_file [options]
|
input_file output_file [options]
|
||||||
@ -320,7 +321,16 @@ def main(args=sys.argv):
|
|||||||
if n.dest]
|
if n.dest]
|
||||||
plumber.merge_ui_recommendations(recommendations)
|
plumber.merge_ui_recommendations(recommendations)
|
||||||
|
|
||||||
plumber.run()
|
try:
|
||||||
|
plumber.run()
|
||||||
|
except ConversionUserFeedBack as e:
|
||||||
|
ll = {'info': log.info, 'warn': log.warn,
|
||||||
|
'error':log.error}.get(e.level, log.info)
|
||||||
|
ll(e.title)
|
||||||
|
if e.det_msg:
|
||||||
|
log.debug(e.detmsg)
|
||||||
|
ll(e.msg)
|
||||||
|
raise SystemExit(1)
|
||||||
|
|
||||||
log(_('Output saved to'), ' ', plumber.output)
|
log(_('Output saved to'), ' ', plumber.output)
|
||||||
|
|
||||||
|
@ -24,9 +24,9 @@ from calibre.utils.config import prefs, dynamic
|
|||||||
from calibre.utils.ipc.server import Server
|
from calibre.utils.ipc.server import Server
|
||||||
from calibre.library.database2 import LibraryDatabase2
|
from calibre.library.database2 import LibraryDatabase2
|
||||||
from calibre.customize.ui import interface_actions, available_store_plugins
|
from calibre.customize.ui import interface_actions, available_store_plugins
|
||||||
from calibre.gui2 import error_dialog, GetMetadata, open_url, \
|
from calibre.gui2 import (error_dialog, GetMetadata, open_url,
|
||||||
gprefs, max_available_height, config, info_dialog, Dispatcher, \
|
gprefs, max_available_height, config, info_dialog, Dispatcher,
|
||||||
question_dialog
|
question_dialog, warning_dialog)
|
||||||
from calibre.gui2.cover_flow import CoverFlowMixin
|
from calibre.gui2.cover_flow import CoverFlowMixin
|
||||||
from calibre.gui2.widgets import ProgressIndicator
|
from calibre.gui2.widgets import ProgressIndicator
|
||||||
from calibre.gui2.update import UpdateMixin
|
from calibre.gui2.update import UpdateMixin
|
||||||
@ -653,6 +653,23 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{
|
|||||||
d.show()
|
d.show()
|
||||||
self._modeless_dialogs.append(d)
|
self._modeless_dialogs.append(d)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if 'calibre.ebooks.conversion.ConversionUserFeedBack:' in job.details:
|
||||||
|
if not minz:
|
||||||
|
import json
|
||||||
|
payload = job.details.rpartition(
|
||||||
|
'calibre.ebooks.conversion.ConversionUserFeedBack:')[-1]
|
||||||
|
payload = json.loads('{' + payload.partition('{')[-1])
|
||||||
|
d = {'info':info_dialog, 'warn':warning_dialog,
|
||||||
|
'error':error_dialog}.get(payload['level'],
|
||||||
|
error_dialog)
|
||||||
|
d = d(self, payload['title'],
|
||||||
|
'<p>%s</p>'%payload['msg'],
|
||||||
|
det_msg=payload['det_msg'])
|
||||||
|
d.setModal(False)
|
||||||
|
d.show()
|
||||||
|
self._modeless_dialogs.append(d)
|
||||||
|
return
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if job.killed:
|
if job.killed:
|
||||||
|
@ -656,9 +656,22 @@ class BasicNewsRecipe(Recipe):
|
|||||||
|
|
||||||
For an example, see the recipe for downloading `The Atlantic`.
|
For an example, see the recipe for downloading `The Atlantic`.
|
||||||
In addition, you can add 'author' for the author of the article.
|
In addition, you can add 'author' for the author of the article.
|
||||||
|
|
||||||
|
If you want to abort processing for some reason and have
|
||||||
|
calibre show the user a simple message instead of an error, call
|
||||||
|
:meth:`abort_recipe_processing`.
|
||||||
'''
|
'''
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def abort_recipe_processing(self, msg):
|
||||||
|
'''
|
||||||
|
Causes the recipe download system to abort the download of this recipe,
|
||||||
|
displaying a simple feedback message to the user.
|
||||||
|
'''
|
||||||
|
from calibre.ebooks.conversion import ConversionUserFeedBack
|
||||||
|
raise ConversionUserFeedBack(_('Failed to download %s')%self.title,
|
||||||
|
msg)
|
||||||
|
|
||||||
def get_obfuscated_article(self, url):
|
def get_obfuscated_article(self, url):
|
||||||
'''
|
'''
|
||||||
If you set `articles_are_obfuscated` this method is called with
|
If you set `articles_are_obfuscated` this method is called with
|
||||||
|
Loading…
x
Reference in New Issue
Block a user