diff --git a/source/net/filebot/similarity/DateMatcher.java b/source/net/filebot/similarity/DateMatcher.java index f9954a30..bcdef4a5 100644 --- a/source/net/filebot/similarity/DateMatcher.java +++ b/source/net/filebot/similarity/DateMatcher.java @@ -1,98 +1,112 @@ - package net.filebot.similarity; +import static net.filebot.util.FileUtilities.*; +import java.io.File; +import java.util.ArrayList; +import java.util.List; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.filebot.web.SimpleDate; - public class DateMatcher { - + private final DatePattern[] patterns; - - + public DateMatcher() { patterns = new DatePattern[2]; - + // match yyyy-mm-dd patterns like 2010-10-24, 2009/6/1, etc. patterns[0] = new DatePattern("(?= 0) { return pos; } } - + return -1; } - - + + public SimpleDate match(File file) { + for (String name : tokenizeTail(file)) { + for (DatePattern pattern : patterns) { + SimpleDate match = pattern.match(name); + + if (match != null) { + return match; + } + } + } + return null; + } + + protected List tokenizeTail(File file) { + List tail = new ArrayList(2); + for (File f : listPathTail(file, 2, true)) { + tail.add(getName(f)); + } + return tail; + } + private static class DatePattern { - + protected final Pattern pattern; protected final int[] order; - - + public DatePattern(String pattern, int[] order) { this.pattern = Pattern.compile(pattern); this.order = order; } - - + protected SimpleDate process(MatchResult match) { return new SimpleDate(Integer.parseInt(match.group(order[0])), Integer.parseInt(match.group(order[1])), Integer.parseInt(match.group(order[2]))); } - - + public SimpleDate match(CharSequence seq) { Matcher matcher = pattern.matcher(seq); - + if (matcher.find()) { return process(matcher); } - + return null; } - - + public int find(CharSequence seq, int fromIndex) { Matcher matcher = pattern.matcher(seq).region(fromIndex, seq.length()); - + if (matcher.find()) { return matcher.start(); } - + return -1; } } - + } diff --git a/source/net/filebot/similarity/DateMetric.java b/source/net/filebot/similarity/DateMetric.java index 06a7483d..13a3de85 100644 --- a/source/net/filebot/similarity/DateMetric.java +++ b/source/net/filebot/similarity/DateMetric.java @@ -1,48 +1,40 @@ - package net.filebot.similarity; - import java.io.File; import net.filebot.web.SimpleDate; - public class DateMetric implements SimilarityMetric { - + private final DateMatcher matcher; - - + public DateMetric() { this.matcher = new DateMatcher(); } - - + public DateMetric(DateMatcher matcher) { this.matcher = matcher; } - - + @Override public float getSimilarity(Object o1, Object o2) { SimpleDate d1 = parse(o1); if (d1 == null) return 0; - + SimpleDate d2 = parse(o2); if (d2 == null) return 0; - + return d1.equals(d2) ? 1 : -1; } - - + public SimpleDate parse(Object object) { if (object instanceof File) { - // parse file name - object = ((File) object).getName(); + return matcher.match((File) object); } - + return matcher.match(object.toString()); } - + }