From ac90b544bbaf2705a682049296b1ac876c0fc5a3 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Tue, 9 Oct 2012 15:04:14 +0000 Subject: [PATCH] + basic logic for hard-coding filename->series lookup (designed primarily as a workaround for database search limitations and issues) --- BuildData.groovy | 1 + .../filebot/media/MediaDetection.java | 24 +++++++++++++++++++ .../filebot/media/ReleaseInfo.java | 14 +++++++++++ .../filebot/media/ReleaseInfo.properties | 3 +++ website/data/series-mappings.txt | 3 +++ 5 files changed, 45 insertions(+) create mode 100644 website/data/series-mappings.txt diff --git a/BuildData.groovy b/BuildData.groovy index 479889d4..d5d2d935 100644 --- a/BuildData.groovy +++ b/BuildData.groovy @@ -38,6 +38,7 @@ def sortRegexList(path) { sortRegexList("website/data/release-groups.txt") sortRegexList("website/data/query-blacklist.txt") sortRegexList("website/data/exclude-blacklist.txt") +sortRegexList("website/data/series-mappings.txt") // ------------------------------------------------------------------------- // diff --git a/source/net/sourceforge/filebot/media/MediaDetection.java b/source/net/sourceforge/filebot/media/MediaDetection.java index d667d915..9ffc25e6 100644 --- a/source/net/sourceforge/filebot/media/MediaDetection.java +++ b/source/net/sourceforge/filebot/media/MediaDetection.java @@ -229,6 +229,7 @@ public class MediaDetection { public static List detectSeriesNames(Collection files, Locale locale) throws Exception { List names = new ArrayList(); + // try to detect series name via nfo files try { for (SearchResult it : lookupSeriesNameByInfoFile(files, locale)) { names.add(it.getName()); @@ -237,6 +238,13 @@ public class MediaDetection { Logger.getLogger(MediaDetection.class.getClass().getName()).log(Level.WARNING, "Failed to lookup info by id: " + e.getMessage(), e); } + // try to detect series name via known patterns + try { + names.addAll(matchSeriesByDirectMapping(files)); + } catch (Exception e) { + Logger.getLogger(MediaDetection.class.getClass().getName()).log(Level.WARNING, "Failed to match direct mappings: " + e.getMessage(), e); + } + // cross-reference known series names against file structure try { Set folders = new LinkedHashSet(); @@ -284,6 +292,22 @@ public class MediaDetection { } + public static List matchSeriesByDirectMapping(Collection files) throws Exception { + Map seriesDirectMappings = releaseInfo.getSeriesDirectMappings(); + List matches = new ArrayList(); + + for (File file : files) { + for (Entry it : seriesDirectMappings.entrySet()) { + if (it.getKey().matcher(getName(file)).find()) { + matches.add(it.getValue()); + } + } + } + + return matches; + } + + public static List matchSeriesByName(Collection names, int maxStartIndex) throws Exception { HighPerformanceMatcher nameMatcher = new HighPerformanceMatcher(maxStartIndex); List matches = new ArrayList(); diff --git a/source/net/sourceforge/filebot/media/ReleaseInfo.java b/source/net/sourceforge/filebot/media/ReleaseInfo.java index e449b7c7..7f32703b 100644 --- a/source/net/sourceforge/filebot/media/ReleaseInfo.java +++ b/source/net/sourceforge/filebot/media/ReleaseInfo.java @@ -24,6 +24,7 @@ import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -241,6 +242,18 @@ public class ReleaseInfo { } + public Map getSeriesDirectMappings() throws IOException { + Map mappings = new LinkedHashMap(); + for (String line : seriesDirectMappingsResource.get()) { + String[] tsv = line.split("\t", 2); + if (tsv.length == 2) { + mappings.put(compile("(? excludeBlacklistResource = new PatternResource(getBundle(getClass().getName()).getString("url.exclude-blacklist")); protected final CachedResource movieListResource = new MovieResource(getBundle(getClass().getName()).getString("url.movie-list")); protected final CachedResource seriesListResource = new SeriesResource(getBundle(getClass().getName()).getString("url.series-list")); + protected final CachedResource seriesDirectMappingsResource = new PatternResource(getBundle(getClass().getName()).getString("url.series-mappings")); protected static class PatternResource extends CachedResource { diff --git a/source/net/sourceforge/filebot/media/ReleaseInfo.properties b/source/net/sourceforge/filebot/media/ReleaseInfo.properties index e8ee8dac..91bf9f79 100644 --- a/source/net/sourceforge/filebot/media/ReleaseInfo.properties +++ b/source/net/sourceforge/filebot/media/ReleaseInfo.properties @@ -13,6 +13,9 @@ url.query-blacklist: http://filebot.sourceforge.net/data/query-blacklist.txt # clutter files that will be ignored url.exclude-blacklist: http://filebot.sourceforge.net/data/exclude-blacklist.txt +# list of patterns directly matching files to series names +url.series-mappings: http://filebot.sourceforge.net/data/series-mappings.txt + # list of all movies (id, name, year) url.movie-list: http://filebot.sourceforge.net/data/movies.txt.gz diff --git a/website/data/series-mappings.txt b/website/data/series-mappings.txt new file mode 100644 index 00000000..802747ef --- /dev/null +++ b/website/data/series-mappings.txt @@ -0,0 +1,3 @@ +Franklin.and.Bash Franklin & Bash +HIMYM How I Met your Mother +Rizolli.and.Isles Rizzoli & Isles \ No newline at end of file