PixelLauncher 2.1.2 — секции настроек, панель быстрых настроек, сборки Modrinth/CurseForge
This commit is contained in:
1 parent
80dc1826a1
commit
39cf752b7b
13 files changed
+972
-49
No files matched your search
+65
-32
@@ -141,36 +141,69 @@ def _find_installed(mods_dir, prefixes):
|
||||
return False
|
||||
|
||||
|
||||
def ensure_loader_api(game_dir, game_version, loader, log=None):
|
||||
"""Ставит Fabric API / Quilted Fabric API, если модов нет.
|
||||
def search_modpacks(query, game_version="", loader="", limit=20, offset=0):
|
||||
"""Поиск сборок Modrinth (project_type=modpack)."""
|
||||
facets = [["project_type:modpack"]]
|
||||
if game_version:
|
||||
facets.append(["versions:" + game_version])
|
||||
if loader:
|
||||
facets.append(["categories:" + loader])
|
||||
params = {
|
||||
"query": query or "",
|
||||
"facets": json.dumps(facets, separators=(",", ":")),
|
||||
"limit": limit,
|
||||
"offset": offset,
|
||||
"index": "relevance" if query else "downloads",
|
||||
}
|
||||
url = BASE + "/search?" + urllib.parse.urlencode(params)
|
||||
data = _get_json(url, ttl=300)
|
||||
out = []
|
||||
for h in data.get("hits") or []:
|
||||
out.append({
|
||||
"id": h.get("project_id") or h.get("project_id") or h.get("slug") or "",
|
||||
"slug": h.get("slug") or "",
|
||||
"title": h.get("title") or h.get("slug") or "?",
|
||||
"desc": (h.get("description") or "").strip(),
|
||||
"downloads": int(h.get("downloads") or 0),
|
||||
"icon": h.get("icon_url") or "",
|
||||
"game_versions": h.get("versions") or [],
|
||||
"categories": h.get("categories") or [],
|
||||
})
|
||||
return out, int(data.get("total_hits") or 0)
|
||||
|
||||
Возвращает число скачанных файлов (0 — уже стоит или недоступно).
|
||||
"""
|
||||
import os
|
||||
if loader not in ("fabric", "quilt"):
|
||||
return 0
|
||||
mods_dir = os.path.join(game_dir, "mods")
|
||||
os.makedirs(mods_dir, exist_ok=True)
|
||||
slug = FABRIC_API_SLUG if loader == "fabric" else QUILTED_API_SLUG
|
||||
prefixes = ["fabric-api"] if loader == "fabric" else ["quilted-fabric-api"]
|
||||
if _find_installed(mods_dir, prefixes):
|
||||
return 0
|
||||
if log:
|
||||
log(f"Modrinth: ставлю {'Fabric API' if loader == 'fabric' else 'Quilted Fabric API'}…")
|
||||
try:
|
||||
pid = slug # API принимает и slug
|
||||
vs = versions(pid, game_version, loader)
|
||||
if not vs:
|
||||
if log:
|
||||
log(f"Modrinth: нет сборки {slug} для {game_version}/{loader}")
|
||||
return 0
|
||||
v = vs[0]
|
||||
dest = os.path.join(mods_dir, v["filename"])
|
||||
ok = download_mod(v["url"], dest, size=v["size"])
|
||||
if ok and log:
|
||||
log(f"Modrinth: {v['filename']} установлен")
|
||||
return 1 if ok else 0
|
||||
except Exception as e: # noqa: BLE001 — сеть/JSON не должны ронять лаунчер
|
||||
if log:
|
||||
log(f"Modrinth: не удалось поставить API ({e})")
|
||||
return 0
|
||||
|
||||
def get_modpack_versions(pid, game_version="", loader=""):
|
||||
"""Версии сборки Modrinth."""
|
||||
url = BASE + "/project/" + str(pid) + "/version"
|
||||
qs = []
|
||||
if game_version:
|
||||
qs.append("game_versions=" + urllib.parse.quote(json.dumps([game_version])))
|
||||
if loader:
|
||||
qs.append("loaders=" + urllib.parse.quote(json.dumps([loader])))
|
||||
if qs:
|
||||
url += "?" + "&".join(qs)
|
||||
raw = _get_json(url, ttl=300)
|
||||
out = []
|
||||
for v in raw if isinstance(raw, list) else []:
|
||||
files = v.get("files") or []
|
||||
if not files:
|
||||
continue
|
||||
primary = next((f for f in files if f.get("primary")), files[0])
|
||||
hashes = primary.get("hashes") or {}
|
||||
out.append({
|
||||
"id": v.get("id") or "",
|
||||
"name": (v.get("name") or v.get("version_number") or "?").strip(),
|
||||
"number": (v.get("version_number") or "").strip(),
|
||||
"date": (v.get("date_published") or "")[:10],
|
||||
"url": primary.get("url") or "",
|
||||
"filename": primary.get("filename") or "",
|
||||
"size": int(primary.get("size") or 0),
|
||||
"sha1": hashes.get("sha1") or "",
|
||||
"game_versions": v.get("game_versions") or [],
|
||||
"loaders": v.get("loaders") or [],
|
||||
})
|
||||
return out
|
||||
|
||||
|
||||
def download_pack(file_url, dest, size=0, progress=None, cancel=None):
|
||||
return http.download_file(file_url, dest, size=size, progress=progress, cancel=cancel)
|
||||
Reference in new issue
Block a user