home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 January / maximum-cd-2011-01.iso / DiscContents / calibre-0.7.26.msi / file_1377 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-10-31  |  9.8 KB  |  269 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL v3'
  5. __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
  6. __docformat__ = 'restructuredtext en'
  7. import cPickle
  8. import os
  9. from PyQt4.Qt import QDialog, QProgressDialog, QString, QTimer, SIGNAL
  10. from calibre.ptempfile import PersistentTemporaryFile
  11. from calibre.gui2 import warning_dialog, question_dialog
  12. from calibre.gui2.convert.single import NoSupportedInputFormats
  13. from calibre.gui2.convert.single import Config as SingleConfig, get_input_format_for_book
  14. from calibre.gui2.convert.bulk import BulkConfig
  15. from calibre.gui2.convert.metadata import create_opf_file, create_cover_file
  16. from calibre.customize.conversion import OptionRecommendation
  17. from calibre.utils.config import prefs
  18. from calibre.ebooks.conversion.config import GuiRecommendations, load_defaults, load_specifics, save_specifics
  19. from calibre.gui2.convert import bulk_defaults_for_input_format
  20.  
  21. def convert_single_ebook(parent, db, book_ids, auto_conversion = False, out_format = None):
  22.     changed = False
  23.     jobs = []
  24.     bad = []
  25.     total = len(book_ids)
  26.     if total == 0:
  27.         return (None, None, None)
  28.     for i, book_id in enumerate(book_ids):
  29.         temp_files = []
  30.         
  31.         try:
  32.             d = SingleConfig(parent, db, book_id, None, out_format)
  33.             if auto_conversion:
  34.                 d.accept()
  35.                 result = QDialog.Accepted
  36.             else:
  37.                 result = d.exec_()
  38.             if result == QDialog.Accepted:
  39.                 mi = db.get_metadata(book_id, True)
  40.                 in_file = db.format_abspath(book_id, d.input_format, True)
  41.                 out_file = PersistentTemporaryFile('.' + d.output_format)
  42.                 out_file.write(d.output_format)
  43.                 out_file.close()
  44.                 temp_files = []
  45.                 
  46.                 try:
  47.                     dtitle = unicode(mi.title)
  48.                 except:
  49.                     dtitle = repr(mi.title)
  50.  
  51.                 desc = _('Convert book %d of %d (%s)') % (i + 1, total, dtitle)
  52.                 recs = cPickle.loads(d.recommendations)
  53.                 if d.opf_file is not None:
  54.                     recs.append(('read_metadata_from_opf', d.opf_file.name, OptionRecommendation.HIGH))
  55.                     temp_files.append(d.opf_file)
  56.                 
  57.                 if d.cover_file is not None:
  58.                     recs.append(('cover', d.cover_file.name, OptionRecommendation.HIGH))
  59.                     temp_files.append(d.cover_file)
  60.                 
  61.                 args = [
  62.                     in_file,
  63.                     out_file.name,
  64.                     recs]
  65.                 temp_files.append(out_file)
  66.                 jobs.append(('gui_convert', args, desc, d.output_format.upper(), book_id, temp_files))
  67.                 changed = True
  68.                 d.break_cycles()
  69.         continue
  70.         except NoSupportedInputFormats:
  71.             total == 0
  72.             total == 0
  73.             bad.append(book_id)
  74.             continue
  75.         
  76.  
  77.     
  78.     return (jobs, changed, bad)
  79.  
  80.  
  81. def convert_bulk_ebook(parent, queue, db, book_ids, out_format = None, args = []):
  82.     total = len(book_ids)
  83.     if total == 0:
  84.         return (None, None, None)
  85.     d = BulkConfig(parent, db, out_format)
  86.     if d.exec_() != QDialog.Accepted:
  87.         return None
  88.     output_format = d.output_format
  89.     user_recs = cPickle.loads(d.recommendations)
  90.     book_ids = convert_existing(parent, db, book_ids, output_format)
  91.     use_saved_single_settings = d.opt_individual_saved_settings.isChecked()
  92.     return QueueBulk(parent, book_ids, output_format, queue, db, user_recs, args, use_saved_single_settings = use_saved_single_settings)
  93.  
  94.  
  95. class QueueBulk(QProgressDialog):
  96.     
  97.     def __init__(self, parent, book_ids, output_format, queue, db, user_recs, args, use_saved_single_settings = True):
  98.         QProgressDialog.__init__(self, '', QString(), 0, len(book_ids), parent)
  99.         self.setWindowTitle(_('Queueing books for bulk conversion'))
  100.         (self.book_ids, self.output_format, self.queue, self.db, self.args, self.user_recs) = (book_ids, output_format, queue, db, args, user_recs)
  101.         self.parent = parent
  102.         self.use_saved_single_settings = use_saved_single_settings
  103.         (self.i, self.bad, self.jobs, self.changed) = (0, [], [], False)
  104.         self.timer = QTimer(self)
  105.         self.connect(self.timer, SIGNAL('timeout()'), self.do_book)
  106.         self.timer.start()
  107.         self.exec_()
  108.  
  109.     
  110.     def do_book(self):
  111.         if self.i >= len(self.book_ids):
  112.             self.timer.stop()
  113.             return self.do_queue()
  114.         book_id = self.book_ids[self.i]
  115.         self.i += 1
  116.         temp_files = []
  117.         
  118.         try:
  119.             input_format = get_input_format_for_book(self.db, book_id, None)[0]
  120.             (mi, opf_file) = create_opf_file(self.db, book_id)
  121.             in_file = self.db.format_abspath(book_id, input_format, True)
  122.             out_file = PersistentTemporaryFile('.' + self.output_format)
  123.             out_file.write(self.output_format)
  124.             out_file.close()
  125.             temp_files = []
  126.             combined_recs = GuiRecommendations()
  127.             default_recs = bulk_defaults_for_input_format(input_format)
  128.             for key in default_recs:
  129.                 combined_recs[key] = default_recs[key]
  130.             
  131.             for item in self.user_recs:
  132.                 combined_recs[item[0]] = item[1]
  133.             
  134.             save_specifics(self.db, book_id, combined_recs)
  135.             lrecs = list(combined_recs.to_recommendations())
  136.             cover_file = create_cover_file(self.db, book_id)
  137.             if opf_file is not None:
  138.                 lrecs.append(('read_metadata_from_opf', opf_file.name, OptionRecommendation.HIGH))
  139.                 temp_files.append(opf_file)
  140.             
  141.             if cover_file is not None:
  142.                 lrecs.append(('cover', cover_file.name, OptionRecommendation.HIGH))
  143.                 temp_files.append(cover_file)
  144.             
  145.             for x in list(lrecs):
  146.                 if x[0] == 'debug_pipeline':
  147.                     lrecs.remove(x)
  148.                     continue
  149.             
  150.             
  151.             try:
  152.                 dtitle = unicode(mi.title)
  153.             except:
  154.                 dtitle = repr(mi.title)
  155.  
  156.             self.setLabelText(_('Queueing ') + dtitle)
  157.             desc = _('Convert book %d of %d (%s)') % (self.i, len(self.book_ids), dtitle)
  158.             args = [
  159.                 in_file,
  160.                 out_file.name,
  161.                 lrecs]
  162.             temp_files.append(out_file)
  163.             self.jobs.append(('gui_convert', args, desc, self.output_format.upper(), book_id, temp_files))
  164.             self.changed = True
  165.             self.setValue(self.i)
  166.         except NoSupportedInputFormats:
  167.             self
  168.             self
  169.             self.i >= len(self.book_ids)
  170.             self.bad.append(book_id)
  171.         except:
  172.             self
  173.  
  174.  
  175.     
  176.     def do_queue(self):
  177.         self.hide()
  178.         if self.bad != []:
  179.             res = []
  180.             for id in self.bad:
  181.                 title = self.db.title(id, True)
  182.                 res.append('%s' % title)
  183.             
  184.             msg = '%s' % '\n'.join(res)
  185.             warning_dialog(self.parent, _('Could not convert some books'), _('Could not convert %d of %d books, because no suitable source format was found.') % (len(res), len(self.book_ids)), msg).exec_()
  186.         
  187.         self.parent = None
  188.         self.jobs.reverse()
  189.         self.queue(self.jobs, self.changed, self.bad, *self.args)
  190.  
  191.  
  192.  
  193. def fetch_scheduled_recipe(arg):
  194.     fmt = prefs['output_format'].lower()
  195.     pt = PersistentTemporaryFile(suffix = '_recipe_out.%s' % fmt.lower())
  196.     pt.close()
  197.     recs = []
  198.     ps = load_defaults('page_setup')
  199.     if 'output_profile' in ps:
  200.         recs.append(('output_profile', ps['output_profile'], OptionRecommendation.HIGH))
  201.     
  202.     lf = load_defaults('look_and_feel')
  203.     if lf.get('base_font_size', 0) != 0:
  204.         recs.append(('base_font_size', lf['base_font_size'], OptionRecommendation.HIGH))
  205.         recs.append(('keep_ligatures', lf.get('keep_ligatures', False), OptionRecommendation.HIGH))
  206.     
  207.     lr = load_defaults('lrf_output')
  208.     if lr.get('header', False):
  209.         recs.append(('header', True, OptionRecommendation.HIGH))
  210.         recs.append(('header_format', '%t', OptionRecommendation.HIGH))
  211.     
  212.     args = [
  213.         arg['recipe'],
  214.         pt.name,
  215.         recs]
  216.     if arg['username'] is not None:
  217.         recs.append(('username', arg['username'], OptionRecommendation.HIGH))
  218.     
  219.     if arg['password'] is not None:
  220.         recs.append(('password', arg['password'], OptionRecommendation.HIGH))
  221.     
  222.     return ('gui_convert', args, _('Fetch news from ') + arg['title'], fmt.upper(), [
  223.         pt])
  224.  
  225.  
  226. def generate_catalog(parent, dbspec, ids, device_manager):
  227.     Catalog = Catalog
  228.     import calibre.gui2.dialogs.catalog
  229.     d = Catalog(parent, dbspec, ids)
  230.     if d.exec_() != d.Accepted:
  231.         return None
  232.     out = PersistentTemporaryFile(suffix = '_catalog_out.' + d.catalog_format.lower())
  233.     connected_device = {
  234.         'is_device_connected': device_manager.is_device_connected,
  235.         'kind': device_manager.connected_device_kind,
  236.         'name': None,
  237.         'save_template': None,
  238.         'serial': None,
  239.         'storage': None }
  240.     args = [
  241.         d.catalog_format,
  242.         d.catalog_title,
  243.         dbspec,
  244.         ids,
  245.         out.name,
  246.         d.catalog_sync,
  247.         d.fmt_options,
  248.         connected_device]
  249.     out.close()
  250.     return ('gui_catalog', args, _('Generate catalog'), out.name, d.catalog_sync, d.catalog_title)
  251.  
  252.  
  253. def convert_existing(parent, db, book_ids, output_format):
  254.     already_converted_ids = []
  255.     already_converted_titles = []
  256.     for book_id in book_ids:
  257.         if db.has_format(book_id, output_format, index_is_id = True):
  258.             already_converted_ids.append(book_id)
  259.             already_converted_titles.append(db.get_metadata(book_id, True).title)
  260.             continue
  261.     
  262.     if already_converted_ids:
  263.         if not question_dialog(parent, _('Convert existing'), _('The following books have already been converted to %s format. Do you wish to reconvert them?') % output_format, '\n'.join(already_converted_titles)):
  264.             book_ids = _[1]
  265.         
  266.     
  267.     return book_ids
  268.  
  269.