from pathlib import Path import os import markdown from litestar import ( Controller, get, post, MediaType, Litestar, ) from litestar.enums import RequestEncodingType from litestar.datastructures import UploadFile from litestar.params import Body from litestar.exceptions import HTTPException from litestar.contrib.jinja import JinjaTemplateEngine from litestar.template.config import TemplateConfig from litestar.response import Template from litestar.static_files import create_static_files_router from server.services.descriptions import CharactersService, Breed, CharactersRepository from server.services.recognizer import RecognizerService, RecognizerRepository os.environ["CUDA_VISIBLE_DEVICES"] = "-1" recognizer_service = RecognizerService(RecognizerRepository()) characters_service = CharactersService(CharactersRepository()) class BreedsController(Controller): path = "/beerds" @post("/dogs") async def beerds_dogs( self, data: UploadFile = Body(media_type=RequestEncodingType.MULTI_PART) ) -> dict: body = await data.read() return await recognizer_service.predict_dog_image(body) @post("/cats") async def beerds_cats( self, data: UploadFile = Body(media_type=RequestEncodingType.MULTI_PART) ) -> dict: body = await data.read() return await recognizer_service.predict_cat_image(body) class DescriptionController(Controller): path = "/" @get("/") async def dogs(self) -> Template: return Template(template_name="dogs.html") @get("/cats") async def cats(self) -> Template: return Template(template_name="cats.html") @get("/contacts") async def contacts(self) -> Template: return Template(template_name="contacts.html") @get("/donate") async def donate(self) -> Template: return Template(template_name="donate.html") @get("/dogs-characteristics") async def dogs_characteristics(self) -> Template: breeds = await characters_service.get_characters() return Template( template_name="dogs-characteristics.html", context={"breeds": breeds} ) @get("/dogs-characteristics/{name:str}") async def beer_description(self, name: str) -> Template: breed = await characters_service.get_character(name) if breed is None: raise HTTPException(status_code=404, detail="Порода не найдена") images = await recognizer_service.images_dogs() return Template( template_name="beers-description.html", context={ "text": markdown.markdown(breed.description), "title": breed.name, "images": [f"/static/assets/dog/{name}/{i}" for i in images[name]], }, ) @get("/sitemap.xml", media_type=MediaType.XML) async def sitemaps(self) -> bytes: breeds: list[Breed] = await characters_service.get_characters() lastmod = "2025-10-04T19:01:03+00:00" beers_url = "" for b in breeds: beers_url += f""" https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/dogs-characteristics/{b.alias} {lastmod} """ return f""" https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/ {lastmod} https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/cats {lastmod} https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/donate {lastmod} https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/dogs-characteristics {lastmod} {beers_url} """.encode() @get("/robots.txt", media_type=MediaType.TEXT) async def robots(self) -> str: return """ User-agent: * Allow: / Sitemap: https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/sitemap.xml """ app = Litestar( debug=True, route_handlers=[ BreedsController, DescriptionController, create_static_files_router(path="/static", directories=["server/static"]), ], template_config=TemplateConfig( directory=Path("server/templates"), engine=JinjaTemplateEngine, ), )