import logging from src.asset_upload.models import AssetUploadValidationRequest from src.atmos.mediainfo_check import ( AssetFetchError, MediainfoCrashError, MediainfoError, MediainfoOutputError, MediainfoUnavailable, ) from src.atmos.render_errors import ( FfmpegError, FfmpegUnavailable, LoudnormOutputError, RenderOutputError, RenderWorkerError, ) from src.clients.ows_assets import OwsAssetsError, OwsAssetsNotFound from src.config import AssetUploadType, get_settings from src.worker import SubprocessCrashError, Worker class UnsupportedAssetUploadType(Exception): pass def _select_subprocess_module(asset_upload_validation_request: AssetUploadValidationRequest) -> str: match asset_upload_validation_request.asset_upload_type: case AssetUploadType.ATMOS: return "src.atmos.validator" case _: raise UnsupportedAssetUploadType( f"unsupported asset_upload_type: {asset_upload_validation_request.asset_upload_type}" ) def make_worker() -> Worker[AssetUploadValidationRequest]: settings = get_settings() return Worker( request_schema=AssetUploadValidationRequest, select_subprocess_module=_select_subprocess_module, sqs_queue_url=settings.SQS_QUEUE_URL, heartbeat_interval_seconds=settings.HEARTBEAT_INTERVAL_SECONDS, message_processing_timeout_minutes=settings.MESSAGE_PROCESSING_TIMEOUT_MINUTES, exception_levels={ # mediainfo subprocess failures AssetFetchError: logging.WARNING, MediainfoCrashError: logging.WARNING, MediainfoUnavailable: logging.WARNING, MediainfoError: logging.ERROR, MediainfoOutputError: logging.ERROR, # render (loudness/true-peak) subprocess failures FfmpegUnavailable: logging.WARNING, FfmpegError: logging.ERROR, LoudnormOutputError: logging.ERROR, RenderWorkerError: logging.WARNING, RenderOutputError: logging.ERROR, # consumer dispatcher UnsupportedAssetUploadType: logging.ERROR, # ows-assets api failures OwsAssetsError: logging.ERROR, OwsAssetsNotFound: logging.WARNING, # worker framework SubprocessCrashError: logging.WARNING, }, ) def main() -> None: logging.basicConfig(level=get_settings().LOG_LEVEL) make_worker().run() if __name__ == "__main__": main()