PixelLauncher 2.1.2 — секции настроек, панель быстрых настроек, сборки Modrinth/CurseForge

This commit is contained in:
kosta committed 2026-10-20 17:36:35 +07:00
1 parent 80dc1826a1
commit 39cf752b7b
13 files changed
+972 -49

No files matched your search

+65 -32
View File
@@ -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)