* run full series matching on all files only if folders can't be matched

This commit is contained in:
Reinhard Pointner 2012-02-23 19:53:04 +00:00
parent 806ffdc91d
commit 327f71ce5b
1 changed files with 20 additions and 12 deletions

View File

@ -134,12 +134,11 @@ public class MediaDetection {
public static List<String> detectSeriesNames(Collection<File> files, Locale locale) throws Exception {
// don't allow duplicates
Map<String, String> names = new LinkedHashMap<String, String>();
List<String> names = new ArrayList<String>();
try {
for (SearchResult it : lookupSeriesNameByInfoFile(files, locale)) {
names.put(it.getName().toLowerCase(), it.getName());
names.add(it.getName());
}
} catch (Exception e) {
Logger.getLogger(MediaDetection.class.getClass().getName()).log(Level.WARNING, "Failed to lookup info by id: " + e.getMessage(), e);
@ -147,17 +146,23 @@ public class MediaDetection {
// cross-reference known series names against file structure
try {
Set<String> folders = new LinkedHashSet<String>();
Set<String> filenames = new LinkedHashSet<String>();
for (File f : files) {
for (int i = 0; i < 3 && f != null; i++, f = f.getParentFile()) {
filenames.add(f.getName());
(i == 0 ? filenames : folders).add(f.getName());
}
}
// match folder names against known series names
for (String match : matchSeriesByName(filenames.toArray(new String[0]))) {
names.put(match.toLowerCase(), match);
// check foldernames first
List<String> matches = matchSeriesByName(folders);
// check all filenames if necessary
if (matches.isEmpty()) {
matches = matchSeriesByName(filenames);
}
names.addAll(matches);
} catch (Exception e) {
Logger.getLogger(MediaDetection.class.getClass().getName()).log(Level.WARNING, "Failed to match folder structure: " + e.getMessage(), e);
}
@ -169,15 +174,18 @@ public class MediaDetection {
} catch (Exception e) {
Logger.getLogger(MediaDetection.class.getClass().getName()).log(Level.WARNING, "Failed to clean matches: " + e.getMessage(), e);
}
for (String it : matches) {
names.put(it.toLowerCase(), it);
}
names.addAll(matches);
return new ArrayList<String>(names.values());
// don't allow duplicates
Map<String, String> unique = new LinkedHashMap<String, String>();
for (String it : matches) {
unique.put(it.toLowerCase(), it);
}
return new ArrayList<String>(unique.values());
}
public static List<String> matchSeriesByName(String... names) throws Exception {
public static List<String> matchSeriesByName(Collection<String> names) throws Exception {
HighPerformanceMatcher nameMatcher = new HighPerformanceMatcher(0);
List<String> matches = new ArrayList<String>();