mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
PDF Metadata: When choosing between reading metadata from the Info dict
and the XMP block, consider both the MetadataData and the ModifyDate in the XMP block, since there exist PDF metadata writing tools that update one and not the other. See #1440304 ([Enhancement] configure metadata import when importing pdf file in calibre)
This commit is contained in:
parent
1001b61f25
commit
66e12978ba
@ -199,6 +199,23 @@ def read_xmp_identifers(parent):
|
|||||||
else:
|
else:
|
||||||
yield scheme[0].text or '', value
|
yield scheme[0].text or '', value
|
||||||
|
|
||||||
|
def safe_parse_date(raw):
|
||||||
|
if raw:
|
||||||
|
try:
|
||||||
|
return parse_date(raw)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def more_recent(one, two):
|
||||||
|
if one is None:
|
||||||
|
return two
|
||||||
|
if two is None:
|
||||||
|
return one
|
||||||
|
try:
|
||||||
|
return max(one, two)
|
||||||
|
except Exception:
|
||||||
|
return one
|
||||||
|
|
||||||
def metadata_from_xmp_packet(raw_bytes):
|
def metadata_from_xmp_packet(raw_bytes):
|
||||||
root = parse_xmp_packet(raw_bytes)
|
root = parse_xmp_packet(raw_bytes)
|
||||||
mi = Metadata(_('Unknown'))
|
mi = Metadata(_('Unknown'))
|
||||||
@ -226,12 +243,11 @@ def metadata_from_xmp_packet(raw_bytes):
|
|||||||
bkp = first_simple('//xmp:CreatorTool', root)
|
bkp = first_simple('//xmp:CreatorTool', root)
|
||||||
if bkp:
|
if bkp:
|
||||||
mi.book_producer = bkp
|
mi.book_producer = bkp
|
||||||
md = first_simple('//xmp:MetadataDate', root)
|
md = safe_parse_date(first_simple('//xmp:MetadataDate', root))
|
||||||
if md:
|
mod = safe_parse_date(first_simple('//xmp:ModifyDate', root))
|
||||||
try:
|
fd = more_recent(md, mod)
|
||||||
mi.metadata_date = parse_date(md)
|
if fd is not None:
|
||||||
except:
|
mi.metadata_date = fd
|
||||||
pass
|
|
||||||
rating = first_simple('//calibre:rating', root)
|
rating = first_simple('//calibre:rating', root)
|
||||||
if rating is not None:
|
if rating is not None:
|
||||||
try:
|
try:
|
||||||
@ -311,7 +327,7 @@ def consolidate_metadata(info_mi, info):
|
|||||||
if 'ModDate' in info and hasattr(xmp_mi, 'metadata_date'):
|
if 'ModDate' in info and hasattr(xmp_mi, 'metadata_date'):
|
||||||
try:
|
try:
|
||||||
info_date = parse_date(info['ModDate'])
|
info_date = parse_date(info['ModDate'])
|
||||||
except:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
prefer_info = info_date > xmp_mi.metadata_date
|
prefer_info = info_date > xmp_mi.metadata_date
|
||||||
|
Loading…
x
Reference in New Issue
Block a user