Use collectingAndThen for merging SearchResult objects
This commit is contained in:
parent
38b17a467a
commit
c55882e7d1
|
@ -2,12 +2,14 @@ package net.filebot;
|
|||
|
||||
import static java.util.Arrays.*;
|
||||
import static java.util.Collections.*;
|
||||
import static java.util.stream.Collectors.*;
|
||||
import static net.filebot.Settings.*;
|
||||
import static net.filebot.media.MediaDetection.*;
|
||||
import static net.filebot.util.FileUtilities.*;
|
||||
import static net.filebot.util.StringUtilities.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
@ -138,6 +140,13 @@ public final class WebServices {
|
|||
return localIndex;
|
||||
}
|
||||
|
||||
private SearchResult merge(SearchResult prime, List<SearchResult> group) {
|
||||
int id = prime.getId();
|
||||
String name = prime.getName();
|
||||
String[] aliasNames = StreamEx.of(group).flatMap(it -> stream(it.getAliasNames())).remove(name::equals).distinct().toArray(String[]::new);
|
||||
return new TheTVDBSearchResult(name, aliasNames, id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SearchResult> fetchSearchResult(final String query, final Locale locale) throws Exception {
|
||||
// run local search and API search in parallel
|
||||
|
@ -145,15 +154,9 @@ public final class WebServices {
|
|||
Future<List<SearchResult>> localSearch = requestThreadPool.submit(() -> getLocalIndex().search(query));
|
||||
|
||||
// combine alias names into a single search results, and keep API search name as primary name
|
||||
SearchResult[] result = StreamEx.of(apiSearch.get()).append(localSearch.get()).groupingBy(SearchResult::getId).values().stream().map(group -> {
|
||||
int id = group.get(0).getId();
|
||||
String name = group.get(0).getName();
|
||||
String[] aliasNames = StreamEx.of(group).flatMap(it -> stream(it.getAliasNames())).remove(name::equals).distinct().toArray(String[]::new);
|
||||
Collection<SearchResult> result = StreamEx.of(apiSearch.get()).append(localSearch.get()).groupingBy(SearchResult::getId, collectingAndThen(toList(), group -> merge(group.get(0), group))).values();
|
||||
|
||||
return new TheTVDBSearchResult(name, aliasNames, id);
|
||||
}).toArray(TheTVDBSearchResult[]::new);
|
||||
|
||||
return sortBySimilarity(asList(result), singleton(query), getSeriesMatchMetric());
|
||||
return sortBySimilarity(result, singleton(query), getSeriesMatchMetric());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ package net.filebot.media;
|
|||
|
||||
import static java.util.Collections.*;
|
||||
import static java.util.regex.Pattern.*;
|
||||
import static java.util.stream.Collectors.*;
|
||||
import static net.filebot.MediaTypes.*;
|
||||
import static net.filebot.Settings.*;
|
||||
import static net.filebot.similarity.CommonSequenceMatcher.*;
|
||||
|
@ -41,7 +42,6 @@ import java.util.logging.Level;
|
|||
import java.util.logging.Logger;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import net.filebot.WebServices;
|
||||
import net.filebot.archive.Archive;
|
||||
|
@ -715,10 +715,10 @@ public class MediaDetection {
|
|||
SimilarityComparator<SearchResult, String> comparator = new SimilarityComparator<SearchResult, String>(metric, terms, mapper);
|
||||
|
||||
// DEBUG
|
||||
// System.out.format("sortBySimilarity %s => %s%n", terms, options.stream().sorted(comparator).distinct().collect(Collectors.toList()));
|
||||
// System.out.format("sortBySimilarity %s => %s%n", terms, options.stream().sorted(comparator).distinct().collect(toList()));
|
||||
|
||||
// sort by ranking and remove duplicate entries
|
||||
return options.stream().sorted(comparator).distinct().collect(Collectors.toList());
|
||||
return options.stream().sorted(comparator).distinct().collect(toList());
|
||||
}
|
||||
|
||||
public static List<Movie> sortMoviesBySimilarity(Collection<Movie> options, Collection<String> terms) throws IOException {
|
||||
|
@ -744,7 +744,7 @@ public class MediaDetection {
|
|||
}
|
||||
|
||||
public static List<Integer> parseMovieYear(String name) {
|
||||
return matchIntegers(name).stream().filter(year -> 1950 < year && year < 2050).collect(Collectors.toList());
|
||||
return matchIntegers(name).stream().filter(year -> 1950 < year && year < 2050).collect(toList());
|
||||
}
|
||||
|
||||
public static String reduceMovieName(String name, boolean strict) throws IOException {
|
||||
|
|
Loading…
Reference in New Issue