* slightly improved behavior as to when to require manual user input of series name
This commit is contained in:
parent
e1261eadbc
commit
ca3fb703b2
|
@ -50,28 +50,6 @@ class EpisodeListMatcher implements AutoCompleteMatcher {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected Collection<String> grabSeriesNames(Collection<File> files, boolean autodetect) {
|
|
||||||
Collection<String> names = null;
|
|
||||||
|
|
||||||
// auto-detect series name(s) from files
|
|
||||||
if (autodetect) {
|
|
||||||
names = new SeriesNameMatcher().matchAll(files.toArray(new File[0]));
|
|
||||||
}
|
|
||||||
|
|
||||||
// require user input if auto-detection fails
|
|
||||||
if (names == null || names.isEmpty()) {
|
|
||||||
String suggestion = new SeriesNameMatcher().matchBySeasonEpisodePattern(getName(files.iterator().next()));
|
|
||||||
String input = showInputDialog(null, "Enter series name:", suggestion);
|
|
||||||
|
|
||||||
if (input != null) {
|
|
||||||
names = singleton(input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected SearchResult selectSearchResult(final String query, final List<SearchResult> searchResults) throws Exception {
|
protected SearchResult selectSearchResult(final String query, final List<SearchResult> searchResults) throws Exception {
|
||||||
if (searchResults.size() == 1) {
|
if (searchResults.size() == 1) {
|
||||||
return searchResults.get(0);
|
return searchResults.get(0);
|
||||||
|
@ -175,10 +153,28 @@ class EpisodeListMatcher implements AutoCompleteMatcher {
|
||||||
public List<Match<File, ?>> match(final List<File> files, Locale locale, boolean autodetection) throws Exception {
|
public List<Match<File, ?>> match(final List<File> files, Locale locale, boolean autodetection) throws Exception {
|
||||||
// focus on movie and subtitle files
|
// focus on movie and subtitle files
|
||||||
List<File> mediaFiles = FileUtilities.filter(files, VIDEO_FILES, SUBTITLE_FILES);
|
List<File> mediaFiles = FileUtilities.filter(files, VIDEO_FILES, SUBTITLE_FILES);
|
||||||
|
Set<Episode> episodes = emptySet();
|
||||||
|
|
||||||
// detect series name and fetch episode list
|
// detect series name and fetch episode list
|
||||||
Set<Episode> episodes = fetchEpisodeSet(grabSeriesNames(mediaFiles, autodetection), locale);
|
if (autodetection) {
|
||||||
|
Collection<String> names = new SeriesNameMatcher().matchAll(files.toArray(new File[0]));
|
||||||
|
|
||||||
|
if (names.size() > 0) {
|
||||||
|
episodes = fetchEpisodeSet(names, locale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// require user input if auto-detection has failed or has been disabled
|
||||||
|
if (episodes.isEmpty()) {
|
||||||
|
String suggestion = new SeriesNameMatcher().matchBySeasonEpisodePattern(getName(files.iterator().next()));
|
||||||
|
String input = showInputDialog(null, "Enter series name:", suggestion);
|
||||||
|
|
||||||
|
if (input != null) {
|
||||||
|
episodes = fetchEpisodeSet(singleton(input), locale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find file/episode matches
|
||||||
List<Match<File, ?>> matches = new ArrayList<Match<File, ?>>();
|
List<Match<File, ?>> matches = new ArrayList<Match<File, ?>>();
|
||||||
|
|
||||||
// group by subtitles first and then by files in general
|
// group by subtitles first and then by files in general
|
||||||
|
@ -198,5 +194,4 @@ class EpisodeListMatcher implements AutoCompleteMatcher {
|
||||||
|
|
||||||
return matches;
|
return matches;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,12 +50,9 @@ class MovieHashMatcher implements AutoCompleteMatcher {
|
||||||
public List<Match<File, ?>> match(final List<File> files, Locale locale, boolean autodetect) throws Exception {
|
public List<Match<File, ?>> match(final List<File> files, Locale locale, boolean autodetect) throws Exception {
|
||||||
// handle movie files
|
// handle movie files
|
||||||
File[] movieFiles = filter(files, VIDEO_FILES).toArray(new File[0]);
|
File[] movieFiles = filter(files, VIDEO_FILES).toArray(new File[0]);
|
||||||
MovieDescriptor[] movieByFileHash = new MovieDescriptor[movieFiles.length];
|
|
||||||
|
|
||||||
// match movie hashes online
|
// match movie hashes online
|
||||||
if (autodetect) {
|
MovieDescriptor[] movieByFileHash = service.getMovieDescriptors(movieFiles, locale);
|
||||||
movieByFileHash = service.getMovieDescriptors(movieFiles, locale);
|
|
||||||
}
|
|
||||||
|
|
||||||
// map movies to (possibly multiple) files (in natural order)
|
// map movies to (possibly multiple) files (in natural order)
|
||||||
Map<MovieDescriptor, SortedSet<File>> filesByMovie = new HashMap<MovieDescriptor, SortedSet<File>>();
|
Map<MovieDescriptor, SortedSet<File>> filesByMovie = new HashMap<MovieDescriptor, SortedSet<File>>();
|
||||||
|
@ -65,8 +62,8 @@ class MovieHashMatcher implements AutoCompleteMatcher {
|
||||||
MovieDescriptor movie = movieByFileHash[i];
|
MovieDescriptor movie = movieByFileHash[i];
|
||||||
|
|
||||||
// unknown hash, try via imdb id from nfo file
|
// unknown hash, try via imdb id from nfo file
|
||||||
if (movie == null) {
|
if (movie == null || !autodetect) {
|
||||||
movie = grabMovieName(movieFiles[i], locale, autodetect);
|
movie = grabMovieName(movieFiles[i], locale, autodetect, movie);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if we managed to lookup the movie descriptor
|
// check if we managed to lookup the movie descriptor
|
||||||
|
@ -153,9 +150,16 @@ class MovieHashMatcher implements AutoCompleteMatcher {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected MovieDescriptor grabMovieName(File movieFile, Locale locale, boolean autodetect) throws Exception {
|
protected MovieDescriptor grabMovieName(File movieFile, Locale locale, boolean autodetect, MovieDescriptor... suggestions) throws Exception {
|
||||||
List<MovieDescriptor> options = new ArrayList<MovieDescriptor>();
|
List<MovieDescriptor> options = new ArrayList<MovieDescriptor>();
|
||||||
|
|
||||||
|
// add default value if any
|
||||||
|
for (MovieDescriptor it : suggestions) {
|
||||||
|
if (it != null) {
|
||||||
|
options.add(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// try to grep imdb id from nfo files
|
// try to grep imdb id from nfo files
|
||||||
for (int imdbid : grepImdbId(movieFile.getParentFile().listFiles(getDefaultFilter("application/nfo")))) {
|
for (int imdbid : grepImdbId(movieFile.getParentFile().listFiles(getDefaultFilter("application/nfo")))) {
|
||||||
MovieDescriptor movie = service.getMovieDescriptor(imdbid, locale);
|
MovieDescriptor movie = service.getMovieDescriptor(imdbid, locale);
|
||||||
|
@ -179,6 +183,8 @@ class MovieHashMatcher implements AutoCompleteMatcher {
|
||||||
|
|
||||||
if (input != null) {
|
if (input != null) {
|
||||||
options = service.searchMovie(input, locale);
|
options = service.searchMovie(input, locale);
|
||||||
|
} else {
|
||||||
|
options.clear(); // cancel search
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue