From 64e221c6417b53c2212b2c4dfe50a3108b6247f3 Mon Sep 17 00:00:00 2001 From: MingxuanGame Date: Tue, 7 Oct 2025 15:27:06 +0000 Subject: [PATCH] perf(beatmapset): optimize beatmap fetching --- app/service/beatmapset_update_service.py | 56 ++++++------------------ 1 file changed, 13 insertions(+), 43 deletions(-) diff --git a/app/service/beatmapset_update_service.py b/app/service/beatmapset_update_service.py index 19af886..e36eedb 100644 --- a/app/service/beatmapset_update_service.py +++ b/app/service/beatmapset_update_service.py @@ -5,7 +5,7 @@ import random from typing import TYPE_CHECKING, NamedTuple 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.beatmapset import Beatmapset, BeatmapsetResp 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: beatmapset = await self.fetcher.get_beatmapset(beatmapset_id) - status = BeatmapRankStatus(beatmapset.ranked) - if status.ranked(): - return False if immediate: await self._sync_immediately(beatmapset) logger.debug(f"triggered immediate sync for beatmapset {beatmapset_id} ") @@ -279,6 +276,7 @@ class BeatmapsetUpdateService: bg_tasks.add_task( self._process_changed_beatmaps, changed_beatmaps, + beatmapset.beatmaps, ) bg_tasks.add_task( self._process_changed_beatmapset, @@ -319,8 +317,10 @@ class BeatmapsetUpdateService: await session.merge(new_beatmapset) 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() + beatmaps = {bm.id: bm for bm in beatmaps_list} + async with with_db() as session: async def _process_update_or_delete_beatmaps(beatmap_id: int): @@ -343,49 +343,19 @@ class BeatmapsetUpdateService: for change in changed: if change.type == BeatmapChangeType.MAP_ADDED: - try: - beatmap = await self.fetcher.get_beatmap(change.beatmap_id) - except HTTPStatusError as e: - if e.response.status_code == 404: - logger.opt(colors=True).warning( - f"[beatmap: {change.beatmap_id}] beatmap not found (404), skipping" - ) - continue - logger.opt(colors=True).error( - f"[beatmap: {change.beatmap_id}] failed to fetch added beatmap: " - f"[{e.__class__.__name__}] {e}, skipping" - ) - continue - except Exception as e: - logger.opt(colors=True).error( - f"[beatmap: {change.beatmap_id}] failed to fetch added beatmap: {e}, skipping" + beatmap = beatmaps.get(change.beatmap_id) + if not beatmap: + logger.opt(colors=True).warning( + f"[beatmap: {change.beatmap_id}] beatmap data not found in beatmapset, skipping" ) continue logger.opt(colors=True).info(f"[{beatmap.beatmapset_id}] adding beatmap {beatmap.id}") await Beatmap.from_resp_no_save(session, beatmap) else: - try: - beatmap = await self.fetcher.get_beatmap(change.beatmap_id) - except HTTPStatusError as e: - if e.response.status_code == 404: - if change.type == BeatmapChangeType.MAP_DELETED: - logger.opt(colors=True).info( - f"[beatmap: {change.beatmap_id}] beatmap not found (404), assuming deleted" - ) - await _process_update_or_delete_beatmaps(change.beatmap_id) - continue - logger.opt(colors=True).warning( - f"[beatmap: {change.beatmap_id}] beatmap not found (404), skipping" - ) - continue - logger.opt(colors=True).error( - f"[beatmap: {change.beatmap_id}] failed to fetch changed beatmap: " - f"[{e.__class__.__name__}] {e}, skipping" - ) - continue - except Exception as e: - logger.opt(colors=True).error( - f"[beatmap: {change.beatmap_id}] failed to fetch changed beatmap: {e}, skipping" + beatmap = beatmaps.get(change.beatmap_id) + if not beatmap: + logger.opt(colors=True).warning( + f"[beatmap: {change.beatmap_id}] beatmap data not found in beatmapset, skipping" ) continue logger.opt(colors=True).info(