mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Implement get_metadata3()
This commit is contained in:
parent
c540e26456
commit
7dabcbdf08
@ -8,7 +8,7 @@ from __future__ import (unicode_literals, division, absolute_import,
|
|||||||
from lxml import etree
|
from lxml import etree
|
||||||
|
|
||||||
from calibre.ebooks.metadata.opf2 import OPF, pretty_print
|
from calibre.ebooks.metadata.opf2 import OPF, pretty_print
|
||||||
from calibre.ebooks.metadata.opf3 import apply_metadata
|
from calibre.ebooks.metadata.opf3 import apply_metadata, read_metadata
|
||||||
from calibre.ebooks.metadata.utils import parse_opf, normalize_languages, create_manifest_item, parse_opf_version
|
from calibre.ebooks.metadata.utils import parse_opf, normalize_languages, create_manifest_item, parse_opf_version
|
||||||
from calibre.ebooks.metadata import MetaInformation
|
from calibre.ebooks.metadata import MetaInformation
|
||||||
|
|
||||||
@ -20,13 +20,19 @@ class DummyFile(object):
|
|||||||
def read(self):
|
def read(self):
|
||||||
return self.raw
|
return self.raw
|
||||||
|
|
||||||
|
def get_metadata2(root, ver):
|
||||||
|
opf = OPF(None, preparsed_opf=root, read_toc=False)
|
||||||
|
return opf.to_book_metadata(), ver, opf.raster_cover, opf.first_spine_item()
|
||||||
|
|
||||||
|
def get_metadata3(root, ver):
|
||||||
|
return read_metadata(root, ver=ver, return_extra_data=True)
|
||||||
|
|
||||||
def get_metadata(stream):
|
def get_metadata(stream):
|
||||||
if isinstance(stream, bytes):
|
if isinstance(stream, bytes):
|
||||||
stream = DummyFile(stream)
|
stream = DummyFile(stream)
|
||||||
root = parse_opf(stream)
|
root = parse_opf(stream)
|
||||||
ver = parse_opf_version(root.get('version'))
|
ver = parse_opf_version(root.get('version'))
|
||||||
opf = OPF(None, preparsed_opf=root, read_toc=False)
|
return get_metadata2(root, ver)
|
||||||
return opf.to_book_metadata(), ver, opf.raster_cover, opf.first_spine_item()
|
|
||||||
|
|
||||||
def set_metadata_opf2(root, cover_prefix, mi, opf_version,
|
def set_metadata_opf2(root, cover_prefix, mi, opf_version,
|
||||||
cover_data=None, apply_null=False, update_timestamp=False, force_identifiers=False, add_missing_cover=True):
|
cover_data=None, apply_null=False, update_timestamp=False, force_identifiers=False, add_missing_cover=True):
|
||||||
|
@ -825,7 +825,13 @@ def ensure_is_only_raster_cover(root, prefixes, refines, raster_cover_item_href)
|
|||||||
|
|
||||||
# Reading/setting Metadata objects {{{
|
# Reading/setting Metadata objects {{{
|
||||||
|
|
||||||
def read_metadata(root):
|
def first_spine_item(root, prefixes, refines):
|
||||||
|
for i in XPath('./opf:spine/opf:itemref/@idref')(root):
|
||||||
|
for item in XPath('./opf:manifest/opf:item')(root):
|
||||||
|
if item.get('id') == i:
|
||||||
|
return item.get('href') or None
|
||||||
|
|
||||||
|
def read_metadata(root, ver=None, return_extra_data=False):
|
||||||
ans = Metadata(_('Unknown'), [_('Unknown')])
|
ans = Metadata(_('Unknown'), [_('Unknown')])
|
||||||
prefixes, refines = read_prefixes(root), read_refines(root)
|
prefixes, refines = read_prefixes(root), read_refines(root)
|
||||||
identifiers = read_identifiers(root, prefixes, refines)
|
identifiers = read_identifiers(root, prefixes, refines)
|
||||||
@ -869,6 +875,8 @@ def read_metadata(root):
|
|||||||
ans.user_categories = read_user_categories(root, prefixes, refines) or ans.user_categories
|
ans.user_categories = read_user_categories(root, prefixes, refines) or ans.user_categories
|
||||||
for name, fm in (read_user_metadata(root, prefixes, refines) or {}).iteritems():
|
for name, fm in (read_user_metadata(root, prefixes, refines) or {}).iteritems():
|
||||||
ans.set_user_metadata(name, fm)
|
ans.set_user_metadata(name, fm)
|
||||||
|
if return_extra_data:
|
||||||
|
ans = ans, ver, read_raster_cover(root, prefixes, refines), first_spine_item(root, prefixes, refines)
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
def get_metadata(stream):
|
def get_metadata(stream):
|
||||||
|
@ -486,20 +486,22 @@ class TestOPF3(unittest.TestCase):
|
|||||||
"label": "date", "table":
|
"label": "date", "table":
|
||||||
"custom_column_2", "is_multiple": null,
|
"custom_column_2", "is_multiple": null,
|
||||||
"is_category": false}"/>
|
"is_category": false}"/>
|
||||||
</metadata><manifest/>
|
</metadata><manifest><item href="start.html" media-type="text/html" id="m1"/></manifest><spine><itemref idref="m1"/></spine>
|
||||||
</package>''' # }}}
|
</package>''' # }}}
|
||||||
|
|
||||||
def compare_metadata(mi2, mi3):
|
def compare_metadata(mi2, mi3):
|
||||||
self.ae(mi2.get_all_user_metadata(False), mi3.get_all_user_metadata(False))
|
self.ae(mi2.get_all_user_metadata(False), mi3.get_all_user_metadata(False))
|
||||||
for field in ALL_METADATA_FIELDS:
|
for field in ALL_METADATA_FIELDS:
|
||||||
if field != 'manifest':
|
if field not in 'manifest spine':
|
||||||
v2, v3 = getattr(mi2, field, None), getattr(mi3, field, None)
|
v2, v3 = getattr(mi2, field, None), getattr(mi3, field, None)
|
||||||
self.ae(v2, v3, '%s: %r != %r' % (field, v2, v3))
|
self.ae(v2, v3, '%s: %r != %r' % (field, v2, v3))
|
||||||
|
|
||||||
mi2 = OPF(BytesIO(raw.encode('utf-8'))).to_book_metadata()
|
mi2 = OPF(BytesIO(raw.encode('utf-8'))).to_book_metadata()
|
||||||
root = etree.fromstring(raw)
|
root = etree.fromstring(raw)
|
||||||
root.set('version', '3.0')
|
root.set('version', '3.0')
|
||||||
mi3 = read_metadata(root)
|
mi3, _, raster_cover, first_spine_item = read_metadata(root, return_extra_data=True)
|
||||||
|
self.assertIsNone(raster_cover)
|
||||||
|
self.ae('start.html', first_spine_item)
|
||||||
compare_metadata(mi2, mi3)
|
compare_metadata(mi2, mi3)
|
||||||
apply_metadata(root, mi3, force_identifiers=True)
|
apply_metadata(root, mi3, force_identifiers=True)
|
||||||
nmi = read_metadata(root)
|
nmi = read_metadata(root)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user