home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1419 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.9 KB  |  198 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 os
  9. import time
  10. import shutil
  11. from calibre.constants import plugins, preferred_encoding
  12. from calibre.ebooks.metadata import MetaInformation, string_to_authors, authors_to_string
  13. from calibre.utils.ipc.job import ParallelJob
  14. from calibre.utils.ipc.server import Server
  15. from calibre.ptempfile import PersistentTemporaryFile
  16. from calibre import prints
  17. (podofo, podofo_err) = plugins['podofo']
  18.  
  19. class Unavailable(Exception):
  20.     pass
  21.  
  22.  
  23. def get_metadata(stream, cpath = None):
  24.     if not podofo:
  25.         raise Unavailable(podofo_err)
  26.     podofo
  27.     pt = PersistentTemporaryFile('_podofo.pdf')
  28.     pt.write(stream.read())
  29.     pt.close()
  30.     server = Server(pool_size = 1)
  31.     job = ParallelJob('read_pdf_metadata', 'Read pdf metadata', (lambda x, y: x), args = [
  32.         pt.name,
  33.         cpath])
  34.     server.add_job(job)
  35.     while not job.is_finished:
  36.         time.sleep(0.1)
  37.         job.update()
  38.     job.update()
  39.     server.close()
  40.     if job.result is None:
  41.         raise ValueError('Failed to read metadata: ' + job.details)
  42.     job.result is None
  43.     (title, authors, creator, ok) = job.result
  44.     if not ok:
  45.         print 'Failed to extract cover:'
  46.         print job.details
  47.     
  48.     if title == '_':
  49.         title = getattr(stream, 'name', _('Unknown'))
  50.         title = os.path.splitext(title)[0]
  51.     
  52.     mi = MetaInformation(title, authors)
  53.     if creator:
  54.         mi.book_producer = creator
  55.     
  56.     if os.path.exists(pt.name):
  57.         os.remove(pt.name)
  58.     
  59.     if ok:
  60.         mi.cover = cpath
  61.     
  62.     return mi
  63.  
  64.  
  65. def get_metadata_quick(raw):
  66.     p = podofo.PDFDoc()
  67.     p.load(raw)
  68.     title = p.title
  69.     if not title:
  70.         title = '_'
  71.     
  72.     author = p.author
  73.     authors = None if author else [
  74.         _('Unknown')]
  75.     creator = p.creator
  76.     mi = MetaInformation(title, authors)
  77.     if creator:
  78.         mi.book_producer = creator
  79.     
  80.     return mi
  81.  
  82.  
  83. def get_metadata_(path, cpath = None):
  84.     p = podofo.PDFDoc()
  85.     p.open(path)
  86.     title = p.title
  87.     if not title:
  88.         title = '_'
  89.     
  90.     author = p.author
  91.     authors = None if author else [
  92.         _('Unknown')]
  93.     creator = p.creator
  94.     ok = True
  95.     
  96.     try:
  97.         if cpath is not None:
  98.             pages = p.pages
  99.             if pages < 1:
  100.                 raise ValueError('PDF has no pages')
  101.             pages < 1
  102.             if True or pages == 1:
  103.                 shutil.copyfile(path, cpath)
  104.             else:
  105.                 p.extract_first_page()
  106.                 p.save(cpath)
  107.     except:
  108.         import traceback
  109.         traceback.print_exc()
  110.         ok = False
  111.  
  112.     return (title, authors, creator, ok)
  113.  
  114.  
  115. def prep(val):
  116.     if not val:
  117.         return u''
  118.     if not isinstance(val, unicode):
  119.         val = val.decode(preferred_encoding, 'replace')
  120.     
  121.     return val.strip()
  122.  
  123.  
  124. def set_metadata(stream, mi):
  125.     if not podofo:
  126.         raise Unavailable(podofo_err)
  127.     podofo
  128.     pt = PersistentTemporaryFile('_podofo.pdf')
  129.     pt.write(stream.read())
  130.     pt.close()
  131.     server = Server(pool_size = 1)
  132.     job = ParallelJob('write_pdf_metadata', 'Write pdf metadata', (lambda x, y: x), args = [
  133.         pt.name,
  134.         mi.title,
  135.         mi.authors,
  136.         mi.book_producer])
  137.     server.add_job(job)
  138.     while not job.is_finished:
  139.         time.sleep(0.1)
  140.         job.update()
  141.     job.update()
  142.     server.close()
  143.     if job.failed:
  144.         prints(job.details)
  145.     elif job.result is not None:
  146.         stream.seek(0)
  147.         stream.truncate()
  148.         stream.write(job.result)
  149.         stream.flush()
  150.         stream.seek(0)
  151.     
  152.     
  153.     try:
  154.         os.remove(pt.name)
  155.     except:
  156.         pass
  157.  
  158.  
  159.  
  160. def set_metadata_(path, title, authors, bkp):
  161.     p = podofo.PDFDoc()
  162.     p.open(path)
  163.     title = prep(title)
  164.     touched = False
  165.     if title:
  166.         p.title = title
  167.         touched = True
  168.     
  169.     author = prep(authors_to_string(authors))
  170.     if author:
  171.         p.author = author
  172.         touched = True
  173.     
  174.     bkp = prep(bkp)
  175.     if bkp:
  176.         p.creator = bkp
  177.         touched = True
  178.     
  179.  
  180. if __name__ == '__main__':
  181.     f = '/tmp/t.pdf'
  182.     import StringIO
  183.     stream = StringIO.StringIO(open(f).read())
  184.     mi = get_metadata(open(f))
  185.     print 
  186.     print 'Original metadata:'
  187.     print mi
  188.     mi.title = 'Test title'
  189.     mi.authors = [
  190.         'Test author',
  191.         'author2']
  192.     mi.book_producer = 'calibre'
  193.     set_metadata(stream, mi)
  194.     open('/tmp/x.pdf', 'wb').write(stream.getvalue())
  195.     print 
  196.     print 'New pdf written to /tmp/x.pdf'
  197.  
  198.