diff --git a/MediaBrowser.Controller/FFMpeg/FFProbe.cs b/MediaBrowser.Controller/FFMpeg/FFProbe.cs index 791f47b298..da5e11c5b7 100644 --- a/MediaBrowser.Controller/FFMpeg/FFProbe.cs +++ b/MediaBrowser.Controller/FFMpeg/FFProbe.cs @@ -35,8 +35,11 @@ namespace MediaBrowser.Controller.FFMpeg FFProbeResult result = Run(item.Path); - // Fire and forget - CacheResult(result, cachePath); + if (result != null) + { + // Fire and forget + CacheResult(result, cachePath); + } return result; } diff --git a/MediaBrowser.Controller/Providers/AudioInfoProvider.cs b/MediaBrowser.Controller/Providers/AudioInfoProvider.cs index ce0759715e..709589cdb4 100644 --- a/MediaBrowser.Controller/Providers/AudioInfoProvider.cs +++ b/MediaBrowser.Controller/Providers/AudioInfoProvider.cs @@ -26,12 +26,6 @@ namespace MediaBrowser.Controller.Providers protected override void Fetch(Audio audio, FFProbeResult data) { - if (data == null) - { - Logger.LogInfo("Null FFProbeResult for {0} {1}", audio.Id, audio.Name); - return; - } - MediaStream stream = data.streams.First(s => s.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase)); string bitrate = null; @@ -176,16 +170,25 @@ namespace MediaBrowser.Controller.Providers FFProbeResult result = FFProbe.Run(myItem, CacheDirectory); - if (result.format.tags != null) + if (result == null) + { + Logger.LogInfo("Null FFProbeResult for {0} {1}", item.Id, item.Name); + return; + } + + if (result.format != null && result.format.tags != null) { result.format.tags = ConvertDictionaryToCaseInSensitive(result.format.tags); } - foreach (MediaStream stream in result.streams) + if (result.streams != null) { - if (stream.tags != null) + foreach (MediaStream stream in result.streams) { - stream.tags = ConvertDictionaryToCaseInSensitive(stream.tags); + if (stream.tags != null) + { + stream.tags = ConvertDictionaryToCaseInSensitive(stream.tags); + } } } diff --git a/MediaBrowser.Controller/Providers/VideoInfoProvider.cs b/MediaBrowser.Controller/Providers/VideoInfoProvider.cs index fdc4a1147c..4da83a8ccf 100644 --- a/MediaBrowser.Controller/Providers/VideoInfoProvider.cs +++ b/MediaBrowser.Controller/Providers/VideoInfoProvider.cs @@ -27,40 +27,40 @@ namespace MediaBrowser.Controller.Providers protected override void Fetch(Video video, FFProbeResult data) { - if (data == null) + if (data.format != null) { - Logger.LogInfo("Null FFProbeResult for {0} {1}", video.Id, video.Name); - return; - } - - if (!string.IsNullOrEmpty(data.format.duration)) - { - video.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration)).Ticks; - } - - if (!string.IsNullOrEmpty(data.format.bit_rate)) - { - video.BitRate = int.Parse(data.format.bit_rate); - } - - // For now, only read info about first video stream - // Files with multiple video streams are possible, but extremely rare - bool foundVideo = false; - - foreach (MediaStream stream in data.streams) - { - if (stream.codec_type.Equals("video", StringComparison.OrdinalIgnoreCase)) + if (!string.IsNullOrEmpty(data.format.duration)) { - if (!foundVideo) - { - FetchFromVideoStream(video, stream); - } - - foundVideo = true; + video.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration)).Ticks; } - else if (stream.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase)) + + if (!string.IsNullOrEmpty(data.format.bit_rate)) { - FetchFromAudioStream(video, stream); + video.BitRate = int.Parse(data.format.bit_rate); + } + } + + if (data.streams != null) + { + // For now, only read info about first video stream + // Files with multiple video streams are possible, but extremely rare + bool foundVideo = false; + + foreach (MediaStream stream in data.streams) + { + if (stream.codec_type.Equals("video", StringComparison.OrdinalIgnoreCase)) + { + if (!foundVideo) + { + FetchFromVideoStream(video, stream); + } + + foundVideo = true; + } + else if (stream.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase)) + { + FetchFromAudioStream(video, stream); + } } } } @@ -111,6 +111,17 @@ namespace MediaBrowser.Controller.Providers streams.Add(audio); video.AudioStreams = streams; } + + private void FetchFromSubtitleStream(Video video, MediaStream stream) + { + SubtitleStream subtitle = new SubtitleStream(); + + subtitle.Language = GetDictionaryValue(stream.tags, "language"); + + List streams = video.Subtitles ?? new List(); + streams.Add(subtitle); + video.Subtitles = streams; + } /// /// Determines if there's already enough info in the Video object to allow us to skip running ffprobe