home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 January / maximum-cd-2011-01.iso / DiscContents / calibre-0.7.26.msi / file_944 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-10-31  |  5.5 KB  |  142 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from base64 import b64encode, b64decode
  5. import json
  6. import traceback
  7. from calibre.ebooks.metadata.book import SERIALIZABLE_FIELDS
  8. from calibre.constants import filesystem_encoding, preferred_encoding
  9. from calibre.library.field_metadata import FieldMetadata
  10. from calibre.utils.date import parse_date, isoformat, UNDEFINED_DATE
  11. from calibre.utils.magick import Image
  12. from calibre import isbytestring
  13.  
  14. def string_to_datetime(src):
  15.     if src == 'None':
  16.         return None
  17.     return parse_date(src)
  18.  
  19.  
  20. def datetime_to_string(dateval):
  21.     if dateval is None or dateval == UNDEFINED_DATE:
  22.         return 'None'
  23.     return isoformat(dateval)
  24.  
  25.  
  26. def encode_thumbnail(thumbnail):
  27.     if thumbnail is None:
  28.         return None
  29.     return (thumbnail[0], thumbnail[1], b64encode(str(thumbnail[2])))
  30.  
  31.  
  32. def decode_thumbnail(tup):
  33.     if tup is None:
  34.         return None
  35.     return (tup[0], tup[1], b64decode(tup[2]))
  36.  
  37.  
  38. def object_to_unicode(obj, enc = preferred_encoding):
  39.     
  40.     def dec(x):
  41.         return x.decode(enc, 'replace')
  42.  
  43.     if isbytestring(obj):
  44.         return dec(obj)
  45.     if isinstance(obj, (list, tuple)):
  46.         return [ _[1] if isbytestring(x) else x for x in obj ]
  47.     if isinstance(obj, dict):
  48.         ans = { }
  49.         for k, v in obj.items():
  50.             k = object_to_unicode(k)
  51.             v = object_to_unicode(v)
  52.             ans[k] = v
  53.         
  54.         return ans
  55.     return obj
  56.  
  57.  
  58. class JsonCodec(object):
  59.     
  60.     def __init__(self):
  61.         self.field_metadata = FieldMetadata()
  62.  
  63.     
  64.     def encode_to_file(self, file, booklist):
  65.         file.write(json.dumps(self.encode_booklist_metadata(booklist), indent = 2, encoding = 'utf-8'))
  66.  
  67.     
  68.     def encode_booklist_metadata(self, booklist):
  69.         result = []
  70.         for book in booklist:
  71.             result.append(self.encode_book_metadata(book))
  72.         
  73.         return result
  74.  
  75.     
  76.     def encode_book_metadata(self, book):
  77.         result = { }
  78.         for key in SERIALIZABLE_FIELDS:
  79.             result[key] = self.encode_metadata_attr(book, key)
  80.         
  81.         return result
  82.  
  83.     
  84.     def encode_metadata_attr(self, book, key):
  85.         if key == 'user_metadata':
  86.             meta = book.get_all_user_metadata(make_copy = True)
  87.             for k in meta:
  88.                 if meta[k]['datatype'] == 'datetime':
  89.                     meta[k]['#value#'] = datetime_to_string(meta[k]['#value#'])
  90.                     continue
  91.             
  92.             return meta
  93.         if key in self.field_metadata:
  94.             datatype = self.field_metadata[key]['datatype']
  95.         else:
  96.             datatype = None
  97.         value = book.get(key)
  98.         if key == 'thumbnail':
  99.             return encode_thumbnail(value)
  100.         if isbytestring(value):
  101.             enc = key == 'thumbnail' if key == 'lpath' else preferred_encoding
  102.             return object_to_unicode(value, enc = enc)
  103.         if datatype == 'datetime':
  104.             return datetime_to_string(value)
  105.         return object_to_unicode(value)
  106.  
  107.     
  108.     def decode_from_file(self, file, booklist, book_class, prefix):
  109.         js = []
  110.         
  111.         try:
  112.             js = json.load(file, encoding = 'utf-8')
  113.             for item in js:
  114.                 book = book_class(prefix, item.get('lpath', None))
  115.                 for key in item.keys():
  116.                     meta = self.decode_metadata(key, item[key])
  117.                     if key == 'user_metadata':
  118.                         book.set_all_user_metadata(meta)
  119.                         continue
  120.                     setattr(book, key, meta)
  121.                 
  122.                 booklist.append(book)
  123.         except:
  124.             print 'exception during JSON decoding'
  125.             traceback.print_exc()
  126.  
  127.  
  128.     
  129.     def decode_metadata(self, key, value):
  130.         if key == 'user_metadata':
  131.             for k in value:
  132.                 if value[k]['datatype'] == 'datetime':
  133.                     value[k]['#value#'] = string_to_datetime(value[k]['#value#'])
  134.                     continue
  135.             
  136.             return value
  137.         if key == 'thumbnail':
  138.             return decode_thumbnail(value)
  139.         return value
  140.  
  141.  
  142.