refactor(doc): update docs static

This commit is contained in:
2026-07-01 22:48:24 +03:00
parent fcb000afb0
commit 1d13f6e05d
13 changed files with 389 additions and 314 deletions

View File

@@ -1,9 +1,17 @@
from fastapi import HTTPException, status
from gallery.easel.core import AppRequest from gallery.easel.core import AppRequest
from gallery.sketch.api import API from gallery.sketch.api import API
def api_resolver(api_type: type[API]): def api_resolver(api_type: type[API]):
def get_api(request: AppRequest, provider: str | None = None) -> API: def get_api(request: AppRequest, provider: str) -> API:
providers = request.app.state.api.get_api_providers(api_type)
if provider not in providers:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail={"provider": f"'{provider}' not in {providers}"},
)
return request.app.state.api.get_api(api_type, provider) return request.app.state.api.get_api(api_type, provider)
return get_api return get_api

View File

@@ -3,18 +3,25 @@ import datetime
from fastapi import APIRouter from fastapi import APIRouter
from gallery.easel.core import AppRequest from gallery.easel.core import AppRequest
from gallery.easel.depends.schedule import ScheduleApiDepends
from gallery.sketch.schedule.api import ScheduleApi
from gallery.sketch.schedule.model import Channel, Schedule from gallery.sketch.schedule.model import Channel, Schedule
router = APIRouter(prefix="/schedule") router = APIRouter(prefix="/schedule")
@router.get("/channels") @router.get("/providers")
async def get_api_schedule_channels(request: AppRequest) -> list[Channel]: async def get_api_weather_providers(request: AppRequest) -> list[str]:
schedule_api = request.app.state.api.schedule return request.app.state.api.get_api_providers(ScheduleApi)
return await schedule_api.get_channels()
@router.get("/{channel}/{date}") @router.get("/{provider}/channels")
async def get_api_schedule_channel_schedule(request: AppRequest, channel: str, date: datetime.date) -> Schedule: async def find_api_schedule_channels(schedule_api: ScheduleApiDepends, query: str) -> list[Channel]:
schedule_api = request.app.state.api.schedule return await schedule_api.find_channels(query)
return await schedule_api.get_channel_schedule(ChannelId(channel), date)
@router.get("/{provider}/{channel}/{date}")
async def get_api_schedule_channel_schedule(
schedule_api: ScheduleApiDepends, channel: str, date: datetime.date
) -> Schedule:
return await schedule_api.get_schedule(channel, date)

View File

@@ -4,6 +4,7 @@ from fastapi import APIRouter
from gallery.easel.core import AppRequest from gallery.easel.core import AppRequest
from gallery.easel.depends.weather import WeatherApiDepends from gallery.easel.depends.weather import WeatherApiDepends
from gallery.sketch.weather.api import WeatherApi
from gallery.sketch.weather.model import Location, WeatherResponse from gallery.sketch.weather.model import Location, WeatherResponse
router = APIRouter(prefix="/weather") router = APIRouter(prefix="/weather")
@@ -11,11 +12,11 @@ router = APIRouter(prefix="/weather")
@router.get("/providers") @router.get("/providers")
async def get_api_weather_providers(request: AppRequest) -> list[str]: async def get_api_weather_providers(request: AppRequest) -> list[str]:
return request.app.state.api.get_api_providers("weather") return request.app.state.api.get_api_providers(WeatherApi)
@router.get("/{provider}/locations") @router.get("/{provider}/locations")
async def get_api_weather_locations(weather_api: WeatherApiDepends, query: str) -> list[Location]: async def find_api_weather_locations(weather_api: WeatherApiDepends, query: str) -> list[Location]:
return await weather_api.find_locations(query) return await weather_api.find_locations(query)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -5,7 +5,7 @@ from .schedule import router as schedule_router
from .translation import set_language from .translation import set_language
from .weather import router as weather_router from .weather import router as weather_router
router = APIRouter(tags=["view"], dependencies=[Depends(set_language)]) router = APIRouter(tags=["view"], dependencies=[Depends(set_language)], include_in_schema=False)
router.include_router(root_router) router.include_router(root_router)
router.include_router(weather_router) router.include_router(weather_router)
router.include_router(schedule_router) router.include_router(schedule_router)

View File

@@ -15,7 +15,7 @@ from .filters import timedelta_format
def context_procesor(request: AppRequest) -> dict: def context_procesor(request: AppRequest) -> dict:
return { return {
"providers": request.app.state.api.get_api_providers(ScheduleApi.TYPE), "providers": request.app.state.api.get_api_providers(ScheduleApi),
} }

View File

@@ -16,7 +16,7 @@ from .filters import cloudness_icon, wind_direction_icon
def context_procesor(request: AppRequest) -> dict: def context_procesor(request: AppRequest) -> dict:
return { return {
"providers": request.app.state.api.get_api_providers(WeatherApi.TYPE), "providers": request.app.state.api.get_api_providers(WeatherApi),
} }

View File

@@ -53,7 +53,7 @@ class OpenWeatherApi(WeatherApi):
lon=item.lon, lon=item.lon,
country=item.country, country=item.country,
country_code=item.country.lower(), country_code=item.country.lower(),
district=item.state, district=item.state or "",
subdistrict="", subdistrict="",
) )
for item in result for item in result

View File

@@ -69,11 +69,11 @@ class Forecast(Model):
class Location(Model): class Location(Model):
name: str name: str
local_names: dict[str, str] | None = None
lat: float lat: float
lon: float lon: float
country: str country: str
state: str state: str | None = None
local_names: dict[str, str] | None = None
class OpenWeather: class OpenWeather:

View File

@@ -46,7 +46,10 @@ class YandexTvApi(ScheduleApi):
SOURCE = ApiSource("https://tv.yandex.ru", headers=HEADERS) SOURCE = ApiSource("https://tv.yandex.ru", headers=HEADERS)
async def find_channels(self, query: str) -> list[Channel]: async def find_channels(self, query: str) -> list[Channel]:
url = f"https://suggest-multi.yandex.ru/suggest-tv2?v=4&uil=ru&lr=10&count_channels=4&count_programs=4&sn=50&part={query}" url = (
"https://suggest-multi.yandex.ru/suggest-tv2?"
f"v=4&uil=ru&lr=10&count_channels=4&count_programs=4&sn=50&part={query}"
)
_, values = json.loads(await self.SOURCE.request(url)) _, values = json.loads(await self.SOURCE.request(url))
result = [] result = []
for _, name, content in values: for _, name, content in values:

View File

@@ -6,16 +6,16 @@ class ApiBundle:
self._values = values self._values = values
self._by_provider = {value.provider: value for value in values} self._by_provider = {value.provider: value for value in values}
def get_api_providers(self, api_type: str) -> list[str]: def get_api_providers(self, api_type: type[API]) -> list[str]:
result = [] result = []
for value in self._values: for value in self._values:
if value.type == api_type: if isinstance(value, api_type):
result.append(value.provider) result.append(value.provider)
return result return result
def get_api(self, api_type: type[API], provider: str | None = None) -> API: def get_api(self, api_type: type[API], provider: str) -> API:
for value in self._values: for value in self._values:
if isinstance(value, api_type): if isinstance(value, api_type):
if provider is None or provider == value.provider: if provider == value.provider:
return value return value
raise ValueError(api_type, provider) raise ValueError(api_type, provider)