1
0
mirror of https://github.com/mitb-archive/filebot synced 2025-03-10 06:20:27 -04:00

* guarantee that movies are processed if already well-named also in strict mode

This commit is contained in:
Reinhard Pointner 2014-05-06 18:49:41 +00:00
parent 53e5e48d5f
commit 2f4d43b547
2 changed files with 47 additions and 11 deletions

View File

@ -417,11 +417,21 @@ public class CmdlineOperations implements CmdlineInterface {
// unknown hash, try via imdb id from nfo file // unknown hash, try via imdb id from nfo file
if (movie == null) { if (movie == null) {
CLILogger.fine(format("Auto-detect movie from context: [%s]", file)); CLILogger.fine(format("Auto-detect movie from context: [%s]", file));
Collection<Movie> results = detectMovie(file, null, service, locale, strict); Collection<Movie> options = detectMovie(file, null, service, locale, strict);
List<Movie> validResults = applyExpressionFilter(results, filter);
// apply filter if defined
options = applyExpressionFilter(options, filter);
// reduce options to perfect matches if possible
List<Movie> perfectMatches = matchMovieByWordSequence(getName(file), options, 0);
if (perfectMatches.size() > 0) {
options = perfectMatches;
}
try { try {
if (validResults.size() > 0) { // select first element if matches are reliable
movie = (Movie) selectSearchResult(query, validResults, strict).get(0); if (options.size() > 0) {
movie = (Movie) selectSearchResult(null, options, strict).get(0);
} }
} catch (Exception e) { } catch (Exception e) {
CLILogger.log(Level.WARNING, String.format("%s: [%s/%s] %s", e.getClass().getSimpleName(), guessMovieFolder(file) != null ? guessMovieFolder(file).getName() : null, file.getName(), e.getMessage())); CLILogger.log(Level.WARNING, String.format("%s: [%s/%s] %s", e.getClass().getSimpleName(), guessMovieFolder(file) != null ? guessMovieFolder(file).getName() : null, file.getName(), e.getMessage()));
@ -854,15 +864,19 @@ public class CmdlineOperations implements CmdlineInterface {
} }
public List<SearchResult> findProbableMatches(final String query, Collection<? extends SearchResult> searchResults, boolean strict) { public List<SearchResult> findProbableMatches(final String query, Collection<? extends SearchResult> searchResults, boolean strict) {
if (query == null) {
return new ArrayList<SearchResult>(searchResults);
}
// auto-select most probable search result // auto-select most probable search result
List<SearchResult> probableMatches = new ArrayList<SearchResult>(); List<SearchResult> probableMatches = new ArrayList<SearchResult>();
// use name similarity metric // use name similarity metric
final SimilarityMetric metric = new NameSimilarityMetric(); SimilarityMetric metric = new NameSimilarityMetric();
// find probable matches using name similarity > 0.8 (or > 0.6 in non-strict mode) // find probable matches using name similarity > 0.8 (or > 0.6 in non-strict mode)
for (SearchResult result : searchResults) { for (SearchResult result : searchResults) {
float f = (query == null) ? 1 : metric.getSimilarity(query, result.getName()); float f = metric.getSimilarity(query, result.getName());
if (f >= (strict && searchResults.size() > 1 ? 0.8 : 0.6) || ((f >= 0.5 || !strict) && (result.getName().toLowerCase().startsWith(query.toLowerCase())))) { if (f >= (strict && searchResults.size() > 1 ? 0.8 : 0.6) || ((f >= 0.5 || !strict) && (result.getName().toLowerCase().startsWith(query.toLowerCase())))) {
if (!probableMatches.contains(result)) { if (!probableMatches.contains(result)) {
probableMatches.add(result); probableMatches.add(result);
@ -871,9 +885,8 @@ public class CmdlineOperations implements CmdlineInterface {
} }
// sort results by similarity to query // sort results by similarity to query
if (query != null) {
sort(probableMatches, new SimilarityComparator(query)); sort(probableMatches, new SimilarityComparator(query));
}
return probableMatches; return probableMatches;
} }
@ -892,8 +905,10 @@ public class CmdlineOperations implements CmdlineInterface {
} }
// just pick the best 5 matches // just pick the best 5 matches
if (query != null) {
probableMatches = (List<SearchResult>) sortBySimilarity(searchResults, singleton(query), getSeriesMatchMetric(), false); probableMatches = (List<SearchResult>) sortBySimilarity(searchResults, singleton(query), getSeriesMatchMetric(), false);
} }
}
// return first and only value // return first and only value
return probableMatches.size() <= 5 ? probableMatches : probableMatches.subList(0, 5); // trust that the correct match is in the Top 3 return probableMatches.size() <= 5 ? probableMatches : probableMatches.subList(0, 5); // trust that the correct match is in the Top 3

View File

@ -58,11 +58,11 @@ import net.filebot.similarity.SimilarityComparator;
import net.filebot.similarity.SimilarityMetric; import net.filebot.similarity.SimilarityMetric;
import net.filebot.similarity.StringEqualsMetric; import net.filebot.similarity.StringEqualsMetric;
import net.filebot.vfs.FileInfo; import net.filebot.vfs.FileInfo;
import net.filebot.web.SimpleDate;
import net.filebot.web.Episode; import net.filebot.web.Episode;
import net.filebot.web.Movie; import net.filebot.web.Movie;
import net.filebot.web.MovieIdentificationService; import net.filebot.web.MovieIdentificationService;
import net.filebot.web.SearchResult; import net.filebot.web.SearchResult;
import net.filebot.web.SimpleDate;
import net.filebot.web.TheTVDBClient.SeriesInfo; import net.filebot.web.TheTVDBClient.SeriesInfo;
import net.filebot.web.TheTVDBSearchResult; import net.filebot.web.TheTVDBSearchResult;
@ -961,6 +961,27 @@ public class MediaDetection {
return stripReleaseInfo(name, true); return stripReleaseInfo(name, true);
} }
public static List<Movie> matchMovieByWordSequence(String name, Collection<Movie> options, int maxStartIndex) {
List<Movie> movies = new ArrayList<Movie>();
HighPerformanceMatcher nameMatcher = new HighPerformanceMatcher(maxStartIndex);
CollationKey[] nameSeq = HighPerformanceMatcher.prepare(normalizePunctuation(name));
for (Movie movie : options) {
for (String alias : movie.getEffectiveNames()) {
CollationKey[] movieSeq = HighPerformanceMatcher.prepare(normalizePunctuation(alias));
CollationKey[] commonSeq = nameMatcher.matchFirstCommonSequence(nameSeq, movieSeq);
if (commonSeq != null && commonSeq.length >= movieSeq.length) {
movies.add(movie);
break;
}
}
}
return movies;
}
public static String stripReleaseInfo(String name, boolean strict) { public static String stripReleaseInfo(String name, boolean strict) {
try { try {
return releaseInfo.cleanRelease(singleton(name), strict).iterator().next(); return releaseInfo.cleanRelease(singleton(name), strict).iterator().next();