From 14040951322a3709f75e00db7bc4dd54da89f4bb Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Sat, 22 Jun 2024 11:57:29 -0400 Subject: [PATCH] Ripple and gatari mirrors (#2) * add nerinyan mirror * Add ripple and gatari mirrors, shuffle mirrors before running * disable ripple * add names --- app/adapters/beatmap_mirrors/gatari.py | 23 +++++++++++++++++++ .../beatmap_mirrors/mirror_aggregate.py | 9 ++++++++ app/adapters/beatmap_mirrors/ripple.py | 23 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 app/adapters/beatmap_mirrors/gatari.py create mode 100644 app/adapters/beatmap_mirrors/ripple.py diff --git a/app/adapters/beatmap_mirrors/gatari.py b/app/adapters/beatmap_mirrors/gatari.py new file mode 100644 index 0000000..9c29757 --- /dev/null +++ b/app/adapters/beatmap_mirrors/gatari.py @@ -0,0 +1,23 @@ +import logging + +from app.adapters.beatmap_mirrors import BeatmapMirror + + +class GatariMirror(BeatmapMirror): + name = "gatari" + base_url = "https://osu.gatari.pw" + + async def fetch_beatmap_zip_data(self, beatmapset_id: int) -> bytes | None: + try: + logging.info(f"Fetching beatmapset osz2 from gatari: {beatmapset_id}") + response = await self.http_client.get( + f"{self.base_url}/d/{beatmapset_id}", + ) + response.raise_for_status() + return response.read() + except Exception: + logging.warning( + "Failed to fetch beatmap from gatari.pw", + exc_info=True, + ) + return None diff --git a/app/adapters/beatmap_mirrors/mirror_aggregate.py b/app/adapters/beatmap_mirrors/mirror_aggregate.py index f561057..bbf472c 100644 --- a/app/adapters/beatmap_mirrors/mirror_aggregate.py +++ b/app/adapters/beatmap_mirrors/mirror_aggregate.py @@ -1,16 +1,22 @@ import asyncio import logging +import random import time from app.adapters.beatmap_mirrors import BeatmapMirror +from app.adapters.beatmap_mirrors.gatari import GatariMirror from app.adapters.beatmap_mirrors.mino import MinoMirror from app.adapters.beatmap_mirrors.nerinyan import NerinyanMirror from app.adapters.beatmap_mirrors.osu_direct import OsuDirectMirror +from app.adapters.beatmap_mirrors.ripple import RippleMirror BEATMAP_MIRRORS: list[BeatmapMirror] = [ + GatariMirror(), MinoMirror(), NerinyanMirror(), OsuDirectMirror(), + # Disabled as ripple only supports ranked maps + # RippleMirror(), ] @@ -47,6 +53,9 @@ async def fetch_beatmap_zip_data(beatmapset_id: int) -> bytes | TimedOut | None: start_time = time.time() + # TODO: prioritization based on reliability, speed, etc. + random.shuffle(BEATMAP_MIRRORS) + coroutines = [ asyncio.create_task( run_with_semaphore( diff --git a/app/adapters/beatmap_mirrors/ripple.py b/app/adapters/beatmap_mirrors/ripple.py new file mode 100644 index 0000000..572aa70 --- /dev/null +++ b/app/adapters/beatmap_mirrors/ripple.py @@ -0,0 +1,23 @@ +import logging + +from app.adapters.beatmap_mirrors import BeatmapMirror + + +class RippleMirror(BeatmapMirror): + name = "ripple" + base_url = "https://storage.ripple.moe" + + async def fetch_beatmap_zip_data(self, beatmapset_id: int) -> bytes | None: + try: + logging.info(f"Fetching beatmapset osz2 from ripple: {beatmapset_id}") + response = await self.http_client.get( + f"{self.base_url}/d/{beatmapset_id}", + ) + response.raise_for_status() + return response.read() + except Exception: + logging.warning( + "Failed to fetch beatmap from ripple.moe", + exc_info=True, + ) + return None