perf(beatmapset): optimize beatmap fetching
This commit is contained in:
@@ -5,7 +5,7 @@ import random
|
|||||||
from typing import TYPE_CHECKING, NamedTuple
|
from typing import TYPE_CHECKING, NamedTuple
|
||||||
|
|
||||||
from app.config import OldScoreProcessingMode, settings
|
from app.config import OldScoreProcessingMode, settings
|
||||||
from app.database.beatmap import Beatmap
|
from app.database.beatmap import Beatmap, BeatmapResp
|
||||||
from app.database.beatmap_sync import BeatmapSync, SavedBeatmapMeta
|
from app.database.beatmap_sync import BeatmapSync, SavedBeatmapMeta
|
||||||
from app.database.beatmapset import Beatmapset, BeatmapsetResp
|
from app.database.beatmapset import Beatmapset, BeatmapsetResp
|
||||||
from app.database.score import Score
|
from app.database.score import Score
|
||||||
@@ -128,9 +128,6 @@ class BeatmapsetUpdateService:
|
|||||||
|
|
||||||
async def add_missing_beatmapset(self, beatmapset_id: int, immediate: bool = False) -> bool:
|
async def add_missing_beatmapset(self, beatmapset_id: int, immediate: bool = False) -> bool:
|
||||||
beatmapset = await self.fetcher.get_beatmapset(beatmapset_id)
|
beatmapset = await self.fetcher.get_beatmapset(beatmapset_id)
|
||||||
status = BeatmapRankStatus(beatmapset.ranked)
|
|
||||||
if status.ranked():
|
|
||||||
return False
|
|
||||||
if immediate:
|
if immediate:
|
||||||
await self._sync_immediately(beatmapset)
|
await self._sync_immediately(beatmapset)
|
||||||
logger.debug(f"triggered immediate sync for beatmapset {beatmapset_id} ")
|
logger.debug(f"triggered immediate sync for beatmapset {beatmapset_id} ")
|
||||||
@@ -279,6 +276,7 @@ class BeatmapsetUpdateService:
|
|||||||
bg_tasks.add_task(
|
bg_tasks.add_task(
|
||||||
self._process_changed_beatmaps,
|
self._process_changed_beatmaps,
|
||||||
changed_beatmaps,
|
changed_beatmaps,
|
||||||
|
beatmapset.beatmaps,
|
||||||
)
|
)
|
||||||
bg_tasks.add_task(
|
bg_tasks.add_task(
|
||||||
self._process_changed_beatmapset,
|
self._process_changed_beatmapset,
|
||||||
@@ -319,8 +317,10 @@ class BeatmapsetUpdateService:
|
|||||||
await session.merge(new_beatmapset)
|
await session.merge(new_beatmapset)
|
||||||
await session.commit()
|
await session.commit()
|
||||||
|
|
||||||
async def _process_changed_beatmaps(self, changed: list[ChangedBeatmap]):
|
async def _process_changed_beatmaps(self, changed: list[ChangedBeatmap], beatmaps_list: list[BeatmapResp]):
|
||||||
storage_service = get_storage_service()
|
storage_service = get_storage_service()
|
||||||
|
beatmaps = {bm.id: bm for bm in beatmaps_list}
|
||||||
|
|
||||||
async with with_db() as session:
|
async with with_db() as session:
|
||||||
|
|
||||||
async def _process_update_or_delete_beatmaps(beatmap_id: int):
|
async def _process_update_or_delete_beatmaps(beatmap_id: int):
|
||||||
@@ -343,49 +343,19 @@ class BeatmapsetUpdateService:
|
|||||||
|
|
||||||
for change in changed:
|
for change in changed:
|
||||||
if change.type == BeatmapChangeType.MAP_ADDED:
|
if change.type == BeatmapChangeType.MAP_ADDED:
|
||||||
try:
|
beatmap = beatmaps.get(change.beatmap_id)
|
||||||
beatmap = await self.fetcher.get_beatmap(change.beatmap_id)
|
if not beatmap:
|
||||||
except HTTPStatusError as e:
|
logger.opt(colors=True).warning(
|
||||||
if e.response.status_code == 404:
|
f"<g>[beatmap: {change.beatmap_id}]</g> beatmap data not found in beatmapset, skipping"
|
||||||
logger.opt(colors=True).warning(
|
|
||||||
f"<g>[beatmap: {change.beatmap_id}]</g> beatmap not found (404), skipping"
|
|
||||||
)
|
|
||||||
continue
|
|
||||||
logger.opt(colors=True).error(
|
|
||||||
f"<g>[beatmap: {change.beatmap_id}]</g> failed to fetch added beatmap: "
|
|
||||||
f"[{e.__class__.__name__}] {e}, skipping"
|
|
||||||
)
|
|
||||||
continue
|
|
||||||
except Exception as e:
|
|
||||||
logger.opt(colors=True).error(
|
|
||||||
f"<g>[beatmap: {change.beatmap_id}]</g> failed to fetch added beatmap: {e}, skipping"
|
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
logger.opt(colors=True).info(f"[{beatmap.beatmapset_id}] adding beatmap {beatmap.id}")
|
logger.opt(colors=True).info(f"[{beatmap.beatmapset_id}] adding beatmap {beatmap.id}")
|
||||||
await Beatmap.from_resp_no_save(session, beatmap)
|
await Beatmap.from_resp_no_save(session, beatmap)
|
||||||
else:
|
else:
|
||||||
try:
|
beatmap = beatmaps.get(change.beatmap_id)
|
||||||
beatmap = await self.fetcher.get_beatmap(change.beatmap_id)
|
if not beatmap:
|
||||||
except HTTPStatusError as e:
|
logger.opt(colors=True).warning(
|
||||||
if e.response.status_code == 404:
|
f"<g>[beatmap: {change.beatmap_id}]</g> beatmap data not found in beatmapset, skipping"
|
||||||
if change.type == BeatmapChangeType.MAP_DELETED:
|
|
||||||
logger.opt(colors=True).info(
|
|
||||||
f"<g>[beatmap: {change.beatmap_id}]</g> beatmap not found (404), assuming deleted"
|
|
||||||
)
|
|
||||||
await _process_update_or_delete_beatmaps(change.beatmap_id)
|
|
||||||
continue
|
|
||||||
logger.opt(colors=True).warning(
|
|
||||||
f"<g>[beatmap: {change.beatmap_id}]</g> beatmap not found (404), skipping"
|
|
||||||
)
|
|
||||||
continue
|
|
||||||
logger.opt(colors=True).error(
|
|
||||||
f"<g>[beatmap: {change.beatmap_id}]</g> failed to fetch changed beatmap: "
|
|
||||||
f"[{e.__class__.__name__}] {e}, skipping"
|
|
||||||
)
|
|
||||||
continue
|
|
||||||
except Exception as e:
|
|
||||||
logger.opt(colors=True).error(
|
|
||||||
f"<g>[beatmap: {change.beatmap_id}]</g> failed to fetch changed beatmap: {e}, skipping"
|
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
logger.opt(colors=True).info(
|
logger.opt(colors=True).info(
|
||||||
|
|||||||
Reference in New Issue
Block a user