From 63fe1d017e2fad8181e3ff47185b974304957d56 Mon Sep 17 00:00:00 2001 From: Matthias Baumgartner Date: Wed, 5 Apr 2023 17:16:14 +0200 Subject: IPTC tag extraction --- bsie/extractor/image/iptc.py | 70 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 bsie/extractor/image/iptc.py (limited to 'bsie/extractor') diff --git a/bsie/extractor/image/iptc.py b/bsie/extractor/image/iptc.py new file mode 100644 index 0000000..195eff7 --- /dev/null +++ b/bsie/extractor/image/iptc.py @@ -0,0 +1,70 @@ + +# standard imports +import typing + +# bsie imports +from bsie.utils import bsfs, node, ns + +# inner-module imports +from .. import base + +# exports +__all__: typing.Sequence[str] = ( + 'Iptc', + ) + + +## code ## + +class Iptc(base.Extractor): + """Turn IPTC keywords into tags.""" + + CONTENT_READER = 'bsie.reader.exif.Iptc' + + def __init__(self): + super().__init__(bsfs.schema.from_string(base.SCHEMA_PREAMBLE + ''' + bsn:Tag rdfs:subClassOf bsfs:Node . + + bse:tag rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Entity ; + rdfs:range bsn:Tag . + + rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Tag ; + rdfs:range xsd:string ; + bsfs:unique "true"^^xsd:boolean . + + ''')) + self._callmap = { + self.schema.predicate(ns.bse.tag): self._keywords, + } + + def extract( + self, + subject: node.Node, + content: dict, + principals: typing.Iterable[bsfs.schema.Predicate], + ) -> typing.Iterator[typing.Tuple[node.Node, bsfs.schema.Predicate, typing.Any]]: + for pred in principals: + # find callback + clbk = self._callmap.get(pred) + if clbk is None: + continue + # produce triples + yield from clbk(subject, content) + + def _keywords( + self, + subject: node.Node, + content: dict, + ) -> typing.Iterator[typing.Tuple[node.Node, bsfs.schema.Predicate, typing.Any]]: + if 'Iptc.Application2.Keywords' not in content: + return + for keyword in content['Iptc.Application2.Keywords']: + tag = node.Node(ns.bsn.Tag, label=keyword) + yield subject, self.schema.predicate(ns.bse.tag), tag + yield tag, self.schema.predicate(ns.bst.label), keyword + + + +## EOF ## -- cgit v1.2.3 From ef50c1895c810d7a03bc139587a345273701cdbe Mon Sep 17 00:00:00 2001 From: Matthias Baumgartner Date: Wed, 5 Apr 2023 17:18:02 +0200 Subject: minor fixes --- bsie/extractor/builder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'bsie/extractor') diff --git a/bsie/extractor/builder.py b/bsie/extractor/builder.py index d691b0e..8353a93 100644 --- a/bsie/extractor/builder.py +++ b/bsie/extractor/builder.py @@ -67,6 +67,7 @@ class ExtractorBuilder(): return cls(**kwargs) except Exception as err: - raise errors.BuilderError(f'failed to build extractor {name} due to {bsfs.typename(err)}: {err}') from err + raise errors.BuilderError( + f'failed to build extractor {name} due to {bsfs.typename(err)}: {err}') from err ## EOF ## -- cgit v1.2.3