diff --git a/app/fetcher/_base.py b/app/fetcher/_base.py
index 2717a35..7e7e35b 100644
--- a/app/fetcher/_base.py
+++ b/app/fetcher/_base.py
@@ -38,6 +38,22 @@ class BaseFetcher:
"Content-Type": "application/json",
}
+ async def request_api(self, url: str, method: str = "GET", **kwargs) -> dict:
+ if self.is_token_expired():
+ await self.refresh_access_token()
+ header = kwargs.pop("headers", {})
+ header = self.header
+
+ async with AsyncClient() as client:
+ response = await client.request(
+ method,
+ url,
+ headers=header,
+ **kwargs,
+ )
+ response.raise_for_status()
+ return response.json()
+
def is_token_expired(self) -> bool:
return self.token_expiry <= int(time.time())
diff --git a/app/fetcher/beatmap.py b/app/fetcher/beatmap.py
index c05ad62..cf68fbe 100644
--- a/app/fetcher/beatmap.py
+++ b/app/fetcher/beatmap.py
@@ -5,8 +5,6 @@ from app.log import logger
from ._base import BaseFetcher
-from httpx import AsyncClient
-
class BeatmapFetcher(BaseFetcher):
async def get_beatmap(
@@ -21,11 +19,10 @@ class BeatmapFetcher(BaseFetcher):
logger.opt(colors=True).debug(
f"[BeatmapFetcher] get_beatmap: {params}"
)
- async with AsyncClient() as client:
- response = await client.get(
+
+ return BeatmapResp.model_validate(
+ await self.request_api(
"https://osu.ppy.sh/api/v2/beatmaps/lookup",
- headers=self.header,
params=params,
)
- response.raise_for_status()
- return BeatmapResp.model_validate(response.json())
+ )
diff --git a/app/fetcher/beatmapset.py b/app/fetcher/beatmapset.py
index 048fef0..8062825 100644
--- a/app/fetcher/beatmapset.py
+++ b/app/fetcher/beatmapset.py
@@ -5,18 +5,15 @@ from app.log import logger
from ._base import BaseFetcher
-from httpx import AsyncClient
-
class BeatmapsetFetcher(BaseFetcher):
async def get_beatmapset(self, beatmap_set_id: int) -> BeatmapsetResp:
logger.opt(colors=True).debug(
f"[BeatmapsetFetcher] get_beatmapset: {beatmap_set_id}"
)
- async with AsyncClient() as client:
- response = await client.get(
- f"https://osu.ppy.sh/api/v2/beatmapsets/{beatmap_set_id}",
- headers=self.header,
+
+ return BeatmapsetResp.model_validate(
+ await self.request_api(
+ f"https://osu.ppy.sh/api/v2/beatmapsets/{beatmap_set_id}"
)
- response.raise_for_status()
- return BeatmapsetResp.model_validate(response.json())
+ )