add: MCBBS download provider

This commit is contained in:
huanghongxun 2020-02-02 23:32:01 +08:00
parent bb2e74009e
commit 214ff9de94
19 changed files with 130 additions and 86 deletions

View File

@ -17,27 +17,27 @@
*/ */
package org.jackhuang.hmcl.setting; package org.jackhuang.hmcl.setting;
import static org.jackhuang.hmcl.setting.ConfigHolder.config; import javafx.beans.binding.Bindings;
import static org.jackhuang.hmcl.util.Lang.mapOf; import javafx.beans.binding.ObjectBinding;
import static org.jackhuang.hmcl.util.Pair.pair; import javafx.beans.value.ObservableObjectValue;
import java.util.Map;
import java.util.Optional;
import org.jackhuang.hmcl.download.BMCLAPIDownloadProvider; import org.jackhuang.hmcl.download.BMCLAPIDownloadProvider;
import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.DownloadProvider;
import org.jackhuang.hmcl.download.MojangDownloadProvider; import org.jackhuang.hmcl.download.MojangDownloadProvider;
import javafx.beans.binding.Bindings; import java.util.Map;
import javafx.beans.binding.ObjectBinding; import java.util.Optional;
import javafx.beans.value.ObservableObjectValue;
import static org.jackhuang.hmcl.setting.ConfigHolder.config;
import static org.jackhuang.hmcl.util.Lang.mapOf;
import static org.jackhuang.hmcl.util.Pair.pair;
public final class DownloadProviders { public final class DownloadProviders {
private DownloadProviders() {} private DownloadProviders() {}
public static final Map<String, DownloadProvider> providersById = mapOf( public static final Map<String, DownloadProvider> providersById = mapOf(
pair("mojang", new MojangDownloadProvider()), pair("mojang", new MojangDownloadProvider()),
pair("bmclapi", new BMCLAPIDownloadProvider())); pair("bmclapi", new BMCLAPIDownloadProvider("https://bmclapi2.bangbang93.com")),
pair("mcbbs", new BMCLAPIDownloadProvider("https://download.mcbbs.net")));
public static final String DEFAULT_PROVIDER_ID = "bmclapi"; public static final String DEFAULT_PROVIDER_ID = "bmclapi";

View File

@ -17,8 +17,6 @@
*/ */
package org.jackhuang.hmcl.ui.download; package org.jackhuang.hmcl.ui.download;
import static org.jackhuang.hmcl.util.Logging.LOG;
import com.jfoenix.controls.JFXCheckBox; import com.jfoenix.controls.JFXCheckBox;
import com.jfoenix.controls.JFXListView; import com.jfoenix.controls.JFXListView;
import com.jfoenix.controls.JFXSpinner; import com.jfoenix.controls.JFXSpinner;
@ -44,9 +42,10 @@ import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.jackhuang.hmcl.util.Logging.LOG;
public final class VersionsPage extends BorderPane implements WizardPage, Refreshable { public final class VersionsPage extends BorderPane implements WizardPage, Refreshable {
private final String gameVersion; private final String gameVersion;
private final DownloadProvider downloadProvider;
private final String libraryId; private final String libraryId;
private final String title; private final String title;
private final WizardController controller; private final WizardController controller;
@ -79,7 +78,6 @@ public final class VersionsPage extends BorderPane implements WizardPage, Refres
public VersionsPage(WizardController controller, String title, String gameVersion, DownloadProvider downloadProvider, String libraryId, Runnable callback) { public VersionsPage(WizardController controller, String title, String gameVersion, DownloadProvider downloadProvider, String libraryId, Runnable callback) {
this.title = title; this.title = title;
this.gameVersion = gameVersion; this.gameVersion = gameVersion;
this.downloadProvider = downloadProvider;
this.libraryId = libraryId; this.libraryId = libraryId;
this.controller = controller; this.controller = controller;
this.versionList = downloadProvider.getVersionListById(libraryId); this.versionList = downloadProvider.getVersionListById(libraryId);
@ -128,7 +126,7 @@ public final class VersionsPage extends BorderPane implements WizardPage, Refres
@Override @Override
public void refresh() { public void refresh() {
transitionHandler.setContent(spinner, ContainerAnimations.FADE.getAnimationProducer()); transitionHandler.setContent(spinner, ContainerAnimations.FADE.getAnimationProducer());
executor = versionList.refreshAsync(gameVersion, downloadProvider).whenComplete(exception -> { executor = versionList.refreshAsync(gameVersion).whenComplete(exception -> {
if (exception == null) { if (exception == null) {
List<VersionsPageItem> items = loadVersions(); List<VersionsPageItem> items = loadVersions();

View File

@ -71,6 +71,7 @@ archive.version=Version
assets.download=Downloading assets assets.download=Downloading assets
assets.download_all=Asset Integrity Check assets.download_all=Asset Integrity Check
assets.index.malformed=Asset index malformed, you can retry by "Update Game Asset Files" in version settings.
button.cancel=Cancel button.cancel=Cancel
button.clear=Clear button.clear=Clear
@ -95,6 +96,7 @@ download.code.404=File not found on the remote server
download.failed=Failed to download download.failed=Failed to download
download.failed.empty=No candidates. Click here to return. download.failed.empty=No candidates. Click here to return.
download.failed.refresh=Unable to download version list. Click here to retry. download.failed.refresh=Unable to download version list. Click here to retry.
download.provider.mcbbs=MCBBS (https://www.mcbbs.net/)
download.provider.bmclapi=BMCLAPI (bangbang93, https://bmclapi2.bangbang93.com/) download.provider.bmclapi=BMCLAPI (bangbang93, https://bmclapi2.bangbang93.com/)
download.provider.mojang=Mojang (Forge and OptiFine installation are downloaded from BMCLAPI) download.provider.mojang=Mojang (Forge and OptiFine installation are downloaded from BMCLAPI)

View File

@ -95,6 +95,7 @@ download.code.404=Archivo no encontrado en servidor remoto
download.failed=Falló en descargar download.failed=Falló en descargar
download.failed.empty=No hay candidatos. Clic aquí para regresar. download.failed.empty=No hay candidatos. Clic aquí para regresar.
download.failed.refresh=No se pudo cargar lista de versiones. Clic aquí para reintentar. download.failed.refresh=No se pudo cargar lista de versiones. Clic aquí para reintentar.
download.provider.mcbbs=MCBBS (https://www.mcbbs.net/)
download.provider.bmclapi=BMCLAPI (bangbang93, https://bmclapi2.bangbang93.com/) download.provider.bmclapi=BMCLAPI (bangbang93, https://bmclapi2.bangbang93.com/)
download.provider.mojang=Mojang (instalaciones de Forge y OptiFine siendo descargadas por BMCLAPI) download.provider.mojang=Mojang (instalaciones de Forge y OptiFine siendo descargadas por BMCLAPI)

View File

@ -95,7 +95,8 @@ download.code.404=Файл не найден на удаленном серве
download.failed=Не удалось загрузить download.failed=Не удалось загрузить
download.failed.empty=Нет вариантов. Нажмите здесь, чтобы вернуться. download.failed.empty=Нет вариантов. Нажмите здесь, чтобы вернуться.
download.failed.refresh=Невозможно загрузить список версий. Нажмите здесь, чтобы повторить попытку. download.failed.refresh=Невозможно загрузить список версий. Нажмите здесь, чтобы повторить попытку.
download.provider.bmclapi=BMCLAPI (Резервный) download.provider.mcbbs=MCBBS (https://www.mcbbs.net/)
download.provider.bmclapi=BMCLAPI (bangbang93, https://bmclapi2.bangbang93.com/)
download.provider.mojang=Mojang (Официальный) download.provider.mojang=Mojang (Официальный)
extension.bat=Windows Bat файл extension.bat=Windows Bat файл

View File

@ -70,6 +70,7 @@ archive.version=版本
assets.download=下載資源 assets.download=下載資源
assets.download_all=驗證資源檔案完整性 assets.download_all=驗證資源檔案完整性
assets.index.malformed=資源文件索引資料損壞,您可以在遊戲設定頁面右上角的設定按鈕中選擇更新遊戲資源檔案以修復該問題
button.cancel=取消 button.cancel=取消
button.clear=清除 button.clear=清除
@ -94,6 +95,7 @@ download.code.404=遠程伺服器不包含需要下載的文件
download.failed=下載失敗 download.failed=下載失敗
download.failed.empty=沒有可供安裝的版本,點擊此處返回。 download.failed.empty=沒有可供安裝的版本,點擊此處返回。
download.failed.refresh=載入版本列表失敗,點擊此處重試。 download.failed.refresh=載入版本列表失敗,點擊此處重試。
download.provider.mcbbs=我的世界中文論壇 (MCBBS, https://www.mcbbs.net/)
download.provider.bmclapi=BMCLAPIbangbang93https://bmclapi2.bangbang93.com/ download.provider.bmclapi=BMCLAPIbangbang93https://bmclapi2.bangbang93.com/
download.provider.mojang=官方伺服器Forge 和 OptiFine 自動安裝的下載來源是 BMCLAPI download.provider.mojang=官方伺服器Forge 和 OptiFine 自動安裝的下載來源是 BMCLAPI

View File

@ -70,6 +70,7 @@ archive.version=版本
assets.download=下载资源 assets.download=下载资源
assets.download_all=检查资源文件完整性 assets.download_all=检查资源文件完整性
assets.index.malformed=资源文件索引文件损坏,您可以在游戏设置页面右上角的设置按钮中选择更新游戏资源文件以修复该问题
button.cancel=取消 button.cancel=取消
button.clear=清除 button.clear=清除
@ -94,6 +95,7 @@ download.code.404=远程服务器不包含需要下载的文件
download.failed=下载失败 download.failed=下载失败
download.failed.empty=没有可供安装的版本,点击此处返回。 download.failed.empty=没有可供安装的版本,点击此处返回。
download.failed.refresh=加载版本列表失败,点击此处重试。 download.failed.refresh=加载版本列表失败,点击此处重试。
download.provider.mcbbs=我的世界中文论坛 (MCBBS, https://www.mcbbs.net/)
download.provider.bmclapi=BMCLAPIbangbang93https://bmclapi2.bangbang93.com/ download.provider.bmclapi=BMCLAPIbangbang93https://bmclapi2.bangbang93.com/
download.provider.mojang=官方Forge 和 OptiFine 自动安装使用 BMCLAPI 下载源) download.provider.mojang=官方Forge 和 OptiFine 自动安装使用 BMCLAPI 下载源)

View File

@ -28,30 +28,47 @@ import org.jackhuang.hmcl.download.optifine.OptiFineBMCLVersionList;
* @author huang * @author huang
*/ */
public class BMCLAPIDownloadProvider implements DownloadProvider { public class BMCLAPIDownloadProvider implements DownloadProvider {
private final String apiRoot;
private final GameVersionList game;
private final ForgeBMCLVersionList forge;
private final LiteLoaderBMCLVersionList liteLoader;
private final OptiFineBMCLVersionList optifine;
public BMCLAPIDownloadProvider(String apiRoot) {
this.apiRoot = apiRoot;
this.game = new GameVersionList(this);
this.forge = new ForgeBMCLVersionList(apiRoot);
this.liteLoader = new LiteLoaderBMCLVersionList(this);
this.optifine = new OptiFineBMCLVersionList(apiRoot);
}
public String getApiRoot() {
return apiRoot;
}
@Override @Override
public String getVersionListURL() { public String getVersionListURL() {
return "https://bmclapi2.bangbang93.com/mc/game/version_manifest.json"; return apiRoot + "/mc/game/version_manifest.json";
} }
@Override @Override
public String getAssetBaseURL() { public String getAssetBaseURL() {
return "https://bmclapi2.bangbang93.com/assets/"; return apiRoot + "/assets/";
} }
@Override @Override
public VersionList<?> getVersionListById(String id) { public VersionList<?> getVersionListById(String id) {
switch (id) { switch (id) {
case "game": case "game":
return GameVersionList.INSTANCE; return game;
case "fabric": case "fabric":
return FabricVersionList.INSTANCE; return FabricVersionList.INSTANCE;
case "forge": case "forge":
return ForgeBMCLVersionList.INSTANCE; return forge;
case "liteloader": case "liteloader":
return LiteLoaderBMCLVersionList.INSTANCE; return liteLoader;
case "optifine": case "optifine":
return OptiFineBMCLVersionList.INSTANCE; return optifine;
default: default:
throw new IllegalArgumentException("Unrecognized version list id: " + id); throw new IllegalArgumentException("Unrecognized version list id: " + id);
} }
@ -60,13 +77,13 @@ public class BMCLAPIDownloadProvider implements DownloadProvider {
@Override @Override
public String injectURL(String baseURL) { public String injectURL(String baseURL) {
return baseURL return baseURL
.replace("https://launchermeta.mojang.com", "https://bmclapi2.bangbang93.com") .replace("https://launchermeta.mojang.com", apiRoot)
.replace("https://launcher.mojang.com", "https://bmclapi2.bangbang93.com") .replace("https://launcher.mojang.com", apiRoot)
.replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries") .replace("https://libraries.minecraft.net", apiRoot + "/libraries")
.replaceFirst("https?://files\\.minecraftforge\\.net/maven", "https://bmclapi2.bangbang93.com/maven") .replaceFirst("https?://files\\.minecraftforge\\.net/maven", apiRoot + "/maven")
.replace("http://dl.liteloader.com/versions/versions.json", "https://bmclapi2.bangbang93.com/maven/com/mumfrey/liteloader/versions.json") .replace("http://dl.liteloader.com/versions/versions.json", apiRoot + "/maven/com/mumfrey/liteloader/versions.json")
.replace("http://dl.liteloader.com/versions", "https://bmclapi2.bangbang93.com/maven") .replace("http://dl.liteloader.com/versions", apiRoot + "/maven")
.replace("https://authlib-injector.yushi.moe", "https://bmclapi2.bangbang93.com/mirrors/authlib-injector"); .replace("https://authlib-injector.yushi.moe", apiRoot + "/mirrors/authlib-injector");
} }
} }

View File

@ -92,7 +92,7 @@ public class DefaultDependencyManager extends AbstractDependencyManager {
if (baseVersion.isResolved()) throw new IllegalArgumentException("Version should not be resolved"); if (baseVersion.isResolved()) throw new IllegalArgumentException("Version should not be resolved");
VersionList<?> versionList = getVersionList(libraryId); VersionList<?> versionList = getVersionList(libraryId);
return versionList.loadAsync(gameVersion, getDownloadProvider()) return versionList.loadAsync(gameVersion)
.thenComposeAsync(() -> installLibraryAsync(baseVersion, versionList.getVersion(gameVersion, libraryVersion) .thenComposeAsync(() -> installLibraryAsync(baseVersion, versionList.getVersion(gameVersion, libraryVersion)
.orElseThrow(() -> new IOException("Remote library " + libraryId + " has no version " + libraryVersion)))); .orElseThrow(() -> new IOException("Remote library " + libraryId + " has no version " + libraryVersion))));
} }

View File

@ -28,6 +28,19 @@ import org.jackhuang.hmcl.download.optifine.OptiFineBMCLVersionList;
* @author huangyuhui * @author huangyuhui
*/ */
public class MojangDownloadProvider implements DownloadProvider { public class MojangDownloadProvider implements DownloadProvider {
private final GameVersionList game;
private final ForgeBMCLVersionList forge;
private final LiteLoaderVersionList liteLoader;
private final OptiFineBMCLVersionList optifine;
public MojangDownloadProvider() {
String apiRoot = "https://bmclapi2.bangbang93.com";
this.game = new GameVersionList(this);
this.forge = new ForgeBMCLVersionList(apiRoot);
this.liteLoader = new LiteLoaderVersionList(this);
this.optifine = new OptiFineBMCLVersionList(apiRoot);
}
@Override @Override
public String getVersionListURL() { public String getVersionListURL() {
@ -43,15 +56,15 @@ public class MojangDownloadProvider implements DownloadProvider {
public VersionList<?> getVersionListById(String id) { public VersionList<?> getVersionListById(String id) {
switch (id) { switch (id) {
case "game": case "game":
return GameVersionList.INSTANCE; return game;
case "fabric": case "fabric":
return FabricVersionList.INSTANCE; return FabricVersionList.INSTANCE;
case "forge": case "forge":
return ForgeBMCLVersionList.INSTANCE; return forge;
case "liteloader": case "liteloader":
return LiteLoaderVersionList.INSTANCE; return liteLoader;
case "optifine": case "optifine":
return OptiFineBMCLVersionList.INSTANCE; return optifine;
default: default:
throw new IllegalArgumentException("Unrecognized version list id: " + id); throw new IllegalArgumentException("Unrecognized version list id: " + id);
} }

View File

@ -59,21 +59,19 @@ public abstract class VersionList<T extends RemoteVersion> {
protected final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); protected final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
/** /**
* @param downloadProvider DownloadProvider
* @return the task to reload the remote version list. * @return the task to reload the remote version list.
*/ */
public abstract Task<?> refreshAsync(DownloadProvider downloadProvider); public abstract Task<?> refreshAsync();
/** /**
* @param gameVersion the remote version depends on * @param gameVersion the remote version depends on
* @param downloadProvider DownloadProvider
* @return the task to reload the remote version list. * @return the task to reload the remote version list.
*/ */
public Task<?> refreshAsync(String gameVersion, DownloadProvider downloadProvider) { public Task<?> refreshAsync(String gameVersion) {
return refreshAsync(downloadProvider); return refreshAsync();
} }
public Task<?> loadAsync(DownloadProvider downloadProvider) { public Task<?> loadAsync() {
return Task.composeAsync(() -> { return Task.composeAsync(() -> {
lock.readLock().lock(); lock.readLock().lock();
boolean loaded; boolean loaded;
@ -83,11 +81,11 @@ public abstract class VersionList<T extends RemoteVersion> {
} finally { } finally {
lock.readLock().unlock(); lock.readLock().unlock();
} }
return loaded ? null : refreshAsync(downloadProvider); return loaded ? null : refreshAsync();
}); });
} }
public Task<?> loadAsync(String gameVersion, DownloadProvider downloadProvider) { public Task<?> loadAsync(String gameVersion) {
return Task.composeAsync(() -> { return Task.composeAsync(() -> {
lock.readLock().lock(); lock.readLock().lock();
boolean loaded; boolean loaded;
@ -97,7 +95,7 @@ public abstract class VersionList<T extends RemoteVersion> {
} finally { } finally {
lock.readLock().unlock(); lock.readLock().unlock();
} }
return loaded ? null : refreshAsync(gameVersion, downloadProvider); return loaded ? null : refreshAsync(gameVersion);
}); });
} }

View File

@ -18,7 +18,6 @@
package org.jackhuang.hmcl.download.fabric; package org.jackhuang.hmcl.download.fabric;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import org.jackhuang.hmcl.download.DownloadProvider;
import org.jackhuang.hmcl.download.VersionList; import org.jackhuang.hmcl.download.VersionList;
import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.Task;
import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.gson.JsonUtils;
@ -47,7 +46,7 @@ public final class FabricVersionList extends VersionList<FabricRemoteVersion> {
} }
@Override @Override
public Task<?> refreshAsync(DownloadProvider downloadProvider) { public Task<?> refreshAsync() {
return new Task<Void>() { return new Task<Void>() {
@Override @Override
public void execute() throws IOException, XMLStreamException { public void execute() throws IOException, XMLStreamException {

View File

@ -19,7 +19,6 @@ package org.jackhuang.hmcl.download.forge;
import com.google.gson.JsonParseException; import com.google.gson.JsonParseException;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import org.jackhuang.hmcl.download.DownloadProvider;
import org.jackhuang.hmcl.download.VersionList; import org.jackhuang.hmcl.download.VersionList;
import org.jackhuang.hmcl.task.GetTask; import org.jackhuang.hmcl.task.GetTask;
import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.Task;
@ -31,16 +30,23 @@ import org.jackhuang.hmcl.util.io.NetworkUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.*; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Lang.mapOf;
import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.Pair.pair;
public final class ForgeBMCLVersionList extends VersionList<ForgeRemoteVersion> { public final class ForgeBMCLVersionList extends VersionList<ForgeRemoteVersion> {
private final String apiRoot;
public static final ForgeBMCLVersionList INSTANCE = new ForgeBMCLVersionList(); /**
* @param apiRoot API Root of BMCLAPI implementations
private ForgeBMCLVersionList() { */
public ForgeBMCLVersionList(String apiRoot) {
this.apiRoot = apiRoot;
} }
@Override @Override
@ -49,18 +55,18 @@ public final class ForgeBMCLVersionList extends VersionList<ForgeRemoteVersion>
} }
@Override @Override
public Task<?> loadAsync(DownloadProvider downloadProvider) { public Task<?> loadAsync() {
throw new UnsupportedOperationException("ForgeBMCLVersionList does not support loading the entire Forge remote version list."); throw new UnsupportedOperationException("ForgeBMCLVersionList does not support loading the entire Forge remote version list.");
} }
@Override @Override
public Task<?> refreshAsync(DownloadProvider downloadProvider) { public Task<?> refreshAsync() {
throw new UnsupportedOperationException("ForgeBMCLVersionList does not support loading the entire Forge remote version list."); throw new UnsupportedOperationException("ForgeBMCLVersionList does not support loading the entire Forge remote version list.");
} }
@Override @Override
public Task<?> refreshAsync(String gameVersion, DownloadProvider downloadProvider) { public Task<?> refreshAsync(String gameVersion) {
final GetTask task = new GetTask(NetworkUtils.toURL("https://bmclapi2.bangbang93.com/forge/minecraft/" + gameVersion)); final GetTask task = new GetTask(NetworkUtils.toURL(apiRoot + "/forge/minecraft/" + gameVersion));
return new Task<Void>() { return new Task<Void>() {
@Override @Override
public Collection<Task<?>> getDependents() { public Collection<Task<?>> getDependents() {
@ -86,15 +92,15 @@ public final class ForgeBMCLVersionList extends VersionList<ForgeRemoteVersion>
+ (StringUtils.isNotBlank(version.getBranch()) ? "-" + version.getBranch() : ""); + (StringUtils.isNotBlank(version.getBranch()) ? "-" + version.getBranch() : "");
String fileName1 = "forge-" + classifier + "-" + file.getCategory() + "." + file.getFormat(); String fileName1 = "forge-" + classifier + "-" + file.getCategory() + "." + file.getFormat();
String fileName2 = "forge-" + classifier + "-" + gameVersion + "-" + file.getCategory() + "." + file.getFormat(); String fileName2 = "forge-" + classifier + "-" + gameVersion + "-" + file.getCategory() + "." + file.getFormat();
urls.add(NetworkUtils.withQuery("https://bmclapi2.bangbang93.com/forge/download", mapOf( urls.add(NetworkUtils.withQuery(apiRoot + "/forge/download", mapOf(
pair("mcversion", version.getGameVersion()), pair("mcversion", version.getGameVersion()),
pair("version", version.getVersion()), pair("version", version.getVersion()),
pair("branch", version.getBranch()), pair("branch", version.getBranch()),
pair("category", file.getCategory()), pair("category", file.getCategory()),
pair("format", file.getFormat()) pair("format", file.getFormat())
))); )));
urls.add("https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/" + classifier + "/" + fileName1); urls.add(apiRoot + "/maven/net/minecraftforge/forge/" + classifier + "/" + fileName1);
urls.add("https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/" + classifier + "-" + gameVersion + "/" + fileName2); urls.add(apiRoot + "/maven/net/minecraftforge/forge/" + classifier + "-" + gameVersion + "/" + fileName2);
} }
if (urls.isEmpty()) if (urls.isEmpty())

View File

@ -33,10 +33,10 @@ import java.util.*;
* @author huangyuhui * @author huangyuhui
*/ */
public final class ForgeVersionList extends VersionList<ForgeRemoteVersion> { public final class ForgeVersionList extends VersionList<ForgeRemoteVersion> {
private final DownloadProvider downloadProvider;
public static final ForgeVersionList INSTANCE = new ForgeVersionList(); public ForgeVersionList(DownloadProvider downloadProvider) {
this.downloadProvider = downloadProvider;
private ForgeVersionList() {
} }
@Override @Override
@ -45,7 +45,7 @@ public final class ForgeVersionList extends VersionList<ForgeRemoteVersion> {
} }
@Override @Override
public Task<?> refreshAsync(DownloadProvider downloadProvider) { public Task<?> refreshAsync() {
final GetTask task = new GetTask(NetworkUtils.toURL(downloadProvider.injectURL(FORGE_LIST))); final GetTask task = new GetTask(NetworkUtils.toURL(downloadProvider.injectURL(FORGE_LIST)));
return new Task<Void>() { return new Task<Void>() {

View File

@ -32,10 +32,10 @@ import java.util.Collections;
* @author huangyuhui * @author huangyuhui
*/ */
public final class GameVersionList extends VersionList<GameRemoteVersion> { public final class GameVersionList extends VersionList<GameRemoteVersion> {
private final DownloadProvider downloadProvider;
public static final GameVersionList INSTANCE = new GameVersionList(); public GameVersionList(DownloadProvider downloadProvider) {
this.downloadProvider = downloadProvider;
private GameVersionList() {
} }
@Override @Override
@ -54,7 +54,7 @@ public final class GameVersionList extends VersionList<GameRemoteVersion> {
} }
@Override @Override
public Task<?> refreshAsync(DownloadProvider downloadProvider) { public Task<?> refreshAsync() {
GetTask task = new GetTask(NetworkUtils.toURL(downloadProvider.getVersionListURL())); GetTask task = new GetTask(NetworkUtils.toURL(downloadProvider.getVersionListURL()));
return new Task<Void>() { return new Task<Void>() {
@Override @Override

View File

@ -25,12 +25,10 @@ import org.jackhuang.hmcl.task.Task;
import org.jackhuang.hmcl.util.io.NetworkUtils; import org.jackhuang.hmcl.util.io.NetworkUtils;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.charset.StandardCharsets.UTF_8;
@ -51,7 +49,7 @@ public final class VersionJsonDownloadTask extends Task<String> {
this.gameVersionList = dependencyManager.getVersionList("game"); this.gameVersionList = dependencyManager.getVersionList("game");
if (!gameVersionList.isLoaded()) if (!gameVersionList.isLoaded())
dependents.add(gameVersionList.refreshAsync(dependencyManager.getDownloadProvider())); dependents.add(gameVersionList.refreshAsync());
setSignificance(TaskSignificance.MODERATE); setSignificance(TaskSignificance.MODERATE);
} }

View File

@ -17,7 +17,7 @@
*/ */
package org.jackhuang.hmcl.download.liteloader; package org.jackhuang.hmcl.download.liteloader;
import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.BMCLAPIDownloadProvider;
import org.jackhuang.hmcl.download.VersionList; import org.jackhuang.hmcl.download.VersionList;
import org.jackhuang.hmcl.task.GetTask; import org.jackhuang.hmcl.task.GetTask;
import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.Task;
@ -39,10 +39,10 @@ import java.util.Map;
* @author huangyuhui * @author huangyuhui
*/ */
public final class LiteLoaderBMCLVersionList extends VersionList<LiteLoaderRemoteVersion> { public final class LiteLoaderBMCLVersionList extends VersionList<LiteLoaderRemoteVersion> {
private final BMCLAPIDownloadProvider downloadProvider;
public static final LiteLoaderBMCLVersionList INSTANCE = new LiteLoaderBMCLVersionList(); public LiteLoaderBMCLVersionList(BMCLAPIDownloadProvider downloadProvider) {
this.downloadProvider = downloadProvider;
private LiteLoaderBMCLVersionList() {
} }
@Override @Override
@ -51,7 +51,7 @@ public final class LiteLoaderBMCLVersionList extends VersionList<LiteLoaderRemot
} }
@Override @Override
public Task<?> refreshAsync(DownloadProvider downloadProvider) { public Task<?> refreshAsync() {
GetTask task = new GetTask(NetworkUtils.toURL(downloadProvider.injectURL(LITELOADER_LIST))); GetTask task = new GetTask(NetworkUtils.toURL(downloadProvider.injectURL(LITELOADER_LIST)));
return new Task<Void>() { return new Task<Void>() {
@Override @Override
@ -91,7 +91,7 @@ public final class LiteLoaderBMCLVersionList extends VersionList<LiteLoaderRemot
continue; continue;
String version = v.getVersion(); String version = v.getVersion();
String url = "http://bmclapi2.bangbang93.com/liteloader/download?version=" + version; String url = downloadProvider.getApiRoot() + "/liteloader/download?version=" + version;
if (snapshot) { if (snapshot) {
try { try {
version = version.replace("SNAPSHOT", getLatestSnapshotVersion(repository.getUrl() + "com/mumfrey/liteloader/" + v.getVersion() + "/")); version = version.replace("SNAPSHOT", getLatestSnapshotVersion(repository.getUrl() + "com/mumfrey/liteloader/" + v.getVersion() + "/"));

View File

@ -40,9 +40,10 @@ import java.util.Map;
*/ */
public final class LiteLoaderVersionList extends VersionList<LiteLoaderRemoteVersion> { public final class LiteLoaderVersionList extends VersionList<LiteLoaderRemoteVersion> {
public static final LiteLoaderVersionList INSTANCE = new LiteLoaderVersionList(); private final DownloadProvider downloadProvider;
private LiteLoaderVersionList() { public LiteLoaderVersionList(DownloadProvider downloadProvider) {
this.downloadProvider = downloadProvider;
} }
@Override @Override
@ -51,7 +52,7 @@ public final class LiteLoaderVersionList extends VersionList<LiteLoaderRemoteVer
} }
@Override @Override
public Task<?> refreshAsync(DownloadProvider downloadProvider) { public Task<?> refreshAsync() {
GetTask task = new GetTask(NetworkUtils.toURL(downloadProvider.injectURL(LITELOADER_LIST))); GetTask task = new GetTask(NetworkUtils.toURL(downloadProvider.injectURL(LITELOADER_LIST)));
return new Task<Void>() { return new Task<Void>() {
@Override @Override

View File

@ -18,7 +18,6 @@
package org.jackhuang.hmcl.download.optifine; package org.jackhuang.hmcl.download.optifine;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import org.jackhuang.hmcl.download.DownloadProvider;
import org.jackhuang.hmcl.download.VersionList; import org.jackhuang.hmcl.download.VersionList;
import org.jackhuang.hmcl.task.GetTask; import org.jackhuang.hmcl.task.GetTask;
import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.Task;
@ -27,17 +26,24 @@ import org.jackhuang.hmcl.util.gson.JsonUtils;
import org.jackhuang.hmcl.util.io.NetworkUtils; import org.jackhuang.hmcl.util.io.NetworkUtils;
import org.jackhuang.hmcl.util.versioning.VersionNumber; import org.jackhuang.hmcl.util.versioning.VersionNumber;
import java.util.*; import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/** /**
* *
* @author huangyuhui * @author huangyuhui
*/ */
public final class OptiFineBMCLVersionList extends VersionList<OptiFineRemoteVersion> { public final class OptiFineBMCLVersionList extends VersionList<OptiFineRemoteVersion> {
private final String apiRoot;
public static final OptiFineBMCLVersionList INSTANCE = new OptiFineBMCLVersionList(); /**
* @param apiRoot API Root of BMCLAPI implementations
private OptiFineBMCLVersionList() { */
public OptiFineBMCLVersionList(String apiRoot) {
this.apiRoot = apiRoot;
} }
@Override @Override
@ -46,8 +52,8 @@ public final class OptiFineBMCLVersionList extends VersionList<OptiFineRemoteVer
} }
@Override @Override
public Task<?> refreshAsync(DownloadProvider downloadProvider) { public Task<?> refreshAsync() {
GetTask task = new GetTask(NetworkUtils.toURL("http://bmclapi2.bangbang93.com/optifine/versionlist")); GetTask task = new GetTask(NetworkUtils.toURL(apiRoot + "/optifine/versionlist"));
return new Task<Void>() { return new Task<Void>() {
@Override @Override
public Collection<Task<?>> getDependents() { public Collection<Task<?>> getDependents() {
@ -65,7 +71,7 @@ public final class OptiFineBMCLVersionList extends VersionList<OptiFineRemoteVer
}.getType()); }.getType());
for (OptiFineVersion element : root) { for (OptiFineVersion element : root) {
String version = element.getType() + "_" + element.getPatch(); String version = element.getType() + "_" + element.getPatch();
String mirror = "http://bmclapi2.bangbang93.com/optifine/" + element.getGameVersion() + "/" + element.getType() + "/" + element.getPatch(); String mirror = apiRoot + "/optifine/" + element.getGameVersion() + "/" + element.getType() + "/" + element.getPatch();
if (!duplicates.add(mirror)) if (!duplicates.add(mirror))
continue; continue;