home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1307 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.3 KB  |  190 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from __future__ import with_statement
  5. __license__ = 'GPL v3'
  6. __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
  7. __docformat__ = 'restructuredtext en'
  8. import traceback
  9. from threading import Thread
  10. from Queue import Queue, Empty
  11. from calibre.ebooks.metadata.fetch import search, get_social_metadata
  12. from calibre.gui2 import config
  13. from calibre.ebooks.metadata.covers import download_cover
  14. from calibre.customize.ui import get_isbndb_key
  15. from calibre import prints
  16. from calibre.constants import DEBUG
  17.  
  18. class Worker(Thread):
  19.     
  20.     def __init__(self):
  21.         Thread.__init__(self)
  22.         self.setDaemon(True)
  23.         self.jobs = Queue()
  24.         self.results = Queue()
  25.  
  26.     
  27.     def run(self):
  28.         while True:
  29.             mi = self.jobs.get()
  30.             if not getattr(mi, 'isbn', False):
  31.                 break
  32.             
  33.             
  34.             try:
  35.                 (cdata, errors) = download_cover(mi)
  36.                 if cdata:
  37.                     self.results.put((mi.isbn, cdata))
  38.                 elif DEBUG:
  39.                     prints('Cover download failed:', errors)
  40.             continue
  41.             traceback.print_exc()
  42.             continue
  43.  
  44.  
  45.     
  46.     def __enter__(self):
  47.         self.start()
  48.         return self
  49.  
  50.     
  51.     def __exit__(self, *args):
  52.         self.jobs.put(False)
  53.  
  54.  
  55.  
  56. class DownloadMetadata(Thread):
  57.     
  58.     def __init__(self, db, ids, get_covers, set_metadata = True, get_social_metadata = True):
  59.         Thread.__init__(self)
  60.         self.setDaemon(True)
  61.         self.metadata = { }
  62.         self.covers = { }
  63.         self.set_metadata = set_metadata
  64.         self.get_social_metadata = get_social_metadata
  65.         self.social_metadata_exceptions = []
  66.         self.db = db
  67.         self.updated = set([])
  68.         self.get_covers = get_covers
  69.         self.worker = Worker()
  70.         for id in ids:
  71.             self.metadata[id] = db.get_metadata(id, index_is_id = True)
  72.             self.metadata[id].rating = None
  73.         
  74.  
  75.     
  76.     def run(self):
  77.         self.exception = None
  78.         self.tb = None
  79.         
  80.         try:
  81.             self._run()
  82.         except Exception:
  83.             e = None
  84.             self.exception = e
  85.             import traceback
  86.             self.tb = traceback.format_exc()
  87.  
  88.  
  89.     
  90.     def _run(self):
  91.         self.key = get_isbndb_key()
  92.         if not self.key:
  93.             self.key = None
  94.         
  95.         self.fetched_metadata = { }
  96.         self.failures = { }
  97.         self.worker.__enter__()
  98.         
  99.         try:
  100.             for id, mi in self.metadata.items():
  101.                 args = { }
  102.                 if mi.isbn:
  103.                     args['isbn'] = mi.isbn
  104.                 elif not (mi.title) or mi.title == _('Unknown'):
  105.                     self.failures[id] = (str(id), _('Book has neither title nor ISBN'))
  106.                     continue
  107.                 
  108.                 args['title'] = mi.title
  109.                 if mi.authors and mi.authors[0] != _('Unknown'):
  110.                     args['author'] = mi.authors[0]
  111.                 
  112.                 if self.key:
  113.                     args['isbndb_key'] = self.key
  114.                 
  115.                 (results, exceptions) = search(**args)
  116.                 if results:
  117.                     fmi = results[0]
  118.                     self.fetched_metadata[id] = fmi
  119.                     if fmi.isbn and self.get_covers:
  120.                         self.worker.jobs.put(fmi)
  121.                     
  122.                     if not config['overwrite_author_title_metadata']:
  123.                         fmi.authors = mi.authors
  124.                         fmi.author_sort = mi.author_sort
  125.                         fmi.title = mi.title
  126.                     
  127.                     mi.smart_update(fmi)
  128.                     if mi.isbn and self.get_social_metadata:
  129.                         self.social_metadata_exceptions = get_social_metadata(mi)
  130.                         if mi.rating:
  131.                             mi.rating *= 2
  132.                         
  133.                     
  134.                     if not self.get_social_metadata:
  135.                         mi.tags = []
  136.                     
  137.                 else:
  138.                     self.failures[id] = (mi.title, _('No matches found for this book'))
  139.                 self.commit_covers()
  140.         finally:
  141.             pass
  142.  
  143.         self.commit_covers(True)
  144.         for id in self.fetched_metadata:
  145.             mi = self.metadata[id]
  146.             if not (self.set_metadata) and self.get_social_metadata:
  147.                 if mi.rating:
  148.                     self.db.set_rating(id, mi.rating)
  149.                 
  150.                 if mi.tags:
  151.                     self.db.set_tags(id, mi.tags)
  152.                 
  153.                 if mi.comments:
  154.                     self.db.set_comment(id, mi.comments)
  155.                 
  156.                 if mi.series:
  157.                     self.db.set_series(id, mi.series)
  158.                     if mi.series_index is not None:
  159.                         self.db.set_series_index(id, mi.series_index)
  160.                     
  161.                 
  162.             mi.series
  163.         
  164.         self.updated = set(self.fetched_metadata)
  165.  
  166.     
  167.     def commit_covers(self, all = False):
  168.         if all:
  169.             self.worker.jobs.put(False)
  170.         
  171.         while True:
  172.             
  173.             try:
  174.                 (isbn, cdata) = self.worker.results.get(False)
  175.                 for id, mi in self.metadata.items():
  176.                     if mi.isbn == isbn:
  177.                         self.db.set_cover(id, cdata)
  178.                         continue
  179.             continue
  180.             except Empty:
  181.                 if not all or not self.worker.is_alive():
  182.                     return None
  183.                 continue
  184.                 not self.worker.is_alive()
  185.             
  186.  
  187.             None<EXCEPTION MATCH>Empty
  188.  
  189.  
  190.