Fix keyword exclude pattern for {group}

This commit is contained in:
Reinhard Pointner 2016-11-09 21:29:03 +08:00
parent 68fd6df113
commit af62b1271b
2 changed files with 18 additions and 17 deletions

View File

@ -34,6 +34,7 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -503,10 +504,10 @@ public class MediaBindingBean {
@Define("group") @Define("group")
public String getReleaseGroup() throws Exception { public String getReleaseGroup() throws Exception {
// reduce false positives by removing the know titles from the name // reduce false positives by removing the know titles from the name
Pattern[] nonGroupPattern = { releaseInfo.getCustomRemovePattern(getKeywords()), releaseInfo.getVideoSourcePattern(), releaseInfo.getVideoFormatPattern(true), releaseInfo.getResolutionPattern(), releaseInfo.getStructureRootPattern() }; Pattern[] nonGroupPattern = { getKeywordExcludePattern(), releaseInfo.getVideoSourcePattern(), releaseInfo.getVideoFormatPattern(true), releaseInfo.getResolutionPattern(), releaseInfo.getStructureRootPattern() };
// consider foldername, filename and original filename of inferred media file // consider foldername, filename and original filename of inferred media file
String[] filenames = stream(getFileNames(getInferredMediaFile())).map(s -> releaseInfo.clean(s, nonGroupPattern)).toArray(String[]::new); String[] filenames = stream(getFileNames(getInferredMediaFile())).map(s -> releaseInfo.clean(s, nonGroupPattern)).filter(s -> s.length() > 0).toArray(String[]::new);
// look for release group names in media file and it's parent folder // look for release group names in media file and it's parent folder
return releaseInfo.getReleaseGroup(filenames); return releaseInfo.getReleaseGroup(filenames);
@ -1158,24 +1159,29 @@ public class MediaBindingBean {
return names.toArray(new String[0]); return names.toArray(new String[0]);
} }
private List<String> getKeywords() { private Pattern getKeywordExcludePattern() {
// collect key information // collect key information
List<Object> keys = new ArrayList<Object>(); List<Object> keys = new ArrayList<Object>();
keys.add(getName()); keys.add(getName());
keys.add(getYear());
keys.addAll(getAliasNames());
if (infoObject instanceof Episode) { if (infoObject instanceof Episode || infoObject instanceof Movie) {
for (Episode it : getEpisodes()) { keys.addAll(getAliasNames());
keys.addAll(it.getSeriesNames());
keys.add(it.getTitle()); if (infoObject instanceof Episode) {
for (Episode e : getEpisodes()) {
keys.add(e.getTitle());
}
} else if (infoObject instanceof Movie) {
keys.add(getYear());
} }
} }
// word list for exclude pattern // word list for exclude pattern
return keys.stream().filter(Objects::nonNull).map(it -> { String pattern = keys.stream().filter(Objects::nonNull).map(Objects::toString).map(s -> {
return normalizePunctuation(normalizeSpace(it.toString(), " ")); return PUNCTUATION_OR_SPACE.matcher(s).replaceAll(Matcher.quoteReplacement("\\P{Alnum}+"));
}).filter(s -> s.length() > 0).distinct().collect(toList()); }).filter(s -> s.length() > 0).collect(joining("|", "\\b(", ")\\b"));
return Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CHARACTER_CLASS);
} }
@Override @Override

View File

@ -15,7 +15,6 @@ import static net.filebot.util.StringUtilities.*;
import java.io.File; import java.io.File;
import java.io.FileFilter; import java.io.FileFilter;
import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.text.Collator; import java.text.Collator;
@ -356,10 +355,6 @@ public class ReleaseInfo {
return compileWordPattern(excludeBlacklist.get()); // pattern matching any release group name enclosed in separators return compileWordPattern(excludeBlacklist.get()); // pattern matching any release group name enclosed in separators
} }
public Pattern getCustomRemovePattern(Collection<String> terms) throws IOException {
return compileWordPattern(quoteAll(terms));
}
private Pattern compileWordPattern(String[] patterns) { private Pattern compileWordPattern(String[] patterns) {
return compile("(?<!\\p{Alnum})" + or(patterns) + "(?!\\p{Alnum})", CASE_INSENSITIVE); // use | to join patterns return compile("(?<!\\p{Alnum})" + or(patterns) + "(?!\\p{Alnum})", CASE_INSENSITIVE); // use | to join patterns
} }