Code some ui and fix parse library will throw exception sometimes.
This commit is contained in:
@@ -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)
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user