From 600ee99520c324dae9a5358830d7476c943f2b76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn-Michael=20Miehe?= Date: Thu, 2 Nov 2023 12:48:52 +0000 Subject: [PATCH] favicon handling --- api/advent22_api/core/calendar_config.py | 3 +++ api/advent22_api/core/helpers.py | 22 ++++++++++++++++-- api/advent22_api/routers/admin.py | 2 ++ api/advent22_api/routers/user.py | 28 ++++++++++++++++++++--- ui/public/favicon.ico | Bin 4286 -> 38672 bytes ui/src/components/admin/ConfigView.vue | 6 ++++- ui/src/plugins/store.ts | 26 +++++++++++++++++---- 7 files changed, 76 insertions(+), 11 deletions(-) diff --git a/api/advent22_api/core/calendar_config.py b/api/advent22_api/core/calendar_config.py index 5ff844f..6760f09 100644 --- a/api/advent22_api/core/calendar_config.py +++ b/api/advent22_api/core/calendar_config.py @@ -27,6 +27,9 @@ class CalendarConfig(BaseModel): # Dateiname Hintergrundbild background: str = "adventskalender.jpg" + # Dateiname Favicon + favicon: str = "favicon.png" + # Türen für die UI doors: DoorsSaved = [] diff --git a/api/advent22_api/core/helpers.py b/api/advent22_api/core/helpers.py index 7bd3f2f..e33db43 100644 --- a/api/advent22_api/core/helpers.py +++ b/api/advent22_api/core/helpers.py @@ -114,9 +114,27 @@ async def load_image(file_name: str) -> Image.Image: return Image.open(BytesIO(await WebDAV.read_bytes(file_name))) -async def api_return_image(img: Image.Image) -> StreamingResponse: +async def api_return_ico(img: Image.Image) -> StreamingResponse: """ - Bild mit API zurückgeben + ICO-Bild mit API zurückgeben + """ + + # JPEG-Daten in Puffer speichern + img_buffer = BytesIO() + img.resize(size=(256, 256), resample=Image.LANCZOS) + img.save(img_buffer, format="ICO") + img_buffer.seek(0) + + # zurückgeben + return StreamingResponse( + media_type="image/x-icon", + content=img_buffer, + ) + + +async def api_return_jpeg(img: Image.Image) -> StreamingResponse: + """ + JPEG-Bild mit API zurückgeben """ # JPEG-Daten in Puffer speichern diff --git a/api/advent22_api/routers/admin.py b/api/advent22_api/routers/admin.py index 979f66b..31fb3da 100644 --- a/api/advent22_api/routers/admin.py +++ b/api/advent22_api/routers/admin.py @@ -44,6 +44,7 @@ class ConfigModel(BaseModel): class __Calendar(BaseModel): config_file: str background: str + favicon: str class __Font(BaseModel): file: str @@ -93,6 +94,7 @@ async def get_config_model( "calendar": { "config_file": cfg.calendar, "background": cal_cfg.background, + "favicon": cal_cfg.favicon, }, "image": cfg.image, "fonts": [ diff --git a/api/advent22_api/routers/user.py b/api/advent22_api/routers/user.py index 673c5c1..e6c19c0 100644 --- a/api/advent22_api/routers/user.py +++ b/api/advent22_api/routers/user.py @@ -7,7 +7,7 @@ from PIL import Image from ..core.calendar_config import CalendarConfig, DoorsSaved, get_calendar_config from ..core.config import Config, get_config from ..core.depends import get_all_event_dates, get_day_image -from ..core.helpers import EventDates, api_return_image, load_image +from ..core.helpers import EventDates, api_return_ico, api_return_jpeg, load_image from ._security import user_can_view_day, user_is_admin, user_visible_days router = APIRouter(prefix="/user", tags=["user"]) @@ -24,7 +24,29 @@ async def get_background_image( Hintergrundbild laden """ - return await api_return_image(await load_image(f"files/{cal_cfg.background}")) + return await api_return_jpeg(await load_image(f"files/{cal_cfg.background}")) + + +@router.get( + "/favicon", + response_class=StreamingResponse, +) +async def get_favicon( + cal_cfg: CalendarConfig = Depends(get_calendar_config), +) -> StreamingResponse: + """ + Favicon laden + """ + + try: + return await api_return_ico(await load_image(f"files/{cal_cfg.favicon}")) + + except RuntimeError: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) + + +# - favicon +# - "user-config-model" @router.get("/title") @@ -82,7 +104,7 @@ async def get_image_for_day( status.HTTP_404_NOT_FOUND, "Ich habe heute leider kein Foto für dich." ) - return await api_return_image(image) + return await api_return_jpeg(image) @router.get("/next_door") diff --git a/ui/public/favicon.ico b/ui/public/favicon.ico index df36fcfb72584e00488330b560ebcf34a41c64c2..c7ab788539357e0502d67114d87c0133af4b858f 100644 GIT binary patch literal 38672 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
ZRz#r&mY%6KdT=D_Xkx##;6ZZQo1YF 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 diff --git a/ui/src/components/admin/ConfigView.vue b/ui/src/components/admin/ConfigView.vue index 86be5bc..4468da2 100644 --- a/ui/src/components/admin/ConfigView.vue +++ b/ui/src/components/admin/ConfigView.vue @@ -79,6 +79,9 @@
Hintergrundbild
{{ config_model.calendar.background }}
+
Favicon
+
{{ admin_config_model.calendar.favicon }}
+
Türchen ({{ doors.length }} Stück)