62 lines
2.8 KiB
Python
62 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Утилиты для работы с модпаками Modrinth/CurseForge."""
|
|
import os
|
|
import re
|
|
import tempfile
|
|
|
|
from . import forge, http, mods
|
|
from .java_fetch import _safe_join
|
|
from . import modrinth, curseforge
|
|
|
|
|
|
def install_pack_mrpack_url(game_dir, url, log=None, progress=None, cancel=None):
|
|
"""Скачивает и ставит .mrpack по URL."""
|
|
from . import mrpack as mrpack_mod
|
|
filename = url.rsplit("/", 1)[-1] or "pack.mrpack"
|
|
return mrpack_mod.install_from_url(game_dir, url, log=log, progress=progress,
|
|
cancel=cancel, filename_hint=filename)
|
|
|
|
|
|
def install_pack_modrinth(project_id, game_dir, version=None, game_version="",
|
|
loader="", log=None, progress=None, cancel=None):
|
|
"""Устанавливает сборку Modrinth по project_id (slug или id).
|
|
|
|
Возвращает (id_версии, скачано_файлов).
|
|
"""
|
|
from . import mrpack as mrpack_mod
|
|
vs = modrinth.get_modpack_versions(project_id, game_version=game_version,
|
|
loader=loader)
|
|
if not vs:
|
|
raise RuntimeError("Нет версий сборки Modrinth")
|
|
v = version if version else vs[0]
|
|
if isinstance(v, str):
|
|
v = next((x for x in vs if x["id"] == v or x["filename"] == v), vs[0])
|
|
url = v.get("url") or ""
|
|
if not url:
|
|
raise RuntimeError("У версии сборки нет ссылки на файл")
|
|
filename = v.get("filename") or "pack.mrpack"
|
|
return mrpack_mod.install_from_url(game_dir, url, log=log, progress=progress,
|
|
cancel=cancel, filename_hint=filename)
|
|
|
|
|
|
def install_pack_curseforge(mod_id, file_id, game_dir, log=None, progress=None,
|
|
cancel=None):
|
|
"""Устанавливает сборку CurseForge (mod_id + file_id)."""
|
|
from . import cfpack
|
|
info = curseforge.get_file(mod_id, file_id)
|
|
url = info.get("download_url") or ""
|
|
if not url:
|
|
raise RuntimeError("Не удалось получить ссылку на загрузку CurseForge")
|
|
filename = info.get("file_name") or ("pack-%s.zip" % mod_id)
|
|
return cfpack.install_from_url(game_dir, url, log=log, progress=progress,
|
|
cancel=cancel, filename_hint=filename)
|
|
|
|
|
|
def install_pack_curseforge_url(game_dir, url, log=None, progress=None,
|
|
cancel=None):
|
|
"""Устанавливает сборку CurseForge по прямой ссылке на zip."""
|
|
from . import cfpack
|
|
filename = os.path.basename(url.split("?")[0]) or "pack.zip"
|
|
return cfpack.install_from_url(game_dir, url, log=log, progress=progress,
|
|
cancel=cancel, filename_hint=filename)
|