Code some ui and fix parse library will throw exception sometimes.

This commit is contained in:
wei
2026-07-23 00:47:44 +08:00
parent 77c22f5efe
commit 8d850408cd
11 changed files with 745 additions and 28 deletions
+155
View File
@@ -0,0 +1,155 @@
import json
import logging
import requests
from core_lib.common.exception import VersionManifestFetchException, VersionDataKeyNotFoundException, \
VersionManifestException
logger = logging.getLogger("Launcher.CoreLib")
FABRIC_META_VERSION_ENDPOINT_V2 = "https://meta.fabricmc.net/v2/versions"
FABRIC_META_LOADER_VERSION_ENDPOINT_V2 = "https://meta.fabricmc.net/v1/versions/loader/{}/"
FABRIC_META_LOADER_MANIFEST_ENDPOINT_V2 = "https://meta.fabricmc.net//v2/versions/loader/{}/{}/profile/json"
FABRIC_MAVEN_URL = "https://maven.fabricmc.net/"
def fetch_fabric_version_list(version_manifest_url: str=FABRIC_META_VERSION_ENDPOINT_V2, timeout: int=5) -> list[dict]:
try:
r = requests.get(version_manifest_url, timeout=timeout)
except requests.exceptions.Timeout:
raise VersionManifestFetchException(
"Timeout while fetch from {}".format(version_manifest_url)
)
except requests.exceptions.ConnectionError as e:
raise VersionManifestFetchException(
"Connection error while fetch from {}: {}".format(version_manifest_url, e)
)
except requests.exceptions.HTTPError as e:
raise VersionManifestFetchException(
"HTTP error while fetch from {}: HTTP Status: {}".format(version_manifest_url, e.response.status_code)
)
except Exception as e:
raise VersionManifestFetchException(
"Unknown error while fetch from {}: {}".format(version_manifest_url, e)
)
try:
data = r.json()
except json.decoder.JSONDecodeError as e:
raise VersionManifestFetchException(
"JSON decode error while fetch from {}: {}".format(version_manifest_url, e)
)
versions = data.get("versions")
if not versions:
raise VersionManifestFetchException(
"Version this is empty or not set yet in mod version manifest"
)
return versions
def is_version_supported_and_stable(fabric_version_list: list[dict], target_version: str) -> tuple[bool, bool | None]:
if not fabric_version_list:
raise VersionManifestException(
"Provided fabric version list is empty."
)
for version in fabric_version_list:
if version["version"] == target_version:
is_stable = version.get("stable", None)
return True, is_stable
return False, None
def get_version_support_loader_list(target_version: str, loader_version_url: str=FABRIC_META_LOADER_VERSION_ENDPOINT_V2, timeout: int=5)\
-> list[dict]:
try:
r = requests.get(loader_version_url.format(target_version), timeout=timeout)
except requests.exceptions.Timeout:
raise VersionManifestFetchException(
"Timeout while fetch from {}".format(loader_version_url)
)
except requests.exceptions.ConnectionError as e:
raise VersionManifestFetchException(
"Connection error while fetch from {}: {}".format(loader_version_url, e)
)
except requests.exceptions.HTTPError as e:
raise VersionManifestFetchException(
"HTTP error while fetch from {}: HTTP Status: {}".format(loader_version_url, e.response.status_code)
)
except Exception as e:
raise VersionManifestFetchException(
"Unknown error while fetch from {}: {}".format(loader_version_url, e)
)
try:
versions = r.json()
except json.decoder.JSONDecodeError as e:
raise VersionManifestFetchException(
"JSON decode error while fetch from {}: {}".format(loader_version_url, e)
)
loaders = []
for version in versions:
loader = version.get("loader", None)
if not loader:
logger.warning("Found corrupted or unsupported loader manifest")
continue
loaders.append(loader)
if not loaders:
raise VersionManifestException(
"No available loader found in {}".format(loader_version_url)
)
return loaders
def get_loader_manifest_from_loader_data(target_version: str, loader_data: dict,
loader_manifest_url: str=FABRIC_META_LOADER_MANIFEST_ENDPOINT_V2) -> dict:
loader_ver = loader_data.get("version", None)
if not loader_ver:
raise VersionDataKeyNotFoundException(
"Version key not found in loader manifest {}".format(loader_manifest_url)
)
# Create url
url = loader_manifest_url.format(target_version, loader_ver)
logger.debug("Full manifest url: {}".format(url))
try:
r = requests.get(url, timeout=5)
except requests.exceptions.Timeout:
raise VersionManifestFetchException(
"Timeout while fetch from {}".format(url)
)
except requests.exceptions.ConnectionError as e:
raise VersionManifestFetchException(
"Connection error while fetch from {}: {}".format(url, e)
)
except requests.exceptions.HTTPError as e:
raise VersionManifestFetchException(
"HTTP error while fetch from {}: {}".format(url, e.response.status_code)
)
except Exception as e:
raise VersionManifestFetchException(
"Unknown error while fetch from {}: {}".format(url, e)
)
# We don't need verify data, fabric didn't provide manifest hash.
try:
return r.json()
except json.decoder.JSONDecodeError as e:
raise VersionManifestFetchException(
"JSON decode error while fetch from {}: {}".format(url, e)
)
except Exception as e:
raise VersionManifestFetchException(
"Unknown error while fetch from {}: {}".format(url, e)
)