# -*- coding: utf-8 -*- """Утилиты для работы с модпаками Modrinth/CurseForge.""" import os from . import curseforge, modrinth 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)