diff --git a/fabricutil.py b/fabricutil.py index f9c91c6..7849736 100644 --- a/fabricutil.py +++ b/fabricutil.py @@ -1,6 +1,31 @@ from metautil import * import jsonobject +variants = { + "fabric": { + "name": "Fabric Loader", + "description": "Fabric Loader is a tool to load Fabric-compatible mods in game environments.", + "url": "https://fabricmc.net", + "authors": ["Fabric Developers"], + "meta": "https://meta.fabricmc.net", + "maven": "https://maven.fabricmc.net", + "loader_uid": "net.fabricmc.fabric-loader", + "intermediary_uid": "net.fabricmc.intermediary", + "exclude": [], + }, + "legacy-fabric": { + "name": "Fabric Loader 1.8.9", + "description": "Fabric Loader for 1.8.9 and below.", + "url": "https://legacyfabric.net", + "authors": ["Legacy Fabric Developers"], + "meta": "https://meta.legacyfabric.net", + "maven": "https://maven.legacyfabric.net", + "loader_uid": "net.legacyfabric.fabric-loader-189", + "intermediary_uid": "net.legacyfabric.intermediary", + "exclude": ["fabric-loader"], + }, +} + # barebones semver-like parser def isFabricVerStable(ver): s = ver.split("+") diff --git a/generateFabric.py b/generateFabric.py index 3cc7c89..744d01f 100755 --- a/generateFabric.py +++ b/generateFabric.py @@ -15,21 +15,18 @@ def mkdirs(path): if not os.path.exists(path): os.makedirs(path) -mkdirs("multimc/net.fabricmc.fabric-loader") -mkdirs("multimc/net.fabricmc.intermediary") - -def loadJarInfo(mavenKey): - with open("upstream/fabric/jars/" + mavenKey.replace(":", ".") + ".json", 'r', encoding='utf-8') as jarInfoFile: +def loadJarInfo(mavenKey, variantName): + with open(f"upstream/{variantName}/jars/" + mavenKey.replace(":", ".") + ".json", 'r', encoding='utf-8') as jarInfoFile: return FabricJarInfo(json.load(jarInfoFile)) -def processLoaderVersion(loaderVersion, it, loaderData): +def processLoaderVersion(loaderVersion, it, loaderData, variantName, variant): verStable = isFabricVerStable(loaderVersion) if (len(loaderRecommended) < 1) and verStable: loaderRecommended.append(loaderVersion) - versionJarInfo = loadJarInfo(it["maven"]) - version = MultiMCVersionFile(name="Fabric Loader", uid="net.fabricmc.fabric-loader", version=loaderVersion) + versionJarInfo = loadJarInfo(it["maven"], variantName) + version = MultiMCVersionFile(name=variant["name"], uid=variant["loader_uid"], version=loaderVersion) version.releaseTime = versionJarInfo.releaseTime - version.requires = [DependencyEntry(uid='net.fabricmc.intermediary')] + version.requires = [DependencyEntry(uid=variant["intermediary_uid"])] version.order = 10 if verStable: version.type = "release" @@ -42,58 +39,82 @@ def processLoaderVersion(loaderVersion, it, loaderData): version.libraries = [] version.libraries.extend(loaderData.libraries.common) version.libraries.extend(loaderData.libraries.client) - loaderLib = MultiMCLibrary(name=GradleSpecifier(it["maven"]), url="https://maven.fabricmc.net") + loaderLib = MultiMCLibrary(name=GradleSpecifier(it["maven"]), url=variant["maven"]) version.libraries.append(loaderLib) loaderVersions.append(version) -def processIntermediaryVersion(it): +def processIntermediaryVersion(it, variantName, variant): intermediaryRecommended.append(it["version"]) - versionJarInfo = loadJarInfo(it["maven"]) - version = MultiMCVersionFile(name="Intermediary Mappings", uid="net.fabricmc.intermediary", version=it["version"]) + versionJarInfo = loadJarInfo(it["maven"], variantName) + version = MultiMCVersionFile(name="Intermediary Mappings", uid=variant["intermediary_uid"], version=it["version"]) version.releaseTime = versionJarInfo.releaseTime version.requires = [DependencyEntry(uid='net.minecraft', equals=it["version"])] version.order = 11 version.type = "release" version.libraries = [] version.volatile = True - mappingLib = MultiMCLibrary(name=GradleSpecifier(it["maven"]), url="https://maven.fabricmc.net") + mappingLib = MultiMCLibrary(name=GradleSpecifier(it["maven"]), url=variant["maven"]) version.libraries.append(mappingLib) intermediaryVersions.append(version) -with open("upstream/fabric/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile: - loaderVersionIndex = json.load(loaderVersionIndexFile) - for it in loaderVersionIndex: - version = it["version"] - with open("upstream/fabric/loader-installer-json/" + version + ".json", 'r', encoding='utf-8') as loaderVersionFile: - ldata = json.load(loaderVersionFile) - ldata = FabricInstallerDataV1(ldata) - processLoaderVersion(version, it, ldata) +for variantName, variant in variants.items(): + print(f"--- {variantName} ---") + + loaderRecommended.clear() + loaderVersions.clear() + intermediaryRecommended.clear() + intermediaryVersions.clear() + + mkdirs(f"multimc/{variant['loader_uid']}") + mkdirs(f"multimc/{variant['intermediary_uid']}") + + print("Processing loader versions...") + with open(f"upstream/{variantName}/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile: + loaderVersionIndex = json.load(loaderVersionIndexFile) + for it in loaderVersionIndex: + if "name" in it and it["name"] in variant["exclude"]: + continue + + version = it["version"] + print(f"Processing {version}...") + with open(f"upstream/{variantName}/loader-installer-json/" + version + ".json", 'r', encoding='utf-8') as loaderVersionFile: + ldata = json.load(loaderVersionFile) + ldata = FabricInstallerDataV1(ldata) + processLoaderVersion(version, it, ldata, variantName, variant) -with open("upstream/fabric/meta-v2/intermediary.json", 'r', encoding='utf-8') as intermediaryVersionIndexFile: - intermediaryVersionIndex = json.load(intermediaryVersionIndexFile) - for it in intermediaryVersionIndex: - processIntermediaryVersion(it) + print("Processing Intermediary versions...") + with open(f"upstream/{variantName}/meta-v2/intermediary.json", 'r', encoding='utf-8') as intermediaryVersionIndexFile: + intermediaryVersionIndex = json.load(intermediaryVersionIndexFile) + for it in intermediaryVersionIndex: + print(f"Processing {it['version']}...") + processIntermediaryVersion(it, variantName, variant) -for version in loaderVersions: - outFilepath = "multimc/net.fabricmc.fabric-loader/%s.json" % version.version - with open(outFilepath, 'w') as outfile: - json.dump(version.to_json(), outfile, sort_keys=True, indent=4) + print("Writing loader versions...") + for version in loaderVersions: + print(f"Writing {version.version}...") + outFilepath = f"multimc/{variant['loader_uid']}/%s.json" % version.version + with open(outFilepath, 'w') as outfile: + json.dump(version.to_json(), outfile, sort_keys=True, indent=4) -sharedData = MultiMCSharedPackageData(uid = 'net.fabricmc.fabric-loader', name = 'Fabric Loader') -sharedData.recommended = loaderRecommended -sharedData.description = "Fabric Loader is a tool to load Fabric-compatible mods in game environments." -sharedData.projectUrl = "https://fabricmc.net" -sharedData.authors = ["Fabric Developers"] -sharedData.write() + print("Writing shared loader data...") + sharedData = MultiMCSharedPackageData(uid = variant["loader_uid"], name = variant["name"]) + sharedData.recommended = loaderRecommended + sharedData.description = variant["description"] + sharedData.projectUrl = variant["url"] + sharedData.authors = variant["authors"] + sharedData.write() -for version in intermediaryVersions: - outFilepath = "multimc/net.fabricmc.intermediary/%s.json" % version.version - with open(outFilepath, 'w') as outfile: - json.dump(version.to_json(), outfile, sort_keys=True, indent=4) + print("Writing Intermediary versions...") + for version in intermediaryVersions: + print(f"Writing {version.version}...") + outFilepath = f"multimc/{variant['intermediary_uid']}/%s.json" % version.version + with open(outFilepath, 'w') as outfile: + json.dump(version.to_json(), outfile, sort_keys=True, indent=4) -sharedData = MultiMCSharedPackageData(uid = 'net.fabricmc.intermediary', name = 'Intermediary Mappings') -sharedData.recommended = intermediaryRecommended -sharedData.description = "Intermediary mappings allow using Fabric Loader with mods for Minecraft in a more compatible manner." -sharedData.projectUrl = "https://fabricmc.net" -sharedData.authors = ["Fabric Developers"] -sharedData.write() + print("Writing shared Intermediary data...") + sharedData = MultiMCSharedPackageData(uid = variant["intermediary_uid"], name = 'Intermediary Mappings') + sharedData.recommended = intermediaryRecommended + sharedData.description = "Intermediary mappings allow using Fabric Loader with mods for Minecraft in a more compatible manner." + sharedData.projectUrl = variant["url"] + sharedData.authors = variant["authors"] + sharedData.write() diff --git a/updateFabric.py b/updateFabric.py index 925fc0b..eef0142 100755 --- a/updateFabric.py +++ b/updateFabric.py @@ -24,7 +24,7 @@ def filehash(filename, hashtype, blocksize=65536): def get_maven_url(mavenKey, server, ext): mavenParts = mavenKey.split(":", 3) - mavenVerUrl = server + mavenParts[0].replace(".", "/") + "/" + mavenParts[1] + "/" + mavenParts[2] + "/" + mavenVerUrl = server + "/" + mavenParts[0].replace(".", "/") + "/" + mavenParts[1] + "/" + mavenParts[2] + "/" mavenUrl = mavenVerUrl + mavenParts[1] + "-" + mavenParts[2] + ext return mavenUrl @@ -62,20 +62,34 @@ def compute_jar_file(path, url): with open(path + ".json", 'w') as outfile: json.dump(data.to_json(), outfile, sort_keys=True, indent=4) -mkdirs("upstream/fabric/meta-v2") -mkdirs("upstream/fabric/loader-installer-json") -mkdirs("upstream/fabric/jars") +for variantName, variant in variants.items(): + mkdirs(f"upstream/{variantName}/meta-v2") + mkdirs(f"upstream/{variantName}/loader-installer-json") + mkdirs(f"upstream/{variantName}/jars") -# get the version list for each component we are interested in -for component in ["intermediary", "loader"]: - index = get_json_file("upstream/fabric/meta-v2/" + component + ".json", "https://meta.fabricmc.net/v2/versions/" + component) - for it in index: - jarMavenUrl = get_maven_url(it["maven"], "https://maven.fabricmc.net/", ".jar") - compute_jar_file("upstream/fabric/jars/" + it["maven"].replace(":", "."), jarMavenUrl) + print(f"--- {variantName} ---") -# for each loader, download installer JSON file from maven -with open("upstream/fabric/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile: - loaderVersionIndex = json.load(loaderVersionIndexFile) - for it in loaderVersionIndex: - mavenUrl = get_maven_url(it["maven"], "https://maven.fabricmc.net/", ".json") - get_json_file("upstream/fabric/loader-installer-json/" + it["version"] + ".json", mavenUrl) + # get the version list for each component we are interested in + for component in ["intermediary", "loader"]: + print(f"Downloading {component} versions...") + index = get_json_file(f"upstream/{variantName}/meta-v2/" + component + ".json", f"{variant['meta']}/v2/versions/" + component) + for it in index: + if "name" in it and it["name"] in variant["exclude"]: + continue + + print(f"Downloading {it['maven']} jar...") + jarMavenUrl = get_maven_url(it["maven"], variant["maven"], ".jar") + compute_jar_file(f"upstream/{variantName}/jars/" + it["maven"].replace(":", "."), jarMavenUrl) + + print("Downloading installer metadata...") + + # for each loader, download installer JSON file from maven + with open(f"upstream/{variantName}/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile: + loaderVersionIndex = json.load(loaderVersionIndexFile) + for it in loaderVersionIndex: + if "name" in it and it["name"] in variant["exclude"]: + continue + + print(f"Downloading {it['maven']} installer metadata...") + mavenUrl = get_maven_url(it["maven"], variant["maven"], ".json") + get_json_file(f"upstream/{variantName}/loader-installer-json/" + it["version"] + ".json", mavenUrl)