From 2616d4f8a5db5dcc736c670d61fe3874721c42e0 Mon Sep 17 00:00:00 2001 From: Alireza Jafari Date: Wed, 23 Oct 2024 01:32:29 +0330 Subject: [PATCH] feat(schemas): Media paths --- api/micro_media/media/context.py | 17 +++++++++++++++- api/micro_media/schemas/v1/media.py | 31 ++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/api/micro_media/media/context.py b/api/micro_media/media/context.py index bda5a15..458425e 100644 --- a/api/micro_media/media/context.py +++ b/api/micro_media/media/context.py @@ -1,4 +1,4 @@ -from typing import Literal, Self, Type +from typing import Literal, Self, Type, overload import yaml @@ -46,6 +46,21 @@ def from_yaml_file(cls, config_path: str) -> Self: config=MediaConfig.model_validate(yaml.safe_load(config_file)) ) + @overload + def get_manager( + self, media_type: Literal["image"] + ) -> ImageMediaManager: ... + + @overload + def get_manager( + self, media_type: Literal["video"] + ) -> BaseMediaManager: ... + + @overload + def get_manager( + self, media_type: Literal["document"] + ) -> BaseMediaManager: ... + def get_manager(self, media_type: MediaType) -> BaseMediaManager: """ Returns the media_type's manager. diff --git a/api/micro_media/schemas/v1/media.py b/api/micro_media/schemas/v1/media.py index 8d7cd2b..e8c4269 100644 --- a/api/micro_media/schemas/v1/media.py +++ b/api/micro_media/schemas/v1/media.py @@ -1,8 +1,13 @@ from enum import Enum -from typing import Annotated +from typing import Annotated, Literal + from uuid import UUID +from pydantic import Field, computed_field, create_model from fastapi import File, Form, UploadFile + +from micro_media.media.manager import ImageMediaManager from micro_media.utils import APIModel +from micro_media.media import MEDIA_CONTEXT as MC class MediaType(str, Enum): @@ -38,5 +43,29 @@ def as_form( ) +THUMBNAIL_SIZES = MC.get_manager("image").get_thumbnail_sizes() + +ThumbnailSizesModel = create_model( + "ThumbnailSizesModel", + **{size: (str, Field(...)) for size in THUMBNAIL_SIZES}, +) + + class MediaRead(MediaBase): id: UUID + + @computed_field + def original_path(self) -> str: + return f"/v1/public/media/original/{self.id}" + + @computed_field + def thumbnail_paths(self) -> ThumbnailSizesModel | None: + if self.media_type != MediaType.IMAGE: + return None + + return ThumbnailSizesModel.model_validate( + { + size: f"/v1/public/media/thumbnail/{self.id}?size={size}" + for size in THUMBNAIL_SIZES + } + )