From a634abdb85617e6e1efd3e2aa79dd651e67e5aef Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Wed, 27 Aug 2014 06:33:27 +0000 Subject: [PATCH] * avoid Joe.720p style patterns being recognized as Joe.S7E20 like series patterns --- .../media/SmartSeasonEpisodeMatcher.java | 9 +++++++++ .../similarity/SeasonEpisodeMatcher.java | 8 ++++++++ .../filebot/similarity/SeriesNameMatcher.java | 17 +++++++++-------- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/source/net/filebot/media/SmartSeasonEpisodeMatcher.java b/source/net/filebot/media/SmartSeasonEpisodeMatcher.java index 25d0d9c6..b42e8526 100644 --- a/source/net/filebot/media/SmartSeasonEpisodeMatcher.java +++ b/source/net/filebot/media/SmartSeasonEpisodeMatcher.java @@ -28,6 +28,15 @@ public class SmartSeasonEpisodeMatcher extends SeasonEpisodeMatcher { return super.match(clean(name)); } + @Override + public List match(File file) { + return super.match(new File(clean(file.getPath()))); + } + + public String head(String name) { + return super.head(clean(name)); + } + @Override protected List tokenizeTail(File file) { List tail = super.tokenizeTail(file); diff --git a/source/net/filebot/similarity/SeasonEpisodeMatcher.java b/source/net/filebot/similarity/SeasonEpisodeMatcher.java index 4fc77f47..c8ccca97 100644 --- a/source/net/filebot/similarity/SeasonEpisodeMatcher.java +++ b/source/net/filebot/similarity/SeasonEpisodeMatcher.java @@ -217,6 +217,14 @@ public class SeasonEpisodeMatcher { return -1; } + public String head(String name) { + int seasonEpisodePosition = find(name, 0); + if (seasonEpisodePosition > 0) { + return name.substring(0, seasonEpisodePosition).trim(); + } + return null; + } + public static class SxE { public static final int UNDEFINED = -1; diff --git a/source/net/filebot/similarity/SeriesNameMatcher.java b/source/net/filebot/similarity/SeriesNameMatcher.java index b35beb6a..2db34ce0 100644 --- a/source/net/filebot/similarity/SeriesNameMatcher.java +++ b/source/net/filebot/similarity/SeriesNameMatcher.java @@ -24,6 +24,7 @@ import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; +import net.filebot.media.SmartSeasonEpisodeMatcher; import net.filebot.similarity.SeasonEpisodeMatcher.SxE; import net.filebot.util.FileUtilities; @@ -41,7 +42,7 @@ public class SeriesNameMatcher { } public SeriesNameMatcher(Locale locale, boolean strict) { - seasonEpisodeMatcher = new SeasonEpisodeMatcher(SeasonEpisodeMatcher.DEFAULT_SANITY, strict); + seasonEpisodeMatcher = new SmartSeasonEpisodeMatcher(SeasonEpisodeMatcher.DEFAULT_SANITY, strict); dateMatcher = new DateMatcher(); nameSimilarityMetric = new NameSimilarityMetric(); @@ -86,9 +87,9 @@ public class SeriesNameMatcher { // focus chars before the SxE / Date pattern when matching by common word sequence String[] focus = Arrays.copyOf(names, names.length); for (int i = 0; i < focus.length; i++) { - int sxePos = seasonEpisodeMatcher.find(focus[i], 0); - if (sxePos >= 0) { - focus[i] = focus[i].substring(0, sxePos); + String beforeSxE = seasonEpisodeMatcher.head(focus[i]); + if (beforeSxE != null && beforeSxE.length() > 0) { + focus[i] = beforeSxE; } else { int datePos = dateMatcher.find(focus[i], 0); if (datePos >= 0) { @@ -189,10 +190,10 @@ public class SeriesNameMatcher { * @return a substring of the given name that ends before the first occurrence of a season episode pattern, or null if there is no such pattern */ public String matchByEpisodeIdentifier(String name) { - int seasonEpisodePosition = seasonEpisodeMatcher.find(name, 0); - if (seasonEpisodePosition > 0) { - // series name ends at the first season episode pattern - return normalizePunctuation(name.substring(0, seasonEpisodePosition)); + // series name ends at the first season episode pattern + String seriesName = seasonEpisodeMatcher.head(name); + if (seriesName != null && seriesName.length() > 0) { + return normalizePunctuation(seriesName); } int datePosition = dateMatcher.find(name, 0);