Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)))