From e64afede00cd0479afe940babd6fea9f2a7568ad Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 11 Apr 2018 19:48:54 +0530 Subject: [PATCH] Finish OPF23 --- src/calibre/ebooks/metadata/opf3.py | 4 ++- src/calibre/ebooks/metadata/opf_2_to_3.py | 36 +++++++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/metadata/opf3.py b/src/calibre/ebooks/metadata/opf3.py index cc4d2e9eec..d1bb194304 100644 --- a/src/calibre/ebooks/metadata/opf3.py +++ b/src/calibre/ebooks/metadata/opf3.py @@ -837,7 +837,7 @@ def deserialize_user_metadata(val): read_user_metadata3 = dict_reader('user_metadata', load=deserialize_user_metadata, try2=False) -def read_user_metadata2(root): +def read_user_metadata2(root, remove_tags=False): ans = {} for meta in XPath('./opf:metadata/opf:meta[starts-with(@name, "calibre:user_metadata:")]')(root): name = meta.get('name') @@ -845,6 +845,8 @@ def read_user_metadata2(root): if not name or not name.startswith('#'): continue fm = meta.get('content') + if remove_tags: + meta.getparent().remove(meta) try: fm = json.loads(fm, object_hook=from_json) decode_is_multiple(fm) diff --git a/src/calibre/ebooks/metadata/opf_2_to_3.py b/src/calibre/ebooks/metadata/opf_2_to_3.py index 17aa762c36..a98c231cfb 100644 --- a/src/calibre/ebooks/metadata/opf_2_to_3.py +++ b/src/calibre/ebooks/metadata/opf_2_to_3.py @@ -7,8 +7,9 @@ from __future__ import absolute_import, division, print_function, unicode_litera from lxml import etree from calibre.ebooks.metadata.opf3 import ( - DC, OPF, XPath, create_rating, create_series, create_timestamp, ensure_id, - parse_date, read_prefixes, read_refines, refdef, remove_element, set_refines + DC, OPF, XPath, create_rating, create_series, create_timestamp, + encode_is_multiple, ensure_id, parse_date, read_prefixes, read_refines, + read_user_metadata2, refdef, remove_element, set_refines, set_user_metadata3 ) from calibre.ebooks.metadata.utils import parse_opf, pretty_print_opf @@ -132,6 +133,35 @@ def upgrade_series(root, data): create_series(root, data.refines, series, series_index) +def upgrade_custom(root, data): + m = read_user_metadata2(root, remove_tags=True) + if m: + for fm in m.itervalues(): + encode_is_multiple(fm) + set_user_metadata3(root, data.prefixes, data.refines, m) + + +def upgrade_meta(root, data): + for meta in XPath('./opf:metadata/opf:meta[@name]')(root): + name, content = meta.get('name'), meta.get('content') or '' + if name.startswith('rendition:'): + name = name.partition(':')[-1] + prop = None + if name in ('orientation', 'layout', 'spread'): + prop = 'rendition:' + name + elif name == 'fixed-layout': + prop = 'rendition:layout' + content = {'true': 'pre-paginated'}.get(content.lower(), 'reflowable') + elif name == 'orientation-lock': + prop = 'rendition:orientation' + content = {'portrait': 'portrait', 'landscape': 'landscape'}.get(content.lower(), 'auto') + if prop: + del meta.attrib['name'] + del meta.attrib['content'] + meta.set('property', prop) + meta.text = content + + def remove_invalid_attrs_in_dc_metadata(root, data): for tag in XPath('//*[namespace-uri() = "{}"]'.format(DC('')[1:-1]))(root): for k in tuple(tag.attrib): @@ -152,6 +182,8 @@ def upgrade_metadata(root): upgrade_date(root, data) upgrade_rating(root, data) upgrade_series(root, data) + upgrade_custom(root, data) + upgrade_meta(root, data) remove_invalid_attrs_in_dc_metadata(root, data) pretty_print_opf(root)