Refactor common media characteristics (e.g. to use ffprobe instead of libmediainfo internally for various use cases, via -Dnet.filebot.media.parser=ffprobe)

This commit is contained in:
Reinhard Pointner 2018-06-05 13:35:39 +07:00
parent 8efa664d76
commit c8e6389b77
6 changed files with 39 additions and 13 deletions

View File

@ -34,7 +34,6 @@ import java.util.logging.Level;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import net.filebot.mediainfo.MediaInfo;
import net.filebot.similarity.NameSimilarityMetric;
import net.filebot.util.FastFile;
import net.filebot.web.Episode;
@ -84,6 +83,9 @@ public class AutoDetection {
private static final Pattern SERIES_EPISODE_PATTERN = Pattern.compile("^tv[sp][ _.-]", CASE_INSENSITIVE);
private static final Pattern ANIME_EPISODE_PATTERN = Pattern.compile("^\\[[^\\]]+Subs\\]", CASE_INSENSITIVE);
private static final Pattern JAPANESE_AUDIO_LANGUAGE_PATTERN = Pattern.compile("jpn|Japanese", CASE_INSENSITIVE);
private static final Pattern JAPANESE_SUBTITLE_CODEC_PATTERN = Pattern.compile("ASS|SSA", CASE_INSENSITIVE);
public boolean isMusic(File f) {
return AUDIO_FILES.accept(f) && !VIDEO_FILES.accept(f);
}
@ -116,8 +118,8 @@ public class AutoDetection {
if (VIDEO_FILES.accept(f) && f.length() > ONE_MEGABYTE) {
// check for Japanese audio or characteristic subtitles
try (MediaCharacteristics mi = new MediaInfo().open(f)) {
return mi.getDuration().toMinutes() < 60 || mi.getAudioLanguage().contains("Japanese") && mi.getSubtitleCodec().contains("ASS");
try (MediaCharacteristics mi = MediaCharacteristicsParser.open(f)) {
return mi.getDuration().toMinutes() < 60 || find(mi.getAudioLanguage(), JAPANESE_AUDIO_LANGUAGE_PATTERN) && find(mi.getSubtitleCodec(), JAPANESE_SUBTITLE_CODEC_PATTERN);
} catch (Exception e) {
debug.warning("Failed to read audio language: " + e.getMessage());
}

View File

@ -0,0 +1,27 @@
package net.filebot.media;
import java.io.File;
import net.filebot.mediainfo.MediaInfo;
import net.filebot.util.SystemProperty;
public enum MediaCharacteristicsParser {
libmediainfo, ffprobe;
public static MediaCharacteristicsParser getDefault() {
return SystemProperty.of("net.filebot.media.parser", MediaCharacteristicsParser::valueOf, libmediainfo).get();
}
public static MediaCharacteristics open(File f) throws Exception {
switch (getDefault()) {
case libmediainfo:
return new MediaInfo().open(f);
case ffprobe:
return new FFProbe().open(f);
}
throw new IllegalStateException();
}
}

View File

@ -48,7 +48,6 @@ import net.filebot.Language;
import net.filebot.Resource;
import net.filebot.WebServices;
import net.filebot.archive.Archive;
import net.filebot.mediainfo.MediaInfo;
import net.filebot.similarity.DateMatcher;
import net.filebot.similarity.EpisodeMetrics;
import net.filebot.similarity.MetricAvg;
@ -1115,7 +1114,7 @@ public class MediaDetection {
filesByExtension.stream().collect(groupingBy(f -> {
if (VIDEO_FILES.accept(f) && f.length() > ONE_MEGABYTE) {
try (MediaCharacteristics mi = new MediaInfo().open(f)) {
try (MediaCharacteristics mi = MediaCharacteristicsParser.open(f)) {
ChronoUnit d = mi.getDuration().toMinutes() < 10 ? ChronoUnit.MINUTES : ChronoUnit.HOURS;
String v = mi.getVideoCodec();
String a = mi.getAudioCodec();

View File

@ -5,8 +5,6 @@ import static net.filebot.Logging.*;
import java.io.File;
import java.io.FileFilter;
import net.filebot.mediainfo.MediaInfo;
public class MediaDurationFilter implements FileFilter {
private final long min;
@ -24,7 +22,7 @@ public class MediaDurationFilter implements FileFilter {
}
public long getDuration(File f) {
try (MediaCharacteristics mi = new MediaInfo().open(f)) {
try (MediaCharacteristics mi = MediaCharacteristicsParser.open(f)) {
return mi.getDuration().toMillis();
} catch (Exception e) {
debug.warning(format("Failed to read video duration: %s", e.getMessage()));

View File

@ -16,7 +16,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.filebot.media.MediaCharacteristics;
import net.filebot.mediainfo.MediaInfo;
import net.filebot.media.MediaCharacteristicsParser;
import net.filebot.similarity.CrossPropertyMetric;
import net.filebot.similarity.EpisodeMetrics;
import net.filebot.similarity.MetricAvg;
@ -184,8 +184,8 @@ public enum SubtitleMetrics implements SimilarityMetric {
private final Map<File, Map<String, Object>> mediaInfoCache = synchronizedMap(new WeakHashMap<File, Map<String, Object>>(64));
private Map<String, Object> getVideoProperties(File file) {
return mediaInfoCache.computeIfAbsent(file, key -> {
try (MediaCharacteristics mi = new MediaInfo().open(file)) {
return mediaInfoCache.computeIfAbsent(file, f -> {
try (MediaCharacteristics mi = MediaCharacteristicsParser.open(f)) {
return getProperties(mi.getFrameRate(), mi.getDuration().toMillis());
} catch (Exception e) {
debug.warning("Failed to read video properties: " + e.getMessage());

View File

@ -29,8 +29,8 @@ import net.filebot.Cache.TypedCache;
import net.filebot.CacheType;
import net.filebot.ResourceManager;
import net.filebot.media.MediaCharacteristics;
import net.filebot.media.MediaCharacteristicsParser;
import net.filebot.media.MediaDetection;
import net.filebot.mediainfo.MediaInfo;
import net.filebot.util.ExceptionUtilities;
import net.filebot.util.Timer;
import net.filebot.web.OpenSubtitlesXmlRpc.BaseInfo;
@ -312,7 +312,7 @@ public class OpenSubtitlesClient implements SubtitleProvider, VideoHashSubtitleS
sub.setSubContent(readFile(subtitleFile));
}
try (MediaCharacteristics mi = new MediaInfo().open(videoFile)) {
try (MediaCharacteristics mi = MediaCharacteristicsParser.open(videoFile)) {
sub.setMovieFPS(String.valueOf(mi.getFrameRate()));
sub.setMovieTimeMS(String.valueOf(mi.getDuration().toMillis()));
} catch (Throwable e) {