diff --git a/routers/patch.py b/routers/patch.py index 0e8c622..df40988 100644 --- a/routers/patch.py +++ b/routers/patch.py @@ -7,7 +7,7 @@ from fastapi.responses import RedirectResponse from datetime import datetime from utils.dgp_utils import update_recent_versions -from utils.PatchMeta import PatchMeta +from utils.PatchMeta import PatchMeta, PatchMirrorMetadata from utils.authentication import verify_api_token from utils.redis_utils import redis_conn from utils.stats import record_device_id @@ -79,6 +79,8 @@ def fetch_snap_hutao_github_latest_version() -> PatchMeta: sha256sums_url = asset["browser_download_url"] if github_msix_url is None: raise ValueError("Failed to get Snap Hutao latest version from GitHub") + else: + github_mirror_metadata = PatchMirrorMetadata(mirror_name="GitHub", mirror_url=github_msix_url) # Handle checksum file if sha256sums_url: @@ -109,7 +111,8 @@ def fetch_snap_hutao_github_latest_version() -> PatchMeta: validation=sha256sums_value if sha256sums_value else None, patch_note={"cn": "", "en": "", "full": ""}, url_type="GitHub", - cache_time=datetime.now() + cache_time=datetime.now(), + mirrors={"GitHub": github_mirror_metadata} ) logger.debug(f"GitHub data fetched: {github_path_meta}") return github_path_meta @@ -144,6 +147,8 @@ def update_snap_hutao_latest_version() -> dict: archive_url = [a["direct_asset_url"] for a in jihulab_meta["assets"]["links"] if a["name"] == "artifact_archive"][0] jihulab_patch_meta.url = [jihulab_url] + jihulab_mirror_metadata = PatchMirrorMetadata(mirror_name="JiHuLAB", mirror_url=jihulab_url) + jihulab_patch_meta.add_mirror(jihulab_mirror_metadata) jihulab_patch_meta.archive_url = [archive_url] except (KeyError, IndexError) as e: gitlab_message = f"Error occurred when fetching Snap Hutao from JiHuLAB: {e}. " @@ -173,7 +178,8 @@ def update_snap_hutao_latest_version() -> dict: "cn": github_patch_meta.patch_note["cn"], "en": github_patch_meta.patch_note["en"], "full": github_patch_meta.patch_note["full"] - } + }, + "mirrors": github_patch_meta.mirrors }, "cn": { "version": jihulab_patch_meta.version, @@ -184,7 +190,8 @@ def update_snap_hutao_latest_version() -> dict: "cn": jihulab_patch_meta.patch_note["cn"], "en": jihulab_patch_meta.patch_note["en"], "full": jihulab_patch_meta.patch_note["full"] - } + }, + "mirrors": jihulab_patch_meta.mirrors }, "github_message": github_message, "gitlab_message": gitlab_message diff --git a/utils/PatchMeta.py b/utils/PatchMeta.py index f3e0abd..c3d526c 100644 --- a/utils/PatchMeta.py +++ b/utils/PatchMeta.py @@ -1,5 +1,19 @@ -from pydantic import BaseModel +from pydantic import BaseModel, Field, field_validator from datetime import datetime +from typing import Literal, Dict, TypedDict + + +class PatchMirrorMetadata(TypedDict): + mirror_name: Literal["GitHub", "JiHuLAB", "LenovoAppStore", "CodingAssets", "gh-proxy"] + mirror_url: str + + @field_validator('mirror_name', mode='before') + @staticmethod + def validate_mirror_name(value): + print(f"Validating mirror name: {value}") + if value not in ["GitHub", "JiHuLAB", "LenovoAppStore", "CodingAssets", "gh-proxy"]: + raise ValueError(f"Invalid mirror name: {value}") + return value class PatchMeta(BaseModel): @@ -10,3 +24,27 @@ class PatchMeta(BaseModel): patch_note: dict url_type: str cache_time: datetime + mirrors: Dict[str, PatchMirrorMetadata] = Field(default_factory=dict) + + @field_validator('mirrors', mode='before') + @staticmethod + def validate_mirrors(value): + if isinstance(value, dict): + for key, val in value.items(): + if not isinstance(val, dict) or 'mirror_name' not in val or 'mirror_url' not in val: + raise ValueError( + f"Each mirror must be a dict containing 'mirror_name' and 'mirror_url'. Invalid entry: {key}: {val}") + if val['mirror_name'] != key: + print(f"Mirror name in value ({val['mirror_name']}) does not match key ({key}).") + raise ValueError(f"Mirror name in value ({val['mirror_name']}) does not match key ({key}).") + else: + raise ValueError("mirrors must be a dictionary") + return value + + def add_mirror(self, mirror_metadata: PatchMirrorMetadata): + print(f"Adding mirror: {mirror_metadata}") + mirror_name = mirror_metadata['mirror_name'] + self.mirrors[mirror_name] = PatchMirrorMetadata(**mirror_metadata) + + def __repr__(self): + return f"schema.PatchMeta({self.dict()})"