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

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL v3'
  5. __copyright__ = '2009, John Schember <john@nachtimwald.com>'
  6. __docformat__ = 'restructuredtext en'
  7. import re
  8. import struct
  9. from calibre.ebooks.metadata import MetaInformation
  10. from calibre.ebooks.metadata import authors_to_string
  11. from calibre.ebooks.pdb.ereader.reader132 import HeaderRecord
  12. from calibre.ebooks.pdb.header import PdbHeaderBuilder
  13. from calibre.ebooks.pdb.header import PdbHeaderReader
  14.  
  15. def get_cover(pheader, eheader):
  16.     cover_data = None
  17.     for i in range(eheader.image_count):
  18.         raw = pheader.section_data(eheader.image_data_offset + i)
  19.         if raw[4:36].strip('\x00') == 'cover.png':
  20.             cover_data = raw[62:]
  21.             break
  22.             continue
  23.     
  24.     return ('png', cover_data)
  25.  
  26.  
  27. def get_metadata(stream, extract_cover = True):
  28.     mi = MetaInformation(None, [
  29.         _('Unknown')])
  30.     stream.seek(0)
  31.     pheader = PdbHeaderReader(stream)
  32.     if len(pheader.section_data(0)) == 132:
  33.         hr = HeaderRecord(pheader.section_data(0))
  34.         if hr.compression in (2, 10) and hr.has_metadata == 1:
  35.             
  36.             try:
  37.                 mdata = pheader.section_data(hr.metadata_offset)
  38.                 mdata = mdata.split('\x00')
  39.                 mi.title = re.sub('[^a-zA-Z0-9 \\._=\\+\\-!\\?,\\\'\\"]', '', mdata[0])
  40.                 mi.authors = [
  41.                     re.sub('[^a-zA-Z0-9 \\._=\\+\\-!\\?,\\\'\\"]', '', mdata[1])]
  42.                 mi.publisher = re.sub('[^a-zA-Z0-9 \\._=\\+\\-!\\?,\\\'\\"]', '', mdata[3])
  43.                 mi.isbn = re.sub('[^a-zA-Z0-9 \\._=\\+\\-!\\?,\\\'\\"]', '', mdata[4])
  44.             except:
  45.                 pass
  46.  
  47.             if extract_cover:
  48.                 mi.cover_data = get_cover(pheader, hr)
  49.             
  50.         
  51.     
  52.     if not mi.title:
  53.         mi.title = None if pheader.title else _('Unknown')
  54.     
  55.     return mi
  56.  
  57.  
  58. def set_metadata(stream, mi):
  59.     pheader = PdbHeaderReader(stream)
  60.     if pheader.section_data(0) != 132:
  61.         return None
  62.     sections = [ pheader.section_data(x) for x in range(0, pheader.section_count()) ]
  63.     hr = HeaderRecord(sections[0])
  64.     if hr.compression not in (2, 10):
  65.         return None
  66.     file_mi = get_metadata(stream, False)
  67.     file_mi.smart_update(mi)
  68.     sections[hr.metadata_offset] = '%s\x00%s\x00%s\x00%s\x00%s\x00' % (file_mi.title, authors_to_string(file_mi.authors), '', file_mi.publisher, file_mi.isbn)
  69.     pheader_builder = PdbHeaderBuilder(pheader.ident, pheader.title)
  70.     stream.seek(0)
  71.     stream.truncate(0)
  72.     []([ len(x) for x in sections ], stream)
  73.     for item in sections:
  74.         stream.write(item)
  75.     
  76.  
  77.