from __future__ import annotations import logging from typing import TYPE_CHECKING import boto3 if TYPE_CHECKING: from mypy_boto3_s3 import S3Client as _S3Client logger = logging.getLogger(__name__) class S3Client: def __init__( self, *, region_name: str, bucket: str, session: boto3.Session | None = None, ): self.region_name = region_name self.bucket = bucket self._session = session self._client: _S3Client | None = None @property def session(self) -> boto3.Session: if self._session is None: self._session = boto3.Session() return self._session @property def client(self) -> _S3Client: if self._client is None: self._client = self.session.client("s3", region_name=self.region_name) # type: ignore return self._client # type: ignore def upload_file(self, local_file_path: str, key: str) -> None: extra_args = {"ContentType": "video/mp4"} self.client.upload_file(local_file_path, self.bucket, key, extra_args)