From 2093882034d09dc7153f62c6d71c0677ef6199d4 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Thu, 6 Dec 2018 14:56:26 +0700 Subject: [PATCH] Extended MediaCharacteristics common interface --- source/net/filebot/media/FFProbe.java | 19 +++++++++++++++++++ .../filebot/media/MediaCharacteristics.java | 5 +++++ source/net/filebot/mediainfo/MediaInfo.java | 18 ++++++++++++++++++ .../filebot/similarity/EpisodeMetrics.java | 13 +++++++------ 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/source/net/filebot/media/FFProbe.java b/source/net/filebot/media/FFProbe.java index c871a5dd..75b57845 100644 --- a/source/net/filebot/media/FFProbe.java +++ b/source/net/filebot/media/FFProbe.java @@ -8,6 +8,7 @@ import java.io.File; import java.io.IOException; import java.lang.ProcessBuilder.Redirect; import java.time.Duration; +import java.time.Instant; import java.util.List; import java.util.Map; import java.util.Objects; @@ -103,10 +104,28 @@ public class FFProbe implements MediaCharacteristics { }).get(); } + @Override + public String getTitle() { + return getTag("title").orElse(null); + } + + @Override + public Instant getCreationTime() { + return getTag("creation_time").map(Instant::parse).orElse(null); + } + public Map getFormat() { return (Map) json.get("format"); } + public Map getTags() { + return (Map) getFormat().get("tags"); + } + + public Optional getTag(String tag) { + return Optional.ofNullable(getTags()).map(m -> (String) m.get(tag)); + } + public List> getStreams() { return (List) asList((Object[]) json.get("streams")); } diff --git a/source/net/filebot/media/MediaCharacteristics.java b/source/net/filebot/media/MediaCharacteristics.java index de48a5bf..7a3e3a0b 100644 --- a/source/net/filebot/media/MediaCharacteristics.java +++ b/source/net/filebot/media/MediaCharacteristics.java @@ -1,6 +1,7 @@ package net.filebot.media; import java.time.Duration; +import java.time.Instant; public interface MediaCharacteristics extends AutoCloseable { @@ -20,4 +21,8 @@ public interface MediaCharacteristics extends AutoCloseable { Float getFrameRate(); + String getTitle(); + + Instant getCreationTime(); + } diff --git a/source/net/filebot/mediainfo/MediaInfo.java b/source/net/filebot/mediainfo/MediaInfo.java index befa2d5f..269e1bbe 100644 --- a/source/net/filebot/mediainfo/MediaInfo.java +++ b/source/net/filebot/mediainfo/MediaInfo.java @@ -10,6 +10,9 @@ import java.io.IOException; import java.io.RandomAccessFile; import java.lang.ref.Cleaner; import java.time.Duration; +import java.time.Instant; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.EnumMap; import java.util.LinkedHashMap; @@ -180,6 +183,21 @@ public class MediaInfo implements MediaCharacteristics { return Float.parseFloat(get(StreamKind.Video, 0, "FrameRate")); } + @Override + public String getTitle() { + return get(StreamKind.General, 0, "Title"); + } + + @Override + public Instant getCreationTime() { + String d = get(StreamKind.General, 0, "Encoded_Date"); + if (d.isEmpty()) { + return null; + } + // e.g. UTC 2008-01-08 19:54:39 + return ZonedDateTime.parse(d, DateTimeFormatter.ofPattern("zzz uuuu-MM-dd HH:mm:ss")).toInstant(); + } + public Map>> snapshot() { Map>> mediaInfo = new EnumMap>>(StreamKind.class); diff --git a/source/net/filebot/similarity/EpisodeMetrics.java b/source/net/filebot/similarity/EpisodeMetrics.java index 6d8c001f..ba4e9034 100644 --- a/source/net/filebot/similarity/EpisodeMetrics.java +++ b/source/net/filebot/similarity/EpisodeMetrics.java @@ -28,8 +28,8 @@ import java.util.stream.Stream; import com.ibm.icu.text.Transliterator; -import net.filebot.format.BindingException; -import net.filebot.format.MediaBindingBean; +import net.filebot.media.MediaCharacteristics; +import net.filebot.media.MediaCharacteristicsParser; import net.filebot.media.SmartSeasonEpisodeMatcher; import net.filebot.similarity.SeasonEpisodeMatcher.SxE; import net.filebot.vfs.FileInfo; @@ -538,10 +538,11 @@ public enum EpisodeMetrics implements SimilarityMetric { private long getTimeStamp(File file) { if (VIDEO_FILES.accept(file) && file.length() > ONE_MEGABYTE) { - try { - return new MediaBindingBean(file, file).getEncodedDate().getTimeStamp(); - } catch (BindingException e) { - debug.finest(e::getMessage); // Binding "General[0][Encoded_Date]": undefined => normal if Encoded_Date is undefined => ignore + try (MediaCharacteristics mi = MediaCharacteristicsParser.open(file)) { + Instant t = mi.getCreationTime(); + if (t != null) { + return t.toEpochMilli(); + } } catch (Exception e) { debug.warning("Failed to read media encoding date: " + e.getMessage()); }