Source code for yael.metadata
#!/usr/bin/env python
# coding=utf-8
"""
The `META-INF/metadata.xml` file, holding
the publication-wise metadata
(EPUB 3).
"""
from yael.element import Element
from yael.namespace import Namespace
import yael.util
__author__ = "Alberto Pettarin"
__copyright__ = "Copyright 2015, Alberto Pettarin (www.albertopettarin.it)"
__license__ = "MIT"
__version__ = "0.0.6"
__email__ = "alberto@albertopettarin.it"
__status__ = "Development"
[docs]class Metadata(Element):
"""
Build the `META-INF/metadata.xml` file or
parse it from `obj` or `string`.
"""
A_ID = "id"
A_PROPERTY = "property"
A_UNIQUE_IDENTIFIER = "unique-identifier"
E_IDENTIFIER = "identifier"
E_META = "meta"
E_METADATA = "metadata"
V_DCTERMS_MODIFIED = "dcterms:modified"
def __init__(self, internal_path=None, obj=None, string=None):
self.v_dcterms_modified = None
self.v_unique_identifier = None
Element.__init__(
self,
internal_path=internal_path,
obj=obj,
string=string)
def json_object(self, recursive=True):
obj = {
"internal_path": self.internal_path,
"unique_identifier": self.v_unique_identifier,
"dcterms_modified": self.v_dcterms_modified,
"release_dentifier": self.v_release_identifier
}
return obj
def parse_object(self, obj):
try:
# locate `<container>` element
metadata_arr = yael.util.query_xpath(
obj=obj,
query="/{0}:{1}",
args=['m', Metadata.E_METADATA],
nsp={'m': Namespace.METADATA},
required=Metadata.E_METADATA)
metadata = metadata_arr[0]
# get unique-identifier id
u_i_id = metadata.get(Metadata.A_UNIQUE_IDENTIFIER)
# locate `<rootfile>` elements
identifier_arr = yael.util.query_xpath(
obj=metadata,
query="{0}:{1}",
args=['d', Metadata.E_IDENTIFIER],
nsp={'d': Namespace.DC},
required=None)
for identifier in identifier_arr:
i_id = identifier.get(Metadata.A_ID)
if i_id == u_i_id:
self.v_unique_identifier = yael.util.safe_strip(
identifier.text)
# locate `<link>` optional element
meta_arr = yael.util.query_xpath(
obj=metadata,
query="{0}:{1}",
args=['m', Metadata.E_META],
nsp={'m': Namespace.METADATA},
required=None)
for meta in meta_arr:
prop = meta.get(Metadata.A_PROPERTY)
if prop == Metadata.V_DCTERMS_MODIFIED:
self.v_dcterms_modified = yael.util.safe_strip(meta.text)
except:
raise Exception("Error while parsing the given object")
@property
def v_dcterms_modified(self):
"""
The dcterms:modified value.
:rtype: str
"""
return self.__v_dcterms_modified
@v_dcterms_modified.setter
def v_dcterms_modified(self, v_dcterms_modified):
self.__v_dcterms_modified = v_dcterms_modified
@property
def v_unique_identifier(self):
"""
The unique-identifier attribute.
:rtype: str
"""
return self.__v_unique_identifier
@v_unique_identifier.setter
def v_unique_identifier(self, v_unique_identifier):
self.__v_unique_identifier = v_unique_identifier
@property
def v_release_identifier(self):
"""
The Release Identifier, that is,
the concatenation of the Unique Identifier
and the dcterms:modified date.
:rtype: str
"""
if self.v_dcterms_modified != None:
return "%s@%s" % (
self.v_unique_identifier,
self.v_dcterms_modified)
return self.v_unique_identifier