"""Lambda validate_audio function module.""" from typing import Any from common.connectors import s3 from common.schemas.s3_event import S3Event from common.schemas.s3_reference import S3Reference from pydantic import ValidationError from src.connectors import mediainfo from src.errors.invalid_audio_error import InvalidAudioError from src.schemas.audio_metadata import AudioMetadata from src.schemas.audio_validation_result import AudioValidationResult def handle(s3_reference: S3Reference) -> AudioValidationResult: """ The main handler function, executed by local dev as well as by Lambda function running inside Docker. Args: s3_reference: S3Reference an object containing information about the key and bucket of the s3 asset Returns: AudioValidationResult: An AudioValidationResult object containing the validation result of the audio file. """ try: result: AudioMetadata | None = mediainfo.get_media_info( s3.create_presigned_url(s3_reference) ) if result: return AudioValidationResult.model_validate( {"is_valid": True, "metadata": result.model_dump()} ) return AudioValidationResult.model_validate( {"is_valid": False, "status": "NOT_FOUND"} ) except InvalidAudioError as invalid_audio_error: return AudioValidationResult.model_validate( { "is_valid": False, "errors": invalid_audio_error.errors, } ) except ValidationError: return AudioValidationResult.model_validate( {"is_valid": False, "status": "INVALID_EVENT"} ) def handler(event: dict[str, Any], context: Any) -> dict[str, Any]: """ Lambda entry point. Args: event: Lambda event payload (should look like event.shadow.json) context: Lambda context. Raises: ValidationError: If the event JSON does not conform to the S3Event schema. """ try: s3_reference: S3Reference = S3Event(**event).to_reference() if not s3.object_exists(s3_reference): return AudioValidationResult.model_validate( {"is_valid": False, "status": "NOT_FOUND"} ).model_dump() return handle(s3_reference).model_dump() except ValidationError: return AudioValidationResult.model_validate( {"is_valid": False, "status": "INVALID_EVENT"} ).model_dump()