mirror of
https://github.com/Radiquum/YAMPD.git
synced 2025-05-20 07:39:35 +05:00
129 lines
4 KiB
Python
129 lines
4 KiB
Python
import requests
|
|
from config import MODRINTH_UA
|
|
|
|
|
|
def getModrinthMod(slug, version, mod_loader, game_version):
|
|
headers = {"User-Agent": MODRINTH_UA}
|
|
descR = requests.get(f"https://api.modrinth.com/v2/project/{slug}", headers=headers)
|
|
|
|
if descR.status_code != 200:
|
|
return {
|
|
"status": "error",
|
|
"message": f"failed to fetch modrinth description: {descR.status_code}",
|
|
"slug": slug,
|
|
"version": version,
|
|
"mod_loader": mod_loader,
|
|
"game_version": game_version
|
|
}
|
|
|
|
versR = requests.get(
|
|
f'https://api.modrinth.com/v2/project/{slug}/version?loaders=["{mod_loader}"]&game_versions=["{game_version}"]',
|
|
headers=headers,
|
|
)
|
|
|
|
if versR.status_code != 200:
|
|
return {
|
|
"status": "error",
|
|
"message": f"failed to fetch modrinth mod versions: {versR.status_code}",
|
|
"slug": slug,
|
|
"version": version,
|
|
"mod_loader": mod_loader,
|
|
"game_version": game_version
|
|
}
|
|
|
|
devsR = requests.get(
|
|
f"https://api.modrinth.com/v2/project/{slug}/members",
|
|
headers=headers,
|
|
)
|
|
|
|
if devsR.status_code != 200:
|
|
return {
|
|
"status": "error",
|
|
"message": f"failed to fetch modrinth mod developers: {devsR.status_code}",
|
|
"slug": slug,
|
|
"version": version,
|
|
"mod_loader": mod_loader,
|
|
"game_version": game_version
|
|
}
|
|
|
|
desc: dict = descR.json()
|
|
vers: dict = versR.json()
|
|
devs: dict = devsR.json()
|
|
|
|
if len(vers) == 0:
|
|
return {
|
|
"status": "error",
|
|
"message": f"mod is not compatible with this game version or mod loader",
|
|
"slug": slug,
|
|
"version": version,
|
|
"mod_loader": mod_loader,
|
|
"game_version": game_version
|
|
}
|
|
|
|
selected_version = vers[0]
|
|
if version:
|
|
for _sf in vers:
|
|
if _sf.get("version_number") == version:
|
|
selected_version = _sf
|
|
break
|
|
|
|
primary_file = None
|
|
for _pf in selected_version.get("files"):
|
|
if _pf.get("primary") == True:
|
|
primary_file = _pf
|
|
break
|
|
|
|
if primary_file is None:
|
|
return {
|
|
"status": "error",
|
|
"message": f"failed to get primary mod file",
|
|
"slug": slug,
|
|
"version": version,
|
|
"mod_loader": mod_loader,
|
|
"game_version": game_version
|
|
}
|
|
|
|
developers = []
|
|
for dev in devs:
|
|
developers.append(dev["user"]["username"])
|
|
|
|
isClient = False
|
|
if desc.get("client_side") in ["optional", "required"]:
|
|
isClient = True
|
|
isServer = False
|
|
if desc.get("server_side") in ["optional", "required"]:
|
|
isServer = True
|
|
|
|
dependencies = []
|
|
for dep in selected_version.get("dependencies"):
|
|
depDescR = requests.get(f"https://api.modrinth.com/v2/project/{dep.get('project_id')}", headers=headers)
|
|
if depDescR.status_code != 200:
|
|
continue
|
|
depDesc: dict = depDescR.json()
|
|
depMod = getModrinthMod(depDesc.get("slug"), None, mod_loader, game_version)
|
|
dependencies.append(depMod.get("mod"))
|
|
|
|
return {
|
|
"status": "ok",
|
|
"mod": {
|
|
"slug": slug,
|
|
"project_id": desc.get("id"),
|
|
"icon": desc.get("icon_url"),
|
|
"title": desc.get("title"),
|
|
"developers": developers,
|
|
"source": "Modrinth",
|
|
"url": f"https://modrinth.com/mod/{slug}",
|
|
"environment": {
|
|
"client": isClient,
|
|
"server": isServer,
|
|
},
|
|
"dependencies": dependencies,
|
|
"file": {
|
|
"version": selected_version.get("version_number"),
|
|
"hashes": primary_file.get("hashes"),
|
|
"url": primary_file.get("url"),
|
|
"filename": primary_file.get("filename"),
|
|
"size": primary_file.get("size"),
|
|
},
|
|
},
|
|
}
|