home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1008 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.0 KB  |  166 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. from calibre.utils.date import isoformat, now
  10. from calibre import guess_type
  11.  
  12. def meta_info_to_oeb_metadata(mi, m, log):
  13.     OPF = OPF
  14.     import calibre.ebooks.oeb.base
  15.     if mi.title:
  16.         m.clear('title')
  17.         m.add('title', mi.title)
  18.     
  19.     if mi.title_sort:
  20.         if not m.title:
  21.             m.add('title', mi.title_sort)
  22.         
  23.         m.title[0].file_as = mi.title_sort
  24.     
  25.     if mi.authors:
  26.         m.filter('creator', (lambda x: x.role.lower() in ('aut', '')))
  27.         for a in mi.authors:
  28.             attrib = {
  29.                 'role': 'aut' }
  30.             if mi.author_sort:
  31.                 attrib[OPF('file-as')] = mi.author_sort
  32.             
  33.             m.add('creator', a, attrib = attrib)
  34.         
  35.     
  36.     if mi.book_producer:
  37.         m.filter('contributor', (lambda x: x.role.lower() == 'bkp'))
  38.         m.add('contributor', mi.book_producer, role = 'bkp')
  39.     
  40.     if mi.comments:
  41.         m.clear('description')
  42.         m.add('description', mi.comments)
  43.     
  44.     if mi.publisher:
  45.         m.clear('publisher')
  46.         m.add('publisher', mi.publisher)
  47.     
  48.     if mi.series:
  49.         m.clear('series')
  50.         m.add('series', mi.series)
  51.     
  52.     if mi.isbn:
  53.         has = False
  54.         for x in m.identifier:
  55.             if x.scheme.lower() == 'isbn':
  56.                 x.content = mi.isbn
  57.                 has = True
  58.                 continue
  59.         
  60.         if not has:
  61.             m.add('identifier', mi.isbn, scheme = 'ISBN')
  62.         
  63.     
  64.     if mi.language:
  65.         m.clear('language')
  66.         m.add('language', mi.language)
  67.     
  68.     if mi.series_index is not None:
  69.         m.clear('series_index')
  70.         m.add('series_index', mi.format_series_index())
  71.     
  72.     if mi.rating is not None:
  73.         m.clear('rating')
  74.         m.add('rating', '%.2f' % mi.rating)
  75.     
  76.     if mi.tags:
  77.         m.clear('subject')
  78.         for t in mi.tags:
  79.             m.add('subject', t)
  80.         
  81.     
  82.     if mi.pubdate is not None:
  83.         m.clear('date')
  84.         m.add('date', isoformat(mi.pubdate))
  85.     
  86.     if mi.timestamp is not None:
  87.         m.clear('timestamp')
  88.         m.add('timestamp', isoformat(mi.timestamp))
  89.     
  90.     if mi.rights is not None:
  91.         m.clear('rights')
  92.         m.add('rights', mi.rights)
  93.     
  94.     if mi.publication_type is not None:
  95.         m.clear('publication_type')
  96.         m.add('publication_type', mi.publication_type)
  97.     
  98.     if not m.timestamp:
  99.         m.add('timestamp', isoformat(now()))
  100.     
  101.  
  102.  
  103. class MergeMetadata(object):
  104.     
  105.     def __call__(self, oeb, mi, opts):
  106.         self.oeb = oeb
  107.         self.log = oeb.log
  108.         m = self.oeb.metadata
  109.         self.log('Merging user specified metadata...')
  110.         meta_info_to_oeb_metadata(mi, m, oeb.log)
  111.         cover_id = self.set_cover(mi, opts.prefer_metadata_cover)
  112.         m.clear('cover')
  113.         if cover_id is not None:
  114.             m.add('cover', cover_id)
  115.         
  116.         if mi.uuid is not None:
  117.             m.filter('identifier', (lambda x: x.id == 'uuid_id'))
  118.             self.oeb.metadata.add('identifier', mi.uuid, id = 'uuid_id', scheme = 'uuid')
  119.             self.oeb.uid = self.oeb.metadata.identifier[-1]
  120.         
  121.  
  122.     
  123.     def set_cover(self, mi, prefer_metadata_cover):
  124.         (cdata, ext) = ('', 'jpg')
  125.         if mi.cover and os.access(mi.cover, os.R_OK):
  126.             cdata = open(mi.cover, 'rb').read()
  127.             ext = mi.cover.rpartition('.')[-1].lower().strip()
  128.         elif mi.cover_data and mi.cover_data[-1]:
  129.             cdata = mi.cover_data[1]
  130.             ext = mi.cover_data[0]
  131.         
  132.         if ext not in ('png', 'jpg', 'jpeg'):
  133.             ext = 'jpg'
  134.         
  135.         id = None
  136.         old_cover = None
  137.         if 'cover' in self.oeb.guide:
  138.             old_cover = self.oeb.guide['cover']
  139.         
  140.         if prefer_metadata_cover and old_cover is not None:
  141.             cdata = ''
  142.         
  143.         if cdata:
  144.             self.oeb.guide.remove('cover')
  145.             self.oeb.guide.remove('titlepage')
  146.         
  147.         if old_cover is not None:
  148.             if old_cover.href in self.oeb.manifest.hrefs:
  149.                 item = self.oeb.manifest.hrefs[old_cover.href]
  150.                 if not cdata:
  151.                     return item.id
  152.                 self.oeb.manifest.remove(item)
  153.             elif not cdata:
  154.                 id = self.oeb.manifest.generate(id = 'cover')
  155.                 self.oeb.manifest.add(id, old_cover.href, 'image/jpeg')
  156.                 return id
  157.         
  158.         if cdata:
  159.             (id, href) = self.oeb.manifest.generate('cover', 'cover.' + ext)
  160.             self.oeb.manifest.add(id, href, guess_type('cover.' + ext)[0], data = cdata)
  161.             self.oeb.guide.add('cover', 'Cover', href)
  162.         
  163.         return id
  164.  
  165.  
  166.