From 6f48dd4575ccc5621252d670f560ca5b7a8469de Mon Sep 17 00:00:00 2001 From: MingxuanGame Date: Sat, 4 Oct 2025 08:58:05 +0000 Subject: [PATCH] fix(sync): handle 404 errors for missing beatmaps and beatmapsets --- app/service/beatmapset_update_service.py | 37 +++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/app/service/beatmapset_update_service.py b/app/service/beatmapset_update_service.py index 555919f..da01e1f 100644 --- a/app/service/beatmapset_update_service.py +++ b/app/service/beatmapset_update_service.py @@ -15,7 +15,7 @@ from app.log import logger from app.models.beatmap import BeatmapRankStatus from app.utils import bg_tasks, utcnow -from httpx import HTTPError +from httpx import HTTPError, HTTPStatusError from sqlmodel import col, select if TYPE_CHECKING: @@ -226,6 +226,13 @@ class BeatmapsetUpdateService: try: beatmapset = await self.fetcher.get_beatmapset(record.beatmapset_id) except Exception as e: + if isinstance(e, HTTPStatusError) and e.response.status_code == 404: + logger.opt(colors=True).warning( + f"[{record.beatmapset_id}] beatmapset not found (404), removing from sync list" + ) + await session.delete(record) + await session.commit() + continue if isinstance(e, HTTPError): logger.opt(colors=True).warning( f"[{record.beatmapset_id}] " @@ -312,6 +319,17 @@ class BeatmapsetUpdateService: 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" @@ -322,6 +340,23 @@ class BeatmapsetUpdateService: 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"