feat(rp5): add rp5 api
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import datetime
|
||||
import logging
|
||||
from typing import Literal
|
||||
from typing import Any, Literal
|
||||
|
||||
import aiohttp
|
||||
from playwright.async_api import async_playwright
|
||||
@@ -9,6 +10,7 @@ logger = logging.getLogger("source")
|
||||
RequestMode = Literal["base", "browser"]
|
||||
|
||||
DEFAULT_REQUEST_MODE: RequestMode = "base"
|
||||
DEFAULT_METHOD = "GET"
|
||||
|
||||
|
||||
class ApiSource:
|
||||
@@ -31,30 +33,47 @@ class ApiSource:
|
||||
self._cookies = cookies
|
||||
self._headers = headers
|
||||
|
||||
async def _base_request(self, url: str) -> str:
|
||||
async def _base_request(
|
||||
self,
|
||||
url: str,
|
||||
method: str = DEFAULT_METHOD,
|
||||
data: Any | None = None,
|
||||
) -> str:
|
||||
headers = {"User-Agent": self._user_agent, **(self._headers or {})}
|
||||
async with aiohttp.ClientSession(
|
||||
headers=headers,
|
||||
cookies=self._cookies,
|
||||
raise_for_status=True,
|
||||
) as session:
|
||||
async with session.request("GET", url, timeout=self._timeout) as response:
|
||||
async with session.request(method, url, timeout=self._timeout, data=data) as response:
|
||||
return await response.text()
|
||||
|
||||
async def _browser_request(self, url: str) -> str:
|
||||
async def _browser_request(
|
||||
self,
|
||||
url: str,
|
||||
method: str = DEFAULT_METHOD,
|
||||
data: Any | None = None,
|
||||
) -> str:
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch()
|
||||
page = await browser.new_page()
|
||||
await page.goto(url, wait_until="networkidle")
|
||||
await page.goto(url, timeout=datetime.timedelta(seconds=self._timeout), wait_until="networkidle")
|
||||
content = await page.content()
|
||||
await browser.close()
|
||||
return content
|
||||
|
||||
async def request(self, endpoint: str, /, mode: RequestMode = DEFAULT_REQUEST_MODE) -> str:
|
||||
async def request(
|
||||
self,
|
||||
endpoint: str,
|
||||
/,
|
||||
mode: RequestMode = DEFAULT_REQUEST_MODE,
|
||||
method: str = DEFAULT_METHOD,
|
||||
data: Any | None = None,
|
||||
) -> str:
|
||||
if endpoint.startswith("https:"):
|
||||
url = endpoint
|
||||
else:
|
||||
url = f"{self._base_url}/{endpoint}"
|
||||
logger.info(url)
|
||||
method = getattr(self, f"_{mode}_request")
|
||||
return await method(url)
|
||||
fun = getattr(self, f"_{mode}_request")
|
||||
return await fun(url, method, data)
|
||||
|
||||
@@ -13,6 +13,7 @@ WIND_DIRECTION_MAP: dict[str, WindDirection] = {
|
||||
"—": WindDirection.CALM,
|
||||
"": WindDirection.CALM,
|
||||
"штиль": WindDirection.CALM,
|
||||
"штл": WindDirection.CALM,
|
||||
"с": WindDirection.N,
|
||||
"св": WindDirection.NE,
|
||||
"в": WindDirection.E,
|
||||
@@ -25,4 +26,4 @@ WIND_DIRECTION_MAP: dict[str, WindDirection] = {
|
||||
|
||||
|
||||
def parse_wind_direction(value: str) -> WindDirectionDeg:
|
||||
return WindDirectionDeg.from_direction(WIND_DIRECTION_MAP[value.lower()])
|
||||
return WindDirectionDeg.from_direction(WIND_DIRECTION_MAP[value.replace("-", "").lower()])
|
||||
|
||||
@@ -27,7 +27,13 @@ def build_weather_value(date: datetime.datetime) -> WeatherValue:
|
||||
|
||||
|
||||
def _merge_values(values: list[int], mode: MergeMode) -> list[int]:
|
||||
return [max(values), min(values)] if mode == "interval" else [round(sum(values) / len(values))]
|
||||
if mode == "interval":
|
||||
if (max_value := max(values)) == (min_value := min(values)):
|
||||
return [max_value]
|
||||
else:
|
||||
return [max_value, min_value]
|
||||
else:
|
||||
return [round(sum(values) / len(values))]
|
||||
|
||||
|
||||
def merge_weather_values(
|
||||
|
||||
Reference in New Issue
Block a user