IGN:Clean up conversion queueing code and add feedback while calibre is queueing bulk conversions

This commit is contained in:
Kovid Goyal 2009-09-13 10:27:36 -06:00
parent a1b42542e1
commit b52620748e
3 changed files with 198 additions and 231 deletions

View File

@ -1155,16 +1155,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.library_view.selectionModel().selectedRows()] self.library_view.selectionModel().selectedRows()]
jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format)
if jobs == []: return if jobs == []: return
for func, args, desc, fmt, id, temp_files in jobs: self.queue_convert_jobs(jobs, changed, bad, rows, previous,
if id not in bad: self.book_auto_converted, extra_job_args=[on_card])
job = self.job_manager.run_job(Dispatcher(self.book_auto_converted),
func, args=args, description=desc)
self.conversion_jobs[job] = (temp_files, fmt, id, on_card)
if changed:
self.library_view.model().refresh_rows(rows)
current = self.library_view.currentIndex()
self.library_view.model().current_changed(current, previous)
def auto_convert_mail(self, to, fmts, delete_from_library, book_ids, format): def auto_convert_mail(self, to, fmts, delete_from_library, book_ids, format):
previous = self.library_view.currentIndex() previous = self.library_view.currentIndex()
@ -1172,17 +1164,9 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.library_view.selectionModel().selectedRows()] self.library_view.selectionModel().selectedRows()]
jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format)
if jobs == []: return if jobs == []: return
for func, args, desc, fmt, id, temp_files in jobs: self.queue_convert_jobs(jobs, changed, bad, rows, previous,
if id not in bad: self.book_auto_converted_mail,
job = self.job_manager.run_job(Dispatcher(self.book_auto_converted_mail), extra_job_args=[delete_from_library, to, fmts])
func, args=args, description=desc)
self.conversion_jobs[job] = (temp_files, fmt, id,
delete_from_library, to, fmts)
if changed:
self.library_view.model().refresh_rows(rows)
current = self.library_view.currentIndex()
self.library_view.model().current_changed(current, previous)
def auto_convert_news(self, book_ids, format): def auto_convert_news(self, book_ids, format):
previous = self.library_view.currentIndex() previous = self.library_view.currentIndex()
@ -1190,17 +1174,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.library_view.selectionModel().selectedRows()] self.library_view.selectionModel().selectedRows()]
jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format) jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, book_ids, True, format)
if jobs == []: return if jobs == []: return
for func, args, desc, fmt, id, temp_files in jobs: self.queue_convert_jobs(jobs, changed, bad, rows, previous,
if id not in bad: self.book_auto_converted_news)
job = self.job_manager.run_job(Dispatcher(self.book_auto_converted_news),
func, args=args, description=desc)
self.conversion_jobs[job] = (temp_files, fmt, id)
if changed:
self.library_view.model().refresh_rows(rows)
current = self.library_view.currentIndex()
self.library_view.model().current_changed(current, previous)
def get_books_for_conversion(self): def get_books_for_conversion(self):
rows = [r.row() for r in \ rows = [r.row() for r in \
@ -1219,16 +1194,24 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
rows = [x.row() for x in \ rows = [x.row() for x in \
self.library_view.selectionModel().selectedRows()] self.library_view.selectionModel().selectedRows()]
if bulk or (bulk is None and len(book_ids) > 1): if bulk or (bulk is None and len(book_ids) > 1):
jobs, changed, bad = convert_bulk_ebook(self, self.__bulk_queue = convert_bulk_ebook(self, self.queue_convert_jobs,
self.library_view.model().db, book_ids, out_format=prefs['output_format']) self.library_view.model().db, book_ids,
out_format=prefs['output_format'], args=(rows, previous,
self.book_converted))
else: else:
jobs, changed, bad = convert_single_ebook(self, jobs, changed, bad = convert_single_ebook(self,
self.library_view.model().db, book_ids, out_format=prefs['output_format']) self.library_view.model().db, book_ids, out_format=prefs['output_format'])
self.queue_convert_jobs(jobs, changed, bad, rows, previous,
self.book_converted)
def queue_convert_jobs(self, jobs, changed, bad, rows, previous,
converted_func, extra_job_args=[]):
for func, args, desc, fmt, id, temp_files in jobs: for func, args, desc, fmt, id, temp_files in jobs:
if id not in bad: if id not in bad:
job = self.job_manager.run_job(Dispatcher(self.book_converted), job = self.job_manager.run_job(Dispatcher(converted_func),
func, args=args, description=desc) func, args=args, description=desc)
self.conversion_jobs[job] = (temp_files, fmt, id) args = [temp_files, fmt, id]+extra_job_args
self.conversion_jobs[job] = tuple(args)
if changed: if changed:
self.library_view.model().refresh_rows(rows) self.library_view.model().refresh_rows(rows)
@ -1236,77 +1219,22 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.library_view.model().current_changed(current, previous) self.library_view.model().current_changed(current, previous)
def book_auto_converted(self, job): def book_auto_converted(self, job):
temp_files, fmt, book_id, on_card = self.conversion_jobs.pop(job) temp_files, fmt, book_id, on_card = self.conversion_jobs[job]
try: self.book_converted(job)
if job.failed:
return self.job_exception(job)
data = open(temp_files[-1].name, 'rb')
self.library_view.model().db.add_format(book_id, fmt, data, index_is_id=True)
data.close()
self.status_bar.showMessage(job.description + (' completed'), 2000)
finally:
for f in temp_files:
try:
if os.path.exists(f.name):
os.remove(f.name)
except:
pass
self.tags_view.recount()
if self.current_view() is self.library_view:
current = self.library_view.currentIndex()
self.library_view.model().current_changed(current, QModelIndex())
self.sync_to_device(on_card, False, specific_format=fmt, send_ids=[book_id], do_auto_convert=False) self.sync_to_device(on_card, False, specific_format=fmt, send_ids=[book_id], do_auto_convert=False)
def book_auto_converted_mail(self, job): def book_auto_converted_mail(self, job):
temp_files, fmt, book_id, delete_from_library, to, fmts = self.conversion_jobs.pop(job) temp_files, fmt, book_id, delete_from_library, to, fmts = self.conversion_jobs[job]
try: self.book_converted(job)
if job.failed:
self.job_exception(job)
return
data = open(temp_files[-1].name, 'rb')
self.library_view.model().db.add_format(book_id, fmt, data, index_is_id=True)
data.close()
self.status_bar.showMessage(job.description + (' completed'), 2000)
finally:
for f in temp_files:
try:
if os.path.exists(f.name):
os.remove(f.name)
except:
pass
self.tags_view.recount()
if self.current_view() is self.library_view:
current = self.library_view.currentIndex()
self.library_view.model().current_changed(current, QModelIndex())
self.send_by_mail(to, fmts, delete_from_library, specific_format=fmt, send_ids=[book_id], do_auto_convert=False) self.send_by_mail(to, fmts, delete_from_library, specific_format=fmt, send_ids=[book_id], do_auto_convert=False)
def book_auto_converted_news(self, job): def book_auto_converted_news(self, job):
temp_files, fmt, book_id = self.conversion_jobs.pop(job) temp_files, fmt, book_id = self.conversion_jobs[job]
try: self.book_converted(job)
if job.failed:
return self.job_exception(job)
data = open(temp_files[-1].name, 'rb')
self.library_view.model().db.add_format(book_id, fmt, data, index_is_id=True)
data.close()
self.status_bar.showMessage(job.description + (' completed'), 2000)
finally:
for f in temp_files:
try:
if os.path.exists(f.name):
os.remove(f.name)
except:
pass
self.tags_view.recount()
if self.current_view() is self.library_view:
current = self.library_view.currentIndex()
self.library_view.model().current_changed(current, QModelIndex())
self.sync_news(send_ids=[book_id], do_auto_convert=False) self.sync_news(send_ids=[book_id], do_auto_convert=False)
def book_converted(self, job): def book_converted(self, job):
temp_files, fmt, book_id = self.conversion_jobs.pop(job) temp_files, fmt, book_id = self.conversion_jobs.pop(job)[:3]
try: try:
if job.failed: if job.failed:
self.job_exception(job) self.job_exception(job)

View File

@ -9,7 +9,7 @@ Logic for setting up conversion jobs
import cPickle import cPickle
from PyQt4.Qt import QDialog from PyQt4.Qt import QDialog, QProgressDialog, QString, QTimer, SIGNAL
from calibre.ptempfile import PersistentTemporaryFile from calibre.ptempfile import PersistentTemporaryFile
from calibre.gui2 import warning_dialog, question_dialog from calibre.gui2 import warning_dialog, question_dialog
@ -94,7 +94,7 @@ def convert_single_ebook(parent, db, book_ids, auto_conversion=False, out_format
return jobs, changed, bad return jobs, changed, bad
def convert_bulk_ebook(parent, db, book_ids, out_format=None): def convert_bulk_ebook(parent, queue, db, book_ids, out_format=None, args=[]):
changed = False changed = False
jobs = [] jobs = []
bad = [] bad = []
@ -112,32 +112,55 @@ def convert_bulk_ebook(parent, db, book_ids, out_format=None):
user_recs = cPickle.loads(d.recommendations) user_recs = cPickle.loads(d.recommendations)
book_ids = convert_existing(parent, db, book_ids, output_format) book_ids = convert_existing(parent, db, book_ids, output_format)
for i, book_id in enumerate(book_ids): return QueueBulk(parent, book_ids, output_format, queue, db, user_recs, args)
class QueueBulk(QProgressDialog):
def __init__(self, parent, book_ids, output_format, queue, db, user_recs, args):
QProgressDialog.__init__(self, '',
QString(), 0, len(book_ids), parent)
self.setWindowTitle(_('Queueing books for bulk conversion'))
self.book_ids, self.output_format, self.queue, self.db, self.args, self.user_recs = \
book_ids, output_format, queue, db, args, user_recs
self.parent = parent
self.i, self.bad, self.jobs, self.changed = 0, [], [], False
self.timer = QTimer(self)
self.connect(self.timer, SIGNAL('timeout()'), self.do_book)
self.timer.start()
self.exec_()
def do_book(self):
if self.i >= len(self.book_ids):
self.timer.stop()
return self.do_queue()
book_id = self.book_ids[self.i]
self.i += 1
temp_files = [] temp_files = []
input_format = get_input_format_for_book(db, book_id, None)[0]
try: try:
mi, opf_file = create_opf_file(db, book_id) input_format = get_input_format_for_book(self.db, book_id, None)[0]
in_file = db.format_abspath(book_id, input_format, True) mi, opf_file = create_opf_file(self.db, book_id)
in_file = self.db.format_abspath(book_id, input_format, True)
out_file = PersistentTemporaryFile('.' + output_format) out_file = PersistentTemporaryFile('.' + self.output_format)
out_file.write(output_format) out_file.write(self.output_format)
out_file.close() out_file.close()
temp_files = [] temp_files = []
combined_recs = GuiRecommendations() combined_recs = GuiRecommendations()
default_recs = load_defaults('%s_input' % input_format) default_recs = load_defaults('%s_input' % input_format)
specific_recs = load_specifics(db, book_id) specific_recs = load_specifics(self.db, book_id)
for key in default_recs: for key in default_recs:
combined_recs[key] = default_recs[key] combined_recs[key] = default_recs[key]
for key in specific_recs: for key in specific_recs:
combined_recs[key] = specific_recs[key] combined_recs[key] = specific_recs[key]
for item in user_recs: for item in self.user_recs:
combined_recs[item[0]] = item[1] combined_recs[item[0]] = item[1]
save_specifics(db, book_id, combined_recs) save_specifics(self.db, book_id, combined_recs)
lrecs = list(combined_recs.to_recommendations()) lrecs = list(combined_recs.to_recommendations())
cover_file = create_cover_file(db, book_id) cover_file = create_cover_file(self.db, book_id)
if opf_file is not None: if opf_file is not None:
lrecs.append(('read_metadata_from_opf', opf_file.name, lrecs.append(('read_metadata_from_opf', opf_file.name,
@ -156,30 +179,34 @@ def convert_bulk_ebook(parent, db, book_ids, out_format=None):
dtitle = unicode(mi.title) dtitle = unicode(mi.title)
except: except:
dtitle = repr(mi.title) dtitle = repr(mi.title)
desc = _('Convert book %d of %d (%s)') % (i + 1, total, dtitle) self.setLabelText(_('Queueing ')+dtitle)
desc = _('Convert book %d of %d (%s)') % (self.i, len(self.book_ids), dtitle)
args = [in_file, out_file.name, lrecs] args = [in_file, out_file.name, lrecs]
temp_files.append(out_file) temp_files.append(out_file)
jobs.append(('gui_convert', args, desc, output_format.upper(), book_id, temp_files)) self.jobs.append(('gui_convert', args, desc, self.output_format.upper(), book_id, temp_files))
changed = True self.changed = True
self.setValue(self.i)
except NoSupportedInputFormats: except NoSupportedInputFormats:
bad.append(book_id) self.bad.append(book_id)
if bad != []: def do_queue(self):
self.hide()
if self.bad != []:
res = [] res = []
for id in bad: for id in self.bad:
title = db.title(id, True) title = self.db.title(id, True)
res.append('%s'%title) res.append('%s'%title)
msg = '%s' % '\n'.join(res) msg = '%s' % '\n'.join(res)
warning_dialog(parent, _('Could not convert some books'), warning_dialog(self.parent, _('Could not convert some books'),
_('Could not convert %d of %d books, because no suitable ' _('Could not convert %d of %d books, because no suitable '
'source format was found.') % (len(res), total), 'source format was found.') % (len(res), len(self.book_ids)),
msg).exec_() msg).exec_()
self.parent = None
jobs.reverse() self.jobs.reverse()
return jobs, changed, bad self.queue(self.jobs, self.changed, self.bad, *self.args)
def fetch_scheduled_recipe(recipe, script): def fetch_scheduled_recipe(recipe, script):
from calibre.gui2.dialogs.scheduler import config from calibre.gui2.dialogs.scheduler import config

View File

@ -5,8 +5,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre 0.6.12\n" "Project-Id-Version: calibre 0.6.12\n"
"POT-Creation-Date: 2009-09-11 15:00+MDT\n" "POT-Creation-Date: 2009-09-13 10:26+MDT\n"
"PO-Revision-Date: 2009-09-11 15:00+MDT\n" "PO-Revision-Date: 2009-09-13 10:26+MDT\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n" "Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -29,8 +29,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:403 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:403
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:65 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:65
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:317 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:318
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:320 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:321
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1895 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1895
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1897 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1897
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24
@ -99,9 +99,9 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:111
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:118 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:118
#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:21 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:21
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:99
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:124
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:108 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:126
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:539 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:539
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:548 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:548
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:765 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:765
@ -976,7 +976,7 @@ msgid "Normally this input plugin re-arranges all the input files into a standar
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:266 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:266
msgid "Average line length for line breaking if the HTML is from a previous partial conversion of a PDF file. Default is %default." msgid "Average line length for line breaking if the HTML is from a previous partial conversion of a PDF file. Default is %default which disables this."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47 #: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47
@ -2001,7 +2001,7 @@ msgid "Bulk Convert"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:73
#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:153 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:177
msgid "Options specific to the output format." msgid "Options specific to the output format."
msgstr "" msgstr ""
@ -2339,43 +2339,43 @@ msgstr ""
msgid "&Monospaced font family:" msgid "&Monospaced font family:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:23 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:145
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:169
msgid "Metadata" msgid "Metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:43
msgid "Set the metadata. The output file will contain as much of this metadata as possible." msgid "Set the metadata. The output file will contain as much of this metadata as possible."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:134 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:152
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:95
msgid "Choose cover for " msgid "Choose cover for "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:159
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:102 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:102
msgid "Cannot read" msgid "Cannot read"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:142 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:160
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:103 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:103
msgid "You do not have permission to read the file: " msgid "You do not have permission to read the file: "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:150 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:175
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:111
msgid "Error reading file" msgid "Error reading file"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:169
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:112
msgid "<p>There was an error reading from file: <br /><b>" msgid "<p>There was an error reading from file: <br /><b>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:120
msgid " is not a valid picture" msgid " is not a valid picture"
msgstr "" msgstr ""
@ -2571,7 +2571,7 @@ msgid "RB Output"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:76
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1385 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1313
msgid "Choose the format to view" msgid "Choose the format to view"
msgstr "" msgstr ""
@ -2603,11 +2603,11 @@ msgstr ""
msgid "Regex:" msgid "Regex:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:139 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:163
msgid "Convert" msgid "Convert"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:188
msgid "Options specific to the input format." msgid "Options specific to the input format."
msgstr "" msgstr ""
@ -2860,7 +2860,7 @@ msgid "<p>For example, to match all h2 tags that have class=\"chapter\", set tag
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:39
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:129 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:130
msgid "No details available." msgid "No details available."
msgstr "" msgstr ""
@ -3184,7 +3184,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:788 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:788
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:140
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1004 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1004
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:52 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Error" msgid "Error"
msgstr "" msgstr ""
@ -3712,18 +3712,22 @@ msgstr ""
msgid "Details of job" msgid "Details of job"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44
msgid "Active Jobs" msgid "Active Jobs"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45
msgid "&Stop selected job" msgid "&Stop selected job"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:43 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:46
msgid "Show job &details" msgid "Show job &details"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47
msgid "Stop &all jobs"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133
msgid "Edit Meta information" msgid "Edit Meta information"
msgstr "" msgstr ""
@ -4474,11 +4478,11 @@ msgstr ""
msgid "Job has already run" msgid "Job has already run"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:221
msgid "Unavailable" msgid "Unavailable"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:226 #: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:232
msgid " - Jobs" msgid " - Jobs"
msgstr "" msgstr ""
@ -4673,7 +4677,7 @@ msgid "Save to disk in a single directory"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:280 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:280
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1487 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1415
msgid "Save only %s format to disk" msgid "Save only %s format to disk"
msgstr "" msgstr ""
@ -4713,7 +4717,7 @@ msgid "Calibre Library"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:437 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:437
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1630 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1558
msgid "Choose a location for your ebook library." msgid "Choose a location for your ebook library."
msgstr "" msgstr ""
@ -4817,7 +4821,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1015 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1015
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1048 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1048
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1073 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1073
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1210 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1185
msgid "No books selected" msgid "No books selected"
msgstr "" msgstr ""
@ -4883,162 +4887,162 @@ msgstr ""
msgid " fetched." msgid " fetched."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1209 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1184
msgid "Cannot convert" msgid "Cannot convert"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1379 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1307
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1398 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1326
msgid "No book selected" msgid "No book selected"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1379 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1307
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1429 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1357
msgid "Cannot view" msgid "Cannot view"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1397 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1325
msgid "Cannot open folder" msgid "Cannot open folder"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1414 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1342
msgid "Multiple Books Selected" msgid "Multiple Books Selected"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1415 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1343
msgid "You are attempting to open %d books. Opening too many books at once can be slow and have a negative effect on the responsiveness of your computer. Once started the process cannot be stopped until complete. Do you wish to continue?" msgid "You are attempting to open %d books. Opening too many books at once can be slow and have a negative effect on the responsiveness of your computer. Once started the process cannot be stopped until complete. Do you wish to continue?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1430 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1358
msgid "%s has no available formats." msgid "%s has no available formats."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1471 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1399
msgid "Cannot configure" msgid "Cannot configure"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1472 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1400
msgid "Cannot configure while there are running jobs." msgid "Cannot configure while there are running jobs."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1515 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1443
msgid "No detailed info available" msgid "No detailed info available"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1516 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1444
msgid "No detailed information is available for books on the device." msgid "No detailed information is available for books on the device."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1568 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1496
msgid "Error talking to device" msgid "Error talking to device"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1569 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1497
msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot." msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1592 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1520
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1610 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1538
msgid "Conversion Error" msgid "Conversion Error"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1593 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1521
msgid "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must first remove the DRM using third party tools." msgid "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must first remove the DRM using third party tools."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1611 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1539
msgid "<b>Failed</b>" msgid "<b>Failed</b>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1639 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1567
msgid "Invalid library location" msgid "Invalid library location"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1640 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1568
msgid "Could not access %s. Using %s as the library." msgid "Could not access %s. Using %s as the library."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1687 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1615
msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development." msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1711 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1639
msgid "There are active jobs. Are you sure you want to quit?" msgid "There are active jobs. Are you sure you want to quit?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1714 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1642
msgid "" msgid ""
" is communicating with the device!<br>\n" " is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n" " Quitting may cause corruption on the device.<br>\n"
" Are you sure you want to quit?" " Are you sure you want to quit?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1718 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1646
msgid "WARNING: Active jobs" msgid "WARNING: Active jobs"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1769 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1697
msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray." msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1788 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1716
msgid "<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%s</a></span>" msgid "<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%s</a></span>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1796 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1724
msgid "Update available" msgid "Update available"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1797 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1725
msgid "%s has been updated to version %s. See the <a href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. Visit the download page?" msgid "%s has been updated to version %s. See the <a href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. Visit the download page?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1815 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1743
msgid "Use the library located at the specified path." msgid "Use the library located at the specified path."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1817 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1745
msgid "Start minimized to system tray." msgid "Start minimized to system tray."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1819 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1747
msgid "Log debugging information to console" msgid "Log debugging information to console"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1821 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1749
msgid "Do not check for updates" msgid "Do not check for updates"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1869 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1797
msgid "If you are sure it is not running" msgid "If you are sure it is not running"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1871 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1799
msgid "Cannot Start " msgid "Cannot Start "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1872 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1800
msgid "%s is already running." msgid "%s is already running."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1875 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1803
msgid "may be running in the system tray, in the" msgid "may be running in the system tray, in the"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1877 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1805
msgid "upper right region of the screen." msgid "upper right region of the screen."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1879 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1807
msgid "lower right region of the screen." msgid "lower right region of the screen."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1882 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1810
msgid "try rebooting your computer." msgid "try rebooting your computer."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1884 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1812
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1896 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1824
msgid "try deleting the file" msgid "try deleting the file"
msgstr "" msgstr ""
@ -5224,39 +5228,47 @@ msgstr ""
msgid "Publishers" msgid "Publishers"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:34
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:103 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:105
msgid "Starting conversion of %d books" msgid "Starting conversion of %d books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:64
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:153 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:183
msgid "Convert book %d of %d (%s)" msgid "Convert book %d of %d (%s)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:88 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:90
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:203
msgid "Could not convert some books" msgid "Could not convert some books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:91
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:204
msgid "Could not convert %d of %d books, because no suitable source format was found." msgid "Could not convert %d of %d books, because no suitable source format was found."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:202 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:122
msgid "Queueing books for bulk conversion"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:182
msgid "Queueing "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:236
msgid "You must set a username and password for %s" msgid "You must set a username and password for %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:207 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:241
msgid "Fetch news from " msgid "Fetch news from "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:218 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:252
msgid "Convert existing" msgid "Convert existing"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:253
msgid "The following books have already been converted to %s format. Do you wish to reconvert them?" msgid "The following books have already been converted to %s format. Do you wish to reconvert them?"
msgstr "" msgstr ""
@ -6235,72 +6247,72 @@ msgid ""
"Start the calibre content server." "Start the calibre content server."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:43 #: /home/kovid/work/calibre/src/calibre/utils/config.py:45
msgid "" msgid ""
"%sUsage%s: %s\n" "%sUsage%s: %s\n"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:87 #: /home/kovid/work/calibre/src/calibre/utils/config.py:89
msgid "Created by " msgid "Created by "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:88 #: /home/kovid/work/calibre/src/calibre/utils/config.py:90
msgid "Whenever you pass arguments to %prog that have spaces in them, enclose the arguments in quotation marks." msgid "Whenever you pass arguments to %prog that have spaces in them, enclose the arguments in quotation marks."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:551 #: /home/kovid/work/calibre/src/calibre/utils/config.py:553
msgid "Path to the database in which books are stored" msgid "Path to the database in which books are stored"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:553 #: /home/kovid/work/calibre/src/calibre/utils/config.py:555
msgid "Pattern to guess metadata from filenames" msgid "Pattern to guess metadata from filenames"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:555 #: /home/kovid/work/calibre/src/calibre/utils/config.py:557
msgid "Access key for isbndb.com" msgid "Access key for isbndb.com"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:557 #: /home/kovid/work/calibre/src/calibre/utils/config.py:559
msgid "Default timeout for network operations (seconds)" msgid "Default timeout for network operations (seconds)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:559 #: /home/kovid/work/calibre/src/calibre/utils/config.py:561
msgid "Path to directory in which your library of books is stored" msgid "Path to directory in which your library of books is stored"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:561 #: /home/kovid/work/calibre/src/calibre/utils/config.py:563
msgid "The language in which to display the user interface" msgid "The language in which to display the user interface"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:563 #: /home/kovid/work/calibre/src/calibre/utils/config.py:565
msgid "The default output format for ebook conversions." msgid "The default output format for ebook conversions."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:567 #: /home/kovid/work/calibre/src/calibre/utils/config.py:569
msgid "Ordered list of formats to prefer for input." msgid "Ordered list of formats to prefer for input."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:569 #: /home/kovid/work/calibre/src/calibre/utils/config.py:571
msgid "Read metadata from files" msgid "Read metadata from files"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:571 #: /home/kovid/work/calibre/src/calibre/utils/config.py:573
msgid "The priority of worker processes" msgid "The priority of worker processes"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:42 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43
msgid "Waiting..." msgid "Waiting..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:50 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:51
msgid "Stopped" msgid "Stopped"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:52 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Finished" msgid "Finished"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:69 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:70
msgid "Working..." msgid "Working..."
msgstr "" msgstr ""
@ -6471,12 +6483,12 @@ msgid "sr-Latn-RS"
msgstr "" msgstr ""
#: #:
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_le_monde.py:81 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_le_monde.py:108
msgid "Skipping duplicated article: %s" msgid "Skipping duplicated article: %s"
msgstr "" msgstr ""
#: #:
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_le_monde.py:86 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_le_monde.py:113
msgid "Skipping filtered article: %s" msgid "Skipping filtered article: %s"
msgstr "" msgstr ""