diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java index e919424ed3..504135c05f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java @@ -196,6 +196,7 @@ private List loadVersions() { switch (it.getVersionType()) { case RELEASE: return chkRelease.isSelected(); + case PENDING: case SNAPSHOT: return chkSnapshot.isSelected(); case OLD: @@ -308,6 +309,7 @@ public void updateItem(RemoteVersion remoteVersion, boolean empty) { content.getTags().setAll(i18n("version.game.release")); content.setImage(VersionIconType.GRASS.getIcon()); break; + case PENDING: case SNAPSHOT: content.getTags().setAll(i18n("version.game.snapshot")); content.setImage(VersionIconType.COMMAND.getIcon()); @@ -317,6 +319,9 @@ public void updateItem(RemoteVersion remoteVersion, boolean empty) { content.setImage(VersionIconType.CRAFT_TABLE.getIcon()); break; } + if (remoteVersion.getUrls().stream().anyMatch(url -> url.contains("unlisted-versions-of-minecraft"))) { + content.getTags().add("Unlisted Minecraft"); + } } else { VersionIconType iconType; if (remoteVersion instanceof LiteLoaderRemoteVersion) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/AdaptedDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/AdaptedDownloadProvider.java index dc729b1e10..3495cc4474 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/AdaptedDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/AdaptedDownloadProvider.java @@ -48,6 +48,11 @@ public String getVersionListURL() { return getPreferredDownloadProvider().getVersionListURL(); } + @Override + public String getUnlistedMinecraftURL() { + return getPreferredDownloadProvider().getUnlistedMinecraftURL(); + } + @Override public String getAssetBaseURL() { return getPreferredDownloadProvider().getAssetBaseURL(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/AutoDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/AutoDownloadProvider.java index f2db0d6dd4..9d1bf7c200 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/AutoDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/AutoDownloadProvider.java @@ -40,6 +40,11 @@ public String getVersionListURL() { return versionListProvider.getVersionListURL(); } + @Override + public String getUnlistedMinecraftURL() { + return versionListProvider.getUnlistedMinecraftURL(); + } + @Override public String getAssetBaseURL() { return fileProvider.getAssetBaseURL(); 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 f0244339f0..00843d6ebb 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java @@ -77,7 +77,8 @@ public BMCLAPIDownloadProvider(String apiRoot) { pair("https://meta.fabricmc.net", apiRoot + "/fabric-meta"), pair("https://maven.fabricmc.net", apiRoot + "/maven"), pair("https://authlib-injector.yushi.moe", apiRoot + "/mirrors/authlib-injector"), - pair("https://repo1.maven.org/maven2", "https://mirrors.cloud.tencent.com/nexus/repository/maven-public") + pair("https://repo1.maven.org/maven2", "https://mirrors.cloud.tencent.com/nexus/repository/maven-public"), + pair("https://zkitefly.github.io/unlisted-versions-of-minecraft", "https://vip.123pan.cn/1821946486/unlisted-versions-of-minecraft") ); } @@ -90,6 +91,11 @@ public String getVersionListURL() { return apiRoot + "/mc/game/version_manifest.json"; } + @Override + public String getUnlistedMinecraftURL() { + return "https://vip.123pan.cn/1821946486/unlisted-versions-of-minecraft/version_manifest.json"; + } + @Override public String getAssetBaseURL() { return apiRoot + "/assets/"; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BalancedDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BalancedDownloadProvider.java index 32afd93b31..23e2ae0b89 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BalancedDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BalancedDownloadProvider.java @@ -39,6 +39,11 @@ public String getVersionListURL() { throw new UnsupportedOperationException(); } + @Override + public String getUnlistedMinecraftURL() { + throw new UnsupportedOperationException(); + } + @Override public String getAssetBaseURL() { throw new UnsupportedOperationException(); 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 a1f6fd45df..99a2b21524 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DownloadProvider.java @@ -33,6 +33,8 @@ public interface DownloadProvider { String getVersionListURL(); + String getUnlistedMinecraftURL(); + String getAssetBaseURL(); default List getAssetObjectCandidates(String assetObjectLocation) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java index a0a677f250..1e7b9acc59 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java @@ -62,6 +62,11 @@ public String getVersionListURL() { return "https://piston-meta.mojang.com/mc/game/version_manifest.json"; } + @Override + public String getUnlistedMinecraftURL() { + return "https://zkitefly.github.io/unlisted-versions-of-minecraft/version_manifest.json"; + } + @Override public String getAssetBaseURL() { return "https://resources.download.minecraft.net/"; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/RemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/RemoteVersion.java index 4bc1a90c04..ea3f4155aa 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/RemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/RemoteVersion.java @@ -127,6 +127,7 @@ public enum Type { UNCATEGORIZED, RELEASE, SNAPSHOT, - OLD + OLD, + PENDING } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersion.java index 64b9a0e10e..1bdc9913d0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersion.java @@ -68,6 +68,8 @@ private static Type getReleaseType(ReleaseType type) { return Type.SNAPSHOT; case UNKNOWN: return Type.UNCATEGORIZED; + case PENDING: + return Type.PENDING; default: return Type.OLD; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameVersionList.java index 4d04b76a5e..afe1f86bb7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameVersionList.java @@ -24,6 +24,7 @@ import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; +import java.util.stream.Stream; /** * @@ -48,19 +49,30 @@ protected Collection getVersionsImpl(String gameVersion) { @Override public CompletableFuture refreshAsync() { - return HttpRequest.GET(downloadProvider.getVersionListURL()).getJsonAsync(GameRemoteVersions.class) - .thenAcceptAsync(root -> { + CompletableFuture primaryFuture = HttpRequest.GET(downloadProvider.getVersionListURL()) + .getJsonAsync(GameRemoteVersions.class); + + CompletableFuture unlistedMinecraftFuture = HttpRequest.GET(downloadProvider.getUnlistedMinecraftURL()) + .getJsonAsync(GameRemoteVersions.class); + + return CompletableFuture.allOf(primaryFuture, unlistedMinecraftFuture) + .thenAcceptAsync(ignored -> { lock.writeLock().lock(); try { versions.clear(); - for (GameRemoteVersionInfo remoteVersion : root.getVersions()) { - versions.put(remoteVersion.getGameVersion(), new GameRemoteVersion( - remoteVersion.getGameVersion(), - remoteVersion.getGameVersion(), - Collections.singletonList(remoteVersion.getUrl()), - remoteVersion.getType(), remoteVersion.getReleaseTime())); - } + Stream.of(primaryFuture.join(), unlistedMinecraftFuture.join()) + .flatMap(gameRemoteVersions -> gameRemoteVersions.getVersions().stream()) + .forEach(remoteVersion -> versions.put( + remoteVersion.getGameVersion(), + new GameRemoteVersion( + remoteVersion.getGameVersion(), + remoteVersion.getGameVersion(), + Collections.singletonList(remoteVersion.getUrl()), + remoteVersion.getType(), + remoteVersion.getReleaseTime() + ) + )); } finally { lock.writeLock().unlock(); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ReleaseType.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ReleaseType.java index 427efdffff..aa88ca4bdb 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ReleaseType.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ReleaseType.java @@ -27,6 +27,7 @@ public enum ReleaseType { MODIFIED("modified"), OLD_BETA("old-beta"), OLD_ALPHA("old-alpha"), + PENDING("pending"), UNKNOWN("unknown"); private final String id;