"""asyncio-friendly python API for RNSA (https://pollens.fr).""" import asyncio import aiohttp from aiohttp.client import ClientError, ClientTimeout import json import async_timeout DEFAULT_TIMEOUT = 240 CLIENT_TIMEOUT = ClientTimeout(total=DEFAULT_TIMEOUT) BASE_URL = "https://pollens.fr/risks/thea/counties/{}" class PollensClient: """Pollens client implementation.""" def __init__(self, session: aiohttp.ClientSession = None, timeout=CLIENT_TIMEOUT): """Constructor. session: aiohttp.ClientSession or None to create a new session. """ self._county_name = None self._params = {} self._risk_level = None self._risks = {} self._timeout = timeout if session is not None: self._session = session else: self._session = aiohttp.ClientSession() async def Get(self, number): """Get data by station number.""" try: request = await self._session.get( BASE_URL.format(number), timeout=CLIENT_TIMEOUT ) if "application/json" in request.headers["content-type"]: request_json = await request.json() else: request_json = await request.text() request_json = json.loads(request_json) self._county_name = request_json["countyName"] for risk in request_json["risks"]: self._risks[risk["pollenName"]] = risk["level"] self._risk_level = request_json["riskLevel"] return request_json except (ClientError, asyncio.TimeoutError, ConnectionRefusedError) as err: return None @property def county_name(self): return self._county_name @property def risks(self): return self._risks @property def risk_level(self): return self._risk_level # async def _get(self, path, **kwargs): # with async_timeout.timeout(self._timeout): # resp = await self._session.get(path, params=dict(self._params, **kwargs)) # print(type(resp.headers["Content-Type"])) # return await resp.text(encoding="utf-8")