2
0
Эх сурвалжийг харах

Added some ffprobe error handling

LukePulverenti Luke Pulverenti luke pulverenti 13 жил өмнө
parent
commit
37dd0c8bdd

+ 5 - 2
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;
         }

+ 13 - 10
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);
+                        }
                     }
                 }
 

+ 36 - 25
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.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);
+                }
             }
 
-            if (!string.IsNullOrEmpty(data.format.bit_rate))
+            if (data.streams != null)
             {
-                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;
+                // 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))
+                foreach (MediaStream stream in data.streams)
                 {
-                    if (!foundVideo)
+                    if (stream.codec_type.Equals("video", StringComparison.OrdinalIgnoreCase))
                     {
-                        FetchFromVideoStream(video, stream);
-                    }
+                        if (!foundVideo)
+                        {
+                            FetchFromVideoStream(video, stream);
+                        }
 
-                    foundVideo = true;
-                }
-                else if (stream.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase))
-                {
-                    FetchFromAudioStream(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<SubtitleStream> streams = video.Subtitles ?? new List<SubtitleStream>();
+            streams.Add(subtitle);
+            video.Subtitles = streams;
+        }
         
         /// <summary>
         /// Determines if there's already enough info in the Video object to allow us to skip running ffprobe