def render(pathtoebook, output_dir, book_hash=None, serialize_metadata=False, extract_annotations=False, virtualize_resources=True, max_workers=1): pathtoebook = os.path.abspath(pathtoebook) with RenderManager(max_workers) as render_manager: mi = None if serialize_metadata: from calibre.customize.ui import quick_metadata from calibre.ebooks.metadata.meta import get_metadata with lopen(pathtoebook, 'rb') as f, quick_metadata: mi = get_metadata(f, os.path.splitext(pathtoebook)[1][1:].lower()) book_fmt, opfpath, input_fmt = extract_book(pathtoebook, output_dir, log=default_log) container, bookmark_data = process_exploded_book( book_fmt, opfpath, input_fmt, output_dir, render_manager, book_hash=book_hash, save_bookmark_data=extract_annotations, book_metadata=mi, virtualize_resources=virtualize_resources ) if serialize_metadata: from calibre.ebooks.metadata.book.serialize import metadata_as_dict d = metadata_as_dict(mi) d.pop('cover_data', None) serialize_datetimes(d), serialize_datetimes(d.get('user_metadata', {})) with lopen(os.path.join(output_dir, 'calibre-book-metadata.json'), 'wb') as f: f.write(json_dumps(d)) if extract_annotations: annotations = None if bookmark_data: annotations = json_dumps(tuple(get_stored_annotations(container, bookmark_data))) if annotations: with lopen(os.path.join(output_dir, 'calibre-book-annotations.json'), 'wb') as f: f.write(annotations)
def render(pathtoebook, output_dir, book_hash=None, serialize_metadata=False, extract_annotations=False): mi = None if serialize_metadata: from calibre.ebooks.metadata.meta import get_metadata from calibre.customize.ui import quick_metadata with lopen(pathtoebook, 'rb') as f, quick_metadata: mi = get_metadata(f, os.path.splitext(pathtoebook)[1][1:].lower()) container = Container(pathtoebook, output_dir, book_hash=book_hash, save_bookmark_data=extract_annotations, book_metadata=mi) if serialize_metadata: from calibre.utils.serialize import json_dumps from calibre.ebooks.metadata.book.serialize import metadata_as_dict d = metadata_as_dict(mi) d.pop('cover_data', None) serialize_datetimes(d), serialize_datetimes(d.get('user_metadata', {})) with lopen(os.path.join(output_dir, 'calibre-book-metadata.json'), 'wb') as f: f.write(json_dumps(d)) if extract_annotations: annotations = None if container.bookmark_data: annotations = json_dumps(tuple(get_stored_annotations(container))) if annotations: with lopen( os.path.join(output_dir, 'calibre-book-annotations.json'), 'wb') as f: f.write(annotations)
def encoder(obj, for_json=False): if isinstance(obj, datetime): return encoded(0, unicode(obj.isoformat()), for_json) if isinstance(obj, (set, frozenset)): return encoded(1, tuple(obj), for_json) if getattr(obj, '__calibre_serializable__', False): from calibre.ebooks.metadata.book.base import Metadata from calibre.library.field_metadata import FieldMetadata, fm_as_dict from calibre.db.categories import Tag if isinstance(obj, Metadata): from calibre.ebooks.metadata.book.serialize import metadata_as_dict return encoded( 2, metadata_as_dict(obj, encode_cover_data=for_json), for_json ) elif isinstance(obj, FieldMetadata): return encoded(3, fm_as_dict(obj), for_json) elif isinstance(obj, Tag): return encoded(4, obj.as_dict(), for_json) raise TypeError('Cannot serialize objects of type {}'.format(type(obj)))