diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java index 29b8fb5a13d..8dfa37de00b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java @@ -47,33 +47,42 @@ public SearchResult search(DownloadProvider downloadProvider, String gameVersion return getBackedRemoteModRepository().search(downloadProvider, gameVersion, category, pageOffset, pageSize, searchFilter, sort, sortOrder); } - Set englishSearchFiltersSet = new HashSet<>(INITIAL_CAPACITY); + Set englishSearchFiltersSet = new LinkedHashSet<>(INITIAL_CAPACITY); int count = 0; for (ModTranslations.Mod mod : ModTranslations.getTranslationsByRepositoryType(getType()).searchMod(searchFilter)) { - for (String englishWord : StringUtils.tokenize(StringUtils.isNotBlank(mod.getSubname()) ? mod.getSubname() : mod.getName())) { - if (englishSearchFiltersSet.contains(englishWord)) { - continue; - } - - englishSearchFiltersSet.add(englishWord); + String englishSearchFilter = String.join(" ", StringUtils.tokenize(StringUtils.isNotBlank(mod.getSubname()) ? mod.getSubname() : mod.getName())); + if (StringUtils.isNotBlank(englishSearchFilter)) { + englishSearchFiltersSet.add(englishSearchFilter); } count++; if (count >= 3) break; } + if (englishSearchFiltersSet.isEmpty()) { + return getBackedRemoteModRepository().search(downloadProvider, gameVersion, category, pageOffset, pageSize, searchFilter, sort, sortOrder); + } + RemoteMod[] searchResultArray = new RemoteMod[pageSize]; int totalPages, chineseIndex = 0, englishIndex = pageSize - 1; { - SearchResult searchResult = getBackedRemoteModRepository().search(downloadProvider, gameVersion, category, pageOffset, pageSize, String.join(" ", englishSearchFiltersSet), getBackedRemoteModRepositorySortOrder(), sortOrder); - for (Iterator iterator = searchResult.getUnsortedResults().iterator(); iterator.hasNext(); ) { + SearchResult searchResult = null; + List remoteMods = List.of(); + for (String englishSearchFilter : englishSearchFiltersSet) { + searchResult = getBackedRemoteModRepository().search(downloadProvider, gameVersion, category, pageOffset, pageSize, englishSearchFilter, getBackedRemoteModRepositorySortOrder(), sortOrder); + remoteMods = searchResult.getUnsortedResults().toList(); + if (!remoteMods.isEmpty()) { + break; + } + } + + for (RemoteMod remoteMod : remoteMods) { if (chineseIndex > englishIndex) { LOG.warning("Too many search results! Are the backed remote mod repository broken? Or are the API broken?"); continue; } - RemoteMod remoteMod = iterator.next(); ModTranslations.Mod chineseTranslation = ModTranslations.getTranslationsByRepositoryType(getType()).getModByCurseForgeId(remoteMod.getSlug()); if (chineseTranslation != null && !StringUtils.isBlank(chineseTranslation.getName()) && StringUtils.containsChinese(chineseTranslation.getName())) { searchResultArray[chineseIndex++] = remoteMod;