diff --git a/src/calibre/ebooks/metadata/opf3.py b/src/calibre/ebooks/metadata/opf3.py index 66a245f4af..963f30db0a 100644 --- a/src/calibre/ebooks/metadata/opf3.py +++ b/src/calibre/ebooks/metadata/opf3.py @@ -575,6 +575,14 @@ def read_timestamp(root, prefixes, refines): continue +def create_timestamp(m, val): + if not is_date_undefined(val): + val = isoformat(val) + d = m.makeelement(OPF('meta'), attrib={'property':'calibre:timestamp', 'scheme':'dcterms:W3CDTF'}) + d.text = val + m.append(d) + + def set_timestamp(root, prefixes, refines, val): ensure_prefix(root, prefixes, 'calibre', CALIBRE_PREFIX) ensure_prefix(root, prefixes, 'dcterms') @@ -583,12 +591,7 @@ def set_timestamp(root, prefixes, refines, val): prop = expand_prefix(meta.get('property'), prefixes) if prop.lower() == pq or meta.get('name') == 'calibre:timestamp': remove_element(meta, refines) - if not is_date_undefined(val): - val = isoformat(val) - m = XPath('./opf:metadata')(root)[0] - d = m.makeelement(OPF('meta'), attrib={'property':'calibre:timestamp', 'scheme':'dcterms:W3CDTF'}) - d.text = val - m.append(d) + create_timestamp(XPath('./opf:metadata')(root)[0], val) def read_last_modified(root, prefixes, refines): diff --git a/src/calibre/ebooks/metadata/opf_2_to_3.py b/src/calibre/ebooks/metadata/opf_2_to_3.py index ca89f0d815..3a48021199 100644 --- a/src/calibre/ebooks/metadata/opf_2_to_3.py +++ b/src/calibre/ebooks/metadata/opf_2_to_3.py @@ -7,8 +7,8 @@ from __future__ import absolute_import, division, print_function, unicode_litera from lxml import etree from calibre.ebooks.metadata.opf3 import ( - DC, OPF, XPath, ensure_id, read_prefixes, read_refines, refdef, remove_element, - set_refines + DC, OPF, XPath, create_timestamp, ensure_id, parse_date, read_prefixes, + read_refines, refdef, remove_element, set_refines ) from calibre.ebooks.metadata.utils import parse_opf, pretty_print_opf @@ -85,6 +85,31 @@ def upgrade_authors(root, data): metadata.append(m) +def upgrade_timestamp(root, data): + for meta in XPath('./opf:metadata/opf:meta[@name="calibre:timestamp"]')(root): + m = meta.getparent() + remove_element(meta, data.refines) + val = meta.get('content') + if val: + try: + val = parse_date(val, is_w3cdtf=True) + except Exception: + pass + else: + create_timestamp(m, val) + + +def upgrade_date(root, data): + found = False + for date in XPath('./opf:metadata/dc:date')(root): + val = date.text + if val: + found = True + continue + if not val or found: # only one dc:date allowed + remove_element(date, data.refines) + + def upgrade_metadata(root): data = Data() data.prefixes = read_prefixes(root) @@ -94,6 +119,8 @@ def upgrade_metadata(root): upgrade_title(root, data) upgrade_languages(root, data) upgrade_authors(root, data) + upgrade_timestamp(root, data) + upgrade_date(root, data) pretty_print_opf(root)