* auto-match to nfo information if nfo/movie file names match

This commit is contained in:
Reinhard Pointner 2012-02-15 12:40:18 +00:00
parent e654be95a5
commit e89b7fbe5c
3 changed files with 46 additions and 8 deletions

View File

@ -71,6 +71,7 @@ import net.sourceforge.filebot.web.SortOrder;
import net.sourceforge.filebot.web.SubtitleDescriptor; import net.sourceforge.filebot.web.SubtitleDescriptor;
import net.sourceforge.filebot.web.SubtitleProvider; import net.sourceforge.filebot.web.SubtitleProvider;
import net.sourceforge.filebot.web.VideoHashSubtitleService; import net.sourceforge.filebot.web.VideoHashSubtitleService;
import net.sourceforge.tuned.FileUtilities.FolderFilter;
public class CmdlineOperations implements CmdlineInterface { public class CmdlineOperations implements CmdlineInterface {
@ -304,7 +305,16 @@ public class CmdlineOperations implements CmdlineInterface {
} }
for (File nfo : nfoFiles) { for (File nfo : nfoFiles) {
try { try {
movieByFile.put(nfo, grepMovie(nfo, service, locale)); Movie movie = grepMovie(nfo, service, locale);
movieByFile.put(nfo, movie);
// match movie info to movie files that match the nfo file name
SortedSet<File> siblingMovieFiles = new TreeSet<File>(filter(movieFiles, new FolderFilter(nfo.getParentFile())));
for (File movieFile : siblingMovieFiles) {
if (isDerived(movieFile, nfo)) {
movieByFile.put(movieFile, movie);
}
}
} catch (NoSuchElementException e) { } catch (NoSuchElementException e) {
CLILogger.warning("Failed to grep IMDbID: " + nfo.getName()); CLILogger.warning("Failed to grep IMDbID: " + nfo.getName());
} }
@ -317,16 +327,16 @@ public class CmdlineOperations implements CmdlineInterface {
movieByFile.put(file, result); movieByFile.put(file, result);
} }
} }
// map movies to (possibly multiple) files (in natural order)
Map<Movie, SortedSet<File>> filesByMovie = new HashMap<Movie, SortedSet<File>>();
// collect files that will be matched one by one
List<File> movieMatchFiles = new ArrayList<File>(); List<File> movieMatchFiles = new ArrayList<File>();
movieMatchFiles.addAll(movieFiles); movieMatchFiles.addAll(movieFiles);
movieMatchFiles.addAll(nfoFiles); movieMatchFiles.addAll(nfoFiles);
movieMatchFiles.addAll(filter(files, new ReleaseInfo().getDiskFolderFilter())); movieMatchFiles.addAll(filter(files, new ReleaseInfo().getDiskFolderFilter()));
movieMatchFiles.addAll(filter(orphanedFiles, SUBTITLE_FILES)); // run movie detection only on orphaned subtitle files movieMatchFiles.addAll(filter(orphanedFiles, SUBTITLE_FILES)); // run movie detection only on orphaned subtitle files
// map movies to (possibly multiple) files (in natural order)
Map<Movie, SortedSet<File>> filesByMovie = new HashMap<Movie, SortedSet<File>>();
// map all files by movie // map all files by movie
for (final File file : movieMatchFiles) { for (final File file : movieMatchFiles) {
Movie movie = movieByFile.get(file); Movie movie = movieByFile.get(file);

View File

@ -48,6 +48,7 @@ import net.sourceforge.filebot.web.Movie;
import net.sourceforge.filebot.web.MovieIdentificationService; import net.sourceforge.filebot.web.MovieIdentificationService;
import net.sourceforge.filebot.web.MoviePart; import net.sourceforge.filebot.web.MoviePart;
import net.sourceforge.filebot.web.SortOrder; import net.sourceforge.filebot.web.SortOrder;
import net.sourceforge.tuned.FileUtilities.FolderFilter;
class MovieHashMatcher implements AutoCompleteMatcher { class MovieHashMatcher implements AutoCompleteMatcher {
@ -99,21 +100,31 @@ class MovieHashMatcher implements AutoCompleteMatcher {
} }
for (File nfo : nfoFiles) { for (File nfo : nfoFiles) {
try { try {
movieByFile.put(nfo, grepMovie(nfo, service, locale)); Movie movie = grepMovie(nfo, service, locale);
movieByFile.put(nfo, movie);
// match movie info to movie files that match the nfo file name
SortedSet<File> siblingMovieFiles = new TreeSet<File>(filter(movieFiles, new FolderFilter(nfo.getParentFile())));
for (File movieFile : siblingMovieFiles) {
if (isDerived(movieFile, nfo)) {
movieByFile.put(movieFile, movie);
}
}
} catch (NoSuchElementException e) { } catch (NoSuchElementException e) {
Logger.getLogger(getClass().getName()).log(Level.WARNING, "Failed to grep IMDbID: " + nfo.getName()); Logger.getLogger(getClass().getName()).log(Level.WARNING, "Failed to grep IMDbID: " + nfo.getName());
} }
} }
// match remaining movies file by file in parallel // collect files that will be matched one by one
List<Callable<Entry<File, Movie>>> grabMovieJobs = new ArrayList<Callable<Entry<File, Movie>>>();
List<File> movieMatchFiles = new ArrayList<File>(); List<File> movieMatchFiles = new ArrayList<File>();
movieMatchFiles.addAll(movieFiles); movieMatchFiles.addAll(movieFiles);
movieMatchFiles.addAll(nfoFiles); movieMatchFiles.addAll(nfoFiles);
movieMatchFiles.addAll(filter(files, new ReleaseInfo().getDiskFolderFilter())); movieMatchFiles.addAll(filter(files, new ReleaseInfo().getDiskFolderFilter()));
movieMatchFiles.addAll(filter(orphanedFiles, SUBTITLE_FILES)); // run movie detection only on orphaned subtitle files movieMatchFiles.addAll(filter(orphanedFiles, SUBTITLE_FILES)); // run movie detection only on orphaned subtitle files
// match remaining movies file by file in parallel
List<Callable<Entry<File, Movie>>> grabMovieJobs = new ArrayList<Callable<Entry<File, Movie>>>();
// map all files by movie // map all files by movie
for (final File file : movieMatchFiles) { for (final File file : movieMatchFiles) {
grabMovieJobs.add(new Callable<Entry<File, Movie>>() { grabMovieJobs.add(new Callable<Entry<File, Movie>>() {

View File

@ -538,6 +538,23 @@ public final class FileUtilities {
}; };
public static class FolderFilter implements FileFilter {
private final File folder;
public FolderFilter(File folder) {
this.folder = folder;
}
@Override
public boolean accept(File file) {
return file.getParentFile().equals(folder);
}
}
public static class ExtensionFileFilter implements FileFilter { public static class ExtensionFileFilter implements FileFilter {
private final String[] extensions; private final String[] extensions;