home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __license__ = 'GPL v3'
- __copyright__ = '2009, John Schember <john@nachtimwald.com>'
- __docformat__ = 'restructuredtext en'
- import re
- import struct
- from calibre.ebooks.metadata import MetaInformation
- from calibre.ebooks.metadata import authors_to_string
- from calibre.ebooks.pdb.ereader.reader132 import HeaderRecord
- from calibre.ebooks.pdb.header import PdbHeaderBuilder
- from calibre.ebooks.pdb.header import PdbHeaderReader
-
- def get_cover(pheader, eheader):
- cover_data = None
- for i in range(eheader.image_count):
- raw = pheader.section_data(eheader.image_data_offset + i)
- if raw[4:36].strip('\x00') == 'cover.png':
- cover_data = raw[62:]
- break
- continue
-
- return ('png', cover_data)
-
-
- def get_metadata(stream, extract_cover = True):
- mi = MetaInformation(None, [
- _('Unknown')])
- stream.seek(0)
- pheader = PdbHeaderReader(stream)
- if len(pheader.section_data(0)) == 132:
- hr = HeaderRecord(pheader.section_data(0))
- if hr.compression in (2, 10) and hr.has_metadata == 1:
-
- try:
- mdata = pheader.section_data(hr.metadata_offset)
- mdata = mdata.split('\x00')
- mi.title = re.sub('[^a-zA-Z0-9 \\._=\\+\\-!\\?,\\\'\\"]', '', mdata[0])
- mi.authors = [
- re.sub('[^a-zA-Z0-9 \\._=\\+\\-!\\?,\\\'\\"]', '', mdata[1])]
- mi.publisher = re.sub('[^a-zA-Z0-9 \\._=\\+\\-!\\?,\\\'\\"]', '', mdata[3])
- mi.isbn = re.sub('[^a-zA-Z0-9 \\._=\\+\\-!\\?,\\\'\\"]', '', mdata[4])
- except:
- pass
-
- if extract_cover:
- mi.cover_data = get_cover(pheader, hr)
-
-
-
- if not mi.title:
- mi.title = None if pheader.title else _('Unknown')
-
- return mi
-
-
- def set_metadata(stream, mi):
- pheader = PdbHeaderReader(stream)
- if pheader.section_data(0) != 132:
- return None
- sections = [ pheader.section_data(x) for x in range(0, pheader.section_count()) ]
- hr = HeaderRecord(sections[0])
- if hr.compression not in (2, 10):
- return None
- file_mi = get_metadata(stream, False)
- file_mi.smart_update(mi)
- 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)
- pheader_builder = PdbHeaderBuilder(pheader.ident, pheader.title)
- stream.seek(0)
- stream.truncate(0)
- []([ len(x) for x in sections ], stream)
- for item in sections:
- stream.write(item)
-
-
-