mirror of
https://github.com/mitb-archive/filebot
synced 2024-11-16 14:25:02 -05:00
// can't use parallel stream because default fork/join pool doesn't play well with the security manager
This commit is contained in:
parent
419b71b08e
commit
aa06ecbabd
@ -6,6 +6,7 @@ import static java.util.regex.Pattern.*;
|
|||||||
import static java.util.stream.Collectors.*;
|
import static java.util.stream.Collectors.*;
|
||||||
import static net.filebot.Logging.*;
|
import static net.filebot.Logging.*;
|
||||||
import static net.filebot.MediaTypes.*;
|
import static net.filebot.MediaTypes.*;
|
||||||
|
import static net.filebot.Settings.*;
|
||||||
import static net.filebot.media.MediaDetection.*;
|
import static net.filebot.media.MediaDetection.*;
|
||||||
import static net.filebot.similarity.Normalization.*;
|
import static net.filebot.similarity.Normalization.*;
|
||||||
import static net.filebot.util.FileUtilities.*;
|
import static net.filebot.util.FileUtilities.*;
|
||||||
@ -24,6 +25,8 @@ import java.util.Objects;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -78,57 +81,40 @@ public class AutoDetection {
|
|||||||
// sort keys and values
|
// sort keys and values
|
||||||
Map<Group, Set<File>> groups = new TreeMap<Group, Set<File>>();
|
Map<Group, Set<File>> groups = new TreeMap<Group, Set<File>>();
|
||||||
|
|
||||||
stream(files).parallel().collect(groupingByConcurrent(f -> {
|
// can't use parallel stream because default fork/join pool doesn't play well with the security manager
|
||||||
Group group = new Group();
|
ExecutorService executor = Executors.newFixedThreadPool(getPreferredThreadPoolSize());
|
||||||
|
|
||||||
|
stream(files).collect(toMap(f -> f, f -> executor.submit(() -> detectGroup(f)))).forEach((file, group) -> {
|
||||||
try {
|
try {
|
||||||
if (forceIgnore.test(f)) {
|
groups.computeIfAbsent(group.get(), k -> new TreeSet<File>()).add(file);
|
||||||
return group;
|
|
||||||
}
|
|
||||||
if (forceMusic.test(f)) {
|
|
||||||
return group.music(f);
|
|
||||||
}
|
|
||||||
if (forceMovie.test(f)) {
|
|
||||||
return group.movie(getMovieMatches(f, false));
|
|
||||||
}
|
|
||||||
if (forceSeries.test(f)) {
|
|
||||||
return group.series(getSeriesMatches(f, false));
|
|
||||||
}
|
|
||||||
if (forceAnime.test(f)) {
|
|
||||||
return group.anime(getSeriesMatches(f, true));
|
|
||||||
}
|
|
||||||
return detectGroup(f);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
debug.log(Level.SEVERE, e.getMessage(), e);
|
debug.log(Level.SEVERE, e.getMessage(), e);
|
||||||
}
|
}
|
||||||
return group;
|
});
|
||||||
})).forEach((k, v) -> groups.put(k, new TreeSet<File>(v)));
|
|
||||||
|
|
||||||
|
executor.shutdown();
|
||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getSeriesMatches(File f, boolean anime) throws Exception {
|
|
||||||
List<String> names = detectSeriesNames(singleton(f), anime, locale);
|
|
||||||
if (names.size() > 0) {
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
List<File> episodes = getVideoFiles(f.getParentFile());
|
|
||||||
if (episodes.size() >= 5) {
|
|
||||||
return detectSeriesNames(episodes, anime, locale);
|
|
||||||
}
|
|
||||||
return emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Movie> getMovieMatches(File file, boolean strict) throws Exception {
|
|
||||||
return MediaDetection.detectMovie(file, WebServices.TheMovieDB, locale, strict);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<File> getVideoFiles(File parent) {
|
|
||||||
return stream(files).filter(it -> parent.equals(it.getParentFile())).filter(VIDEO_FILES::accept).collect(toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
private Group detectGroup(File f) throws Exception {
|
private Group detectGroup(File f) throws Exception {
|
||||||
Group group = new Group();
|
Group group = new Group();
|
||||||
|
|
||||||
|
if (forceIgnore.test(f)) {
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
if (forceMusic.test(f)) {
|
||||||
|
return group.music(f);
|
||||||
|
}
|
||||||
|
if (forceMovie.test(f)) {
|
||||||
|
return group.movie(getMovieMatches(f, false));
|
||||||
|
}
|
||||||
|
if (forceSeries.test(f)) {
|
||||||
|
return group.series(getSeriesMatches(f, false));
|
||||||
|
}
|
||||||
|
if (forceAnime.test(f)) {
|
||||||
|
return group.anime(getSeriesMatches(f, true));
|
||||||
|
}
|
||||||
|
|
||||||
List<String> s = getSeriesMatches(f, false);
|
List<String> s = getSeriesMatches(f, false);
|
||||||
List<Movie> m = getMovieMatches(f, false);
|
List<Movie> m = getMovieMatches(f, false);
|
||||||
|
|
||||||
@ -140,10 +126,28 @@ public class AutoDetection {
|
|||||||
return group.movie(m);
|
return group.movie(m);
|
||||||
|
|
||||||
log.fine(format("%s [series: %s, movie: %s]", f.getName(), s.get(0), m.get(0)));
|
log.fine(format("%s [series: %s, movie: %s]", f.getName(), s.get(0), m.get(0)));
|
||||||
|
|
||||||
return new Rules(f, s, m).apply();
|
return new Rules(f, s, m).apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<String> getSeriesMatches(File f, boolean anime) throws Exception {
|
||||||
|
List<String> names = detectSeriesNames(singleton(f), anime, locale);
|
||||||
|
if (names.isEmpty()) {
|
||||||
|
List<File> episodes = getVideoFiles(f.getParentFile());
|
||||||
|
if (episodes.size() >= 5) {
|
||||||
|
names = detectSeriesNames(episodes, anime, locale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Movie> getMovieMatches(File file, boolean strict) throws Exception {
|
||||||
|
return MediaDetection.detectMovie(file, WebServices.TheMovieDB, locale, strict);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<File> getVideoFiles(File parent) {
|
||||||
|
return stream(files).filter(it -> parent.equals(it.getParentFile())).filter(VIDEO_FILES::accept).collect(toList());
|
||||||
|
}
|
||||||
|
|
||||||
private static final Pattern YEAR = Pattern.compile("\\D(?:19|20)\\d{2}\\D");
|
private static final Pattern YEAR = Pattern.compile("\\D(?:19|20)\\d{2}\\D");
|
||||||
private static final Pattern EPISODE_NUMBERS = Pattern.compile("\\b\\d{1,3}\\b");
|
private static final Pattern EPISODE_NUMBERS = Pattern.compile("\\b\\d{1,3}\\b");
|
||||||
private static final Pattern DASH = Pattern.compile("^.{0,3}\\s[-]\\s.+$", UNICODE_CHARACTER_CLASS);
|
private static final Pattern DASH = Pattern.compile("^.{0,3}\\s[-]\\s.+$", UNICODE_CHARACTER_CLASS);
|
||||||
@ -319,7 +323,7 @@ public class AutoDetection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enum Type {
|
public enum Type {
|
||||||
Movie, Series, Anime, Music;
|
MOVIE, SERIES, ANIME, MUSIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Group extends EnumMap<Type, Object> implements Comparable<Group> {
|
public static class Group extends EnumMap<Type, Object> implements Comparable<Group> {
|
||||||
@ -329,40 +333,40 @@ public class AutoDetection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Object getMovie() {
|
public Object getMovie() {
|
||||||
return get(Type.Movie);
|
return get(Type.MOVIE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getSeries() {
|
public Object getSeries() {
|
||||||
return get(Type.Series);
|
return get(Type.SERIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getAnime() {
|
public Object getAnime() {
|
||||||
return get(Type.Anime);
|
return get(Type.ANIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getMusic() {
|
public Object getMusic() {
|
||||||
return get(Type.Music);
|
return get(Type.MUSIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Group movie(List<Movie> movies) {
|
public Group movie(List<Movie> movies) {
|
||||||
put(Type.Movie, movies == null || movies.isEmpty() ? null : movies.get(0));
|
put(Type.MOVIE, movies == null || movies.isEmpty() ? null : movies.get(0));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Group series(List<String> names) {
|
public Group series(List<String> names) {
|
||||||
put(Type.Series, names == null || names.isEmpty() ? null : names.get(0));
|
put(Type.SERIES, names == null || names.isEmpty() ? null : names.get(0));
|
||||||
return this;
|
return this;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Group anime(List<String> names) {
|
public Group anime(List<String> names) {
|
||||||
put(Type.Anime, names == null || names.isEmpty() ? null : names.get(0));
|
put(Type.ANIME, names == null || names.isEmpty() ? null : names.get(0));
|
||||||
return this;
|
return this;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Group music(File f) {
|
public Group music(File f) {
|
||||||
put(Type.Music, f == null ? null : f.getParent());
|
put(Type.MUSIC, f == null ? null : f.getParent());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user