"""Lambda function module.""" from typing import Any from owsrequest import request from sentry_sdk import capture_exception from src import config, lambda_exceptions, status from src.constants import errors, general from src.lambda_exceptions import LoggedException, TranscodingRequestError def create_transcoding_by_preset( bucket: str, key: str, preset_alias: str, ) -> bool: """Call ows-transcoding create transcoding by preset.""" request_url = config.POST_TRANSCODING_BY_PRESET_PATH.format(preset_alias=preset_alias) payload_input: dict[str, Any] = { "bucket": bucket, "key": key, # Metadata fields are required by ows-transcoding API, set to default values "metadata": { "channels": general.DEFAULT_METADATA_CHANNELS, "codec": general.DEFAULT_METADATA_CODEC, "container": general.DEFAULT_METADATA_CONTAINER, "sample_rate": general.DEFAULT_METADATA_SAMPLE_RATE, "bit_depth": general.DEFAULT_METADATA_BIT_DEPTH, "bit_rate": general.DEFAULT_METADATA_BIT_RATE, }, } data: dict[str, Any] = {"input": payload_input} response = request.process( application=config.APPLICATION_NAME, environment=config.ENVIRONMENT, method="POST", service_name=config.OWS_TRANSCODING_SERVICE_NAME, path=request_url, json=data, ) if response.status_code != 200: error_text = errors.POST_TRANSCODING_BY_PRESET_ERROR_MESSAGE.format( status=response.status_code, text=response.text ) raise TranscodingRequestError(error_text) return True def _get_notify_params(bucket: str, key: str, exception: Exception) -> dict[str, Any]: return { "function": general.LAMBDA_NAME, "error_status": general.TRIGGER_SPATIAL_TRANSCODING_ERROR_STATUS, "error_code": errors.TRIGGER_SPATIAL_TRANSCODING_ERROR_CODE, "bucket": bucket, "filename": key, "error_params": {"message": str(exception)}, "input_params": {"key": key, "bucket": bucket}, } def handler(event: dict[str, Any], context: Any) -> dict[str, bool]: """Lambda entry point.""" bucket = event["bucket"] key = event["key"] try: create_transcoding_by_preset( bucket=bucket, key=key, preset_alias=general.PRESET_ALIAS_PASSTHROUGH, ) status.send_general_status( general.LAMBDA_NAME, general.TRIGGER_SPATIAL_TRANSCODING_COMPLETE_STATUS, key, bucket=bucket ) return {"is_encoded": True} except LoggedException: raise except Exception as exception: capture_exception(exception) lambda_exceptions.notify_and_raise(**_get_notify_params(bucket, key, exception))