diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java index 61785cb2c..e92023fa8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java @@ -79,6 +79,7 @@ public class BMCLAPIDownloadProvider implements DownloadProvider { @Override public String injectURL(String baseURL) { return baseURL + .replace("https://bmclapi2.bangbang93.com", apiRoot) .replace("https://launchermeta.mojang.com", apiRoot) .replace("https://launcher.mojang.com", apiRoot) .replace("https://libraries.minecraft.net", apiRoot + "/libraries") diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DownloadProvider.java index 8492611e3..4229a3334 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DownloadProvider.java @@ -17,9 +17,6 @@ */ package org.jackhuang.hmcl.download; -import java.util.Arrays; -import java.util.stream.Stream; - /** * The service provider that provides Minecraft online file downloads. * @@ -42,12 +39,6 @@ public interface DownloadProvider { */ String injectURL(String baseURL); - default Stream injectURLs(String[] baseURLs) { - Stream urls = Arrays.stream(baseURLs); - Stream jsonURLs = Arrays.stream(baseURLs).map(this::injectURL); - return Stream.concat(jsonURLs, urls); - } - /** * the specific version list that this download provider provides. i.e. "forge", "liteloader", "game", "optifine" * diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java index e62a9d9ff..275ce04c9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java @@ -31,6 +31,7 @@ import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.NetworkUtils; import java.util.*; +import java.util.stream.Collectors; /** * Note: Fabric should be installed first. @@ -50,7 +51,9 @@ public final class FabricInstallTask extends Task { this.version = version; this.remote = remoteVersion; - launchMetaTask = new GetTask(NetworkUtils.toURL(dependencyManager.getPrimaryDownloadProvider().injectURL(getLaunchMetaUrl(remote.getGameVersion(), remote.getSelfVersion())))) + launchMetaTask = new GetTask(dependencyManager.getPreferredDownloadProviders().stream() + .map(downloadProvider -> downloadProvider.injectURL(getLaunchMetaUrl(remote.getGameVersion(), remote.getSelfVersion()))) + .map(NetworkUtils::toURL).collect(Collectors.toList())) .setCacheRepository(dependencyManager.getCacheRepository()); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java index 201f04f15..81fa368d7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java @@ -30,11 +30,7 @@ import org.jackhuang.hmcl.util.io.NetworkUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.util.*; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Pair.pair; @@ -92,9 +88,9 @@ public final class ForgeBMCLVersionList extends VersionList + (StringUtils.isNotBlank(version.getBranch()) ? "-" + version.getBranch() : ""); String fileName1 = "forge-" + classifier + "-" + file.getCategory() + "." + file.getFormat(); String fileName2 = "forge-" + classifier + "-" + gameVersion + "-" + file.getCategory() + "." + file.getFormat(); - urls.add(apiRoot + "/maven/net/minecraftforge/forge/" + classifier + "-" + gameVersion + "/" + fileName2); - urls.add(apiRoot + "/maven/net/minecraftforge/forge/" + classifier + "/" + fileName1); - urls.add(NetworkUtils.withQuery(apiRoot + "/forge/download", mapOf( + urls.add("https://files.minecraftforge.net/maven/net/minecraftforge/forge/" + classifier + "-" + gameVersion + "/" + fileName2); + urls.add("https://files.minecraftforge.net/maven/net/minecraftforge/forge/" + classifier + "/" + fileName1); + urls.add(NetworkUtils.withQuery("https://bmclapi2.bangbang93.com/forge/download", mapOf( pair("mcversion", version.getGameVersion()), pair("version", version.getVersion()), pair("branch", version.getBranch()), diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java index 734b97f21..dd558f34c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java @@ -68,9 +68,9 @@ public final class ForgeInstallTask extends Task { installer = Files.createTempFile("forge-installer", ".jar"); dependent = new FileDownloadTask( - Arrays.stream(remote.getUrl()) - .map(NetworkUtils::toURL) - .collect(Collectors.toList()), + dependencyManager.getPreferredDownloadProviders().stream() + .flatMap(downloadProvider -> Arrays.stream(remote.getUrl()).map(downloadProvider::injectURL)) + .map(NetworkUtils::toURL).collect(Collectors.toList()), installer.toFile(), null) .setCacheRepository(dependencyManager.getCacheRepository()) .setCaching(true); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameDownloadTask.java index 047e23800..f279700c6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameDownloadTask.java @@ -29,6 +29,7 @@ import java.io.File; import java.util.Collection; import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * Task to download Minecraft jar @@ -58,7 +59,9 @@ public final class GameDownloadTask extends Task { File jar = dependencyManager.getGameRepository().getVersionJar(version); FileDownloadTask task = new FileDownloadTask( - NetworkUtils.toURL(dependencyManager.getPrimaryDownloadProvider().injectURL(version.getDownloadInfo().getUrl())), + dependencyManager.getPreferredDownloadProviders().stream() + .map(downloadProvider -> downloadProvider.injectURL(version.getDownloadInfo().getUrl())) + .map(NetworkUtils::toURL).collect(Collectors.toList()), jar, IntegrityCheck.of(CacheRepository.SHA1, version.getDownloadInfo().getSha1())) .setCaching(true) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/VersionJsonDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/VersionJsonDownloadTask.java index f5181901c..af4eaad18 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/VersionJsonDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/VersionJsonDownloadTask.java @@ -25,13 +25,12 @@ import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.io.NetworkUtils; import java.io.IOException; +import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; -import static java.nio.charset.StandardCharsets.UTF_8; - /** * * @author huangyuhui @@ -69,8 +68,9 @@ public final class VersionJsonDownloadTask extends Task { RemoteVersion remoteVersion = gameVersionList.getVersion(gameVersion, gameVersion) .orElseThrow(() -> new IOException("Cannot find specific version " + gameVersion + " in remote repository")); dependencies.add(new GetTask( - dependencyManager.getPrimaryDownloadProvider().injectURLs(remoteVersion.getUrl()) - .map(NetworkUtils::toURL).collect(Collectors.toList()), - UTF_8).storeTo(this::setResult)); + dependencyManager.getPreferredDownloadProviders().stream() + .flatMap(downloadProvider -> Arrays.stream(remoteVersion.getUrl()).map(downloadProvider::injectURL)) + .map(NetworkUtils::toURL).collect(Collectors.toList()) + ).storeTo(this::setResult)); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java index 8dcef6f20..d8417d890 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java @@ -91,7 +91,7 @@ public final class LiteLoaderBMCLVersionList extends VersionList { if (installer == null) { dependents.add(new FileDownloadTask( - Arrays.stream(remote.getUrl()).map(NetworkUtils::toURL).collect(Collectors.toList()), + dependencyManager.getPreferredDownloadProviders().stream() + .flatMap(downloadProvider -> Arrays.stream(remote.getUrl()).map(downloadProvider::injectURL)) + .map(NetworkUtils::toURL).collect(Collectors.toList()), dest.toFile(), null) .setCacheRepository(dependencyManager.getCacheRepository()) .setCaching(true)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java index ea37a4f06..ff2bc4114 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java @@ -207,7 +207,6 @@ public class FileDownloadTask extends Task { checkETag = true; } - Logging.LOG.log(Level.FINER, "Downloading " + urls.get(0) + " to " + file); Exception exception = null; URL failedURL = null; @@ -217,6 +216,7 @@ public class FileDownloadTask extends Task { break; } + Logging.LOG.log(Level.FINER, "Downloading " + url + " to " + file); Path temp = null; try { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java index 0c93d96d8..5ebe123f0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/GetTask.java @@ -53,22 +53,21 @@ public final class GetTask extends Task { } public GetTask(URL url, Charset charset) { - this(url, charset, 5); + this(url, charset, 3); } public GetTask(URL url, Charset charset, int retry) { - this.urls = Collections.singletonList(url); - this.charset = charset; - this.retry = retry; - - setName(url.toString()); - setExecutor(Schedulers.io()); + this(Collections.singletonList(url), charset, retry); } - public GetTask(List urls, Charset charset) { + public GetTask(List url) { + this(url, UTF_8, 3); + } + + public GetTask(List urls, Charset charset, int retry) { this.urls = new ArrayList<>(urls); this.charset = charset; - this.retry = urls.size(); + this.retry = retry; setName(urls.get(0).toString()); setExecutor(Schedulers.io()); @@ -84,8 +83,12 @@ public final class GetTask extends Task { Exception exception = null; URL failedURL = null; boolean checkETag = true; - for (int time = 0; time < retry; ++time) { - URL url = urls.get(time % urls.size()); + for (int time = 0; time < retry * urls.size(); ++time) { + URL url = urls.get(time / retry); + if (isCancelled()) { + break; + } + try { updateProgress(0); HttpURLConnection conn = NetworkUtils.createConnection(url);