Source code for tds2stac.extensions.extra_metadata

import json
import sys
from datetime import datetime

import pystac
import pytz

from ..logger import Logger

# SPDX-FileCopyrightText: 2023 Karlsruher Institut für Technologie
#
# SPDX-License-Identifier: CC0-1.0
from ..statics import constants


[docs] class ExtraMetadata: """ A class to add extra metadata to the STAC items and collections. Args: logger_properties (dict): A dictionary containing the logger properties. """ def __init__(self, logger_properties: dict = dict()): self.logger_properties = logger_properties
[docs] def item( self, item: pystac.Item, extra_metadata: dict = dict(), harvesting_vars: dict = dict(), ): """ Add extra metadata to the STAC item. """ try: start_datetime = datetime.strptime( harvesting_vars["temporal_extent_start_datetime"], "%Y-%m-%dT%H:%M:%S.%fZ", ).replace(tzinfo=pytz.utc) except ValueError: start_datetime = datetime.strptime( harvesting_vars["temporal_extent_start_datetime"], "%Y-%m-%dT%H:%M:%SZ", ).replace(tzinfo=pytz.utc) try: end_datetime = datetime.strptime( harvesting_vars["temporal_extent_end_datetime"], "%Y-%m-%dT%H:%M:%S.%fZ", ).replace(tzinfo=pytz.utc) except ValueError: end_datetime = datetime.strptime( harvesting_vars["temporal_extent_end_datetime"], "%Y-%m-%dT%H:%M:%SZ", ).replace(tzinfo=pytz.utc) if extra_metadata.get("extra_metadata_file") is not None: extra_metadata_json = self.open_json_file( str(extra_metadata.get("extra_metadata_file")) ) if ( extra_metadata_json != {} and extra_metadata_json.get("item") is not None ): for key, value in extra_metadata_json["item"].items(): if key == "properties": item.properties.update(value) if key == "extra_fields": item.extra_fields.update(value) if key == "providers": item.common_metadata.providers = value if key == "license": item.common_metadata.license = value if key == "constellation": item.common_metadata.constellation = value if key == "platform": item.common_metadata.platform = value if key == "instruments": item.common_metadata.instruments = value if key == "gsd": item.common_metadata.gsd = value if key == "providers": item.common_metadata.providers = value if key == "title": item.common_metadata.title = value if key == "description": item.common_metadata.description = value if key == "start_datetime": item.common_metadata.start_datetime = start_datetime if key == "end_datetime": item.common_metadata.end_datetime = end_datetime if key == "updated": item.common_metadata.updated = end_datetime if key == "created": item.common_metadata.created = start_datetime else: self.logger_properties["logger_level"] = "WARNING" self.logger_properties[ "logger_msg" ] = "The `extra_metadata_file` is empty. So, the default extra metadata won't be added to the STAC item." Logger(self.logger_properties) else: self.logger_properties["logger_level"] = "WARNING" self.logger_properties[ "logger_msg" ] = "The `extra_metadata_file` is not provided. So, the default extra metadata will be added to the STAC item." Logger(self.logger_properties) extra_metadata[ "extra_metadata_file" ] = constants.default_extra_metadata_file extra_metadata_json = self.open_json_file( str(extra_metadata.get("extra_metadata_file")) ) if ( extra_metadata_json != {} and extra_metadata_json.get("item") is not None ): for key, value in extra_metadata_json["item"].items(): if key == "properties": item.properties.update(value) if key == "extra_fields": item.extra_fields.update(value) if key == "providers": item.common_metadata.providers = value if key == "license": item.common_metadata.license = value if key == "constellation": item.common_metadata.constellation = value if key == "platform": item.common_metadata.platform = value if key == "instruments": item.common_metadata.instruments = value if key == "gsd": item.common_metadata.gsd = value if key == "providers": item.common_metadata.providers = value if key == "title": item.common_metadata.title = value if key == "description": item.common_metadata.description = value if key == "start_datetime": item.common_metadata.start_datetime = start_datetime if key == "end_datetime": item.common_metadata.end_datetime = end_datetime if key == "updated": item.common_metadata.updated = end_datetime if key == "created": item.common_metadata.created = start_datetime else: self.logger_properties["logger_level"] = "WARNING" self.logger_properties[ "logger_msg" ] = "The default `extra_metadata_file` is empty. So, the default extra metadata won't be added to the STAC item." Logger(self.logger_properties)
[docs] def collection( self, collection: pystac.Collection, extra_metadata: dict = dict() ): """ Add extra metadata to the STAC collection. """ if extra_metadata.get("extra_metadata_file") is not None: extra_metadata_json = self.open_json_file( str(extra_metadata.get("extra_metadata_file")) ) if ( extra_metadata_json != {} and extra_metadata_json.get("collection") is not None ): for key, value in extra_metadata_json["collection"].items(): if key == "extra_fields": collection.extra_fields.update(value) if key == "keywords": collection.keywords = value if key == "providers": collection.providers = value if key == "license": collection.license = value else: self.logger_properties["logger_level"] = "WARNING" self.logger_properties[ "logger_msg" ] = "The `extra_metadata_file` is empty. So, the default extra metadata won't be added to the STAC collection." Logger(self.logger_properties) else: self.logger_properties["logger_level"] = "WARNING" self.logger_properties[ "logger_msg" ] = "The `extra_metadata_file` is not provided. So, the default extra metadata will be added to the STAC collection." Logger(self.logger_properties) extra_metadata[ "extra_metadata_file" ] = constants.default_extra_metadata_file extra_metadata_json = self.open_json_file( str(extra_metadata.get("extra_metadata_file")) ) if ( extra_metadata_json != {} and extra_metadata_json.get("collection") is not None ): for key, value in extra_metadata_json["collection"].items(): if key == "extra_fields": collection.extra_fields.update(value) if key == "keywords": collection.keywords = value if key == "providers": collection.providers = value if key == "license": collection.license = value else: self.logger_properties["logger_level"] = "WARNING" self.logger_properties[ "logger_msg" ] = "The default `extra_metadata_file` is empty. So, the default extra metadata won't be added to the STAC collection." Logger(self.logger_properties)
[docs] def open_json_file(self, file_path: str) -> dict: """ Open the JSON file. """ try: loaded_json = json.load(open(file_path)) return loaded_json except Exception: ex_type, ex_value, ex_traceback = sys.exc_info() self.logger_properties["logger_level"] = "ERROR" if ex_type is not None and ex_value is not None: self.logger_properties[ "logger_msg" ] = f"Could not open {file_path}. %s: %s" % ( ex_type.__name__, ex_value, ) else: self.logger_properties[ "logger_msg" ] = f"Could not open {file_path}." Logger(self.logger_properties) return {}