From aa14a4c89f9a96e5dbde721e09b76673c4c6c610 Mon Sep 17 00:00:00 2001 From: bivashy Date: Tue, 24 Mar 2026 22:18:56 +0500 Subject: [PATCH] Include grouped by translations result --- .../kodik/api/model/KodikResponse.java | 36 +++++++++++++++ .../service/KodikSearchFilterService.java | 46 ++++++++++--------- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/backend/metadata/kodik/api/model/KodikResponse.java b/src/main/java/com/backend/metadata/kodik/api/model/KodikResponse.java index 7278381..95a5449 100644 --- a/src/main/java/com/backend/metadata/kodik/api/model/KodikResponse.java +++ b/src/main/java/com/backend/metadata/kodik/api/model/KodikResponse.java @@ -2,6 +2,7 @@ package com.backend.metadata.kodik.api.model; import java.util.List; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -25,6 +26,7 @@ public class KodikResponse { @JsonProperty("other_title") public String otherTitle; public Translation translation; + public List translations; public int year; @JsonProperty("last_season") public int lastSeason; @@ -71,6 +73,40 @@ public class KodikResponse { public int id; public String title; public String type; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + id; + result = prime * result + ((title == null) ? 0 : title.hashCode()); + result = prime * result + ((type == null) ? 0 : type.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Translation other = (Translation) obj; + if (id != other.id) + return false; + if (title == null) { + if (other.title != null) + return false; + } else if (!title.equals(other.title)) + return false; + if (type == null) { + if (other.type != null) + return false; + } else if (!type.equals(other.type)) + return false; + return true; + } } @Override diff --git a/src/main/java/com/backend/metadata/kodik/service/KodikSearchFilterService.java b/src/main/java/com/backend/metadata/kodik/service/KodikSearchFilterService.java index 3429882..4224730 100644 --- a/src/main/java/com/backend/metadata/kodik/service/KodikSearchFilterService.java +++ b/src/main/java/com/backend/metadata/kodik/service/KodikSearchFilterService.java @@ -1,13 +1,14 @@ package com.backend.metadata.kodik.service; -import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; - -import org.jboss.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.Stream; import com.backend.metadata.kodik.api.model.KodikResponse; @@ -16,31 +17,34 @@ import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class KodikSearchFilterService { - private static final Logger LOG = Logger.getLogger(KodikSearchFilterService.class); private static final Set ALLOWED_TYPES = Set.of("anime-serial", "anime"); public List filter(List target) { - return filter(target, new HashSet<>()); + return filter(target, Collections.emptyList()); } public List filter(List target, List fullSeen) { - Set seenIds = new HashSet<>(); - for (KodikResponse.Result seen : fullSeen) { - seenIds.add(identifier(seen)); - } - return filter(target, seenIds); - } + Set seenIds = fullSeen.stream() + .map(this::identifier) + .collect(Collectors.toSet()); - public List filter(List target, Set seenIds) { - Objects.requireNonNull(target, "target cannot be null"); - List filteredResults = new ArrayList<>(); + Map> grouped = Stream.concat(fullSeen.stream(), target.stream()) + .filter(this::isAllowedType) + .collect(Collectors.groupingBy(this::identifier, LinkedHashMap::new, Collectors.toList())); - for (KodikResponse.Result result : target) { - if (isAllowedType(result) && isUnique(result, seenIds)) { - filteredResults.add(result); - } - } - return filteredResults; + return grouped.entrySet().stream() + .filter(e -> !seenIds.contains(e.getKey())) + .map(entry -> { + List group = entry.getValue(); + KodikResponse.Result first = group.get(0); + first.translations = group.stream() + .map(r -> r.translation) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + return first; + }) + .collect(Collectors.toList()); } private boolean isAllowedType(KodikResponse.Result result) {