Browse Source

Don't extract chapter images if chapters are <1s long on average (#11832)

Bond-009 8 months ago
parent
commit
6b646e24ea
1 changed files with 30 additions and 0 deletions
  1. 30 0
      Emby.Server.Implementations/MediaEncoder/EncodingManager.cs

+ 30 - 0
Emby.Server.Implementations/MediaEncoder/EncodingManager.cs

@@ -91,8 +91,30 @@ namespace Emby.Server.Implementations.MediaEncoder
             return video.DefaultVideoStreamIndex.HasValue;
         }
 
+        private long GetAverageDurationBetweenChapters(IReadOnlyList<ChapterInfo> chapters)
+        {
+            if (chapters.Count < 2)
+            {
+                return 0;
+            }
+
+            long sum = 0;
+            for (int i = 1; i < chapters.Count; i++)
+            {
+                sum += chapters[i].StartPositionTicks - chapters[i - 1].StartPositionTicks;
+            }
+
+            return sum / chapters.Count;
+        }
+
+
         public async Task<bool> RefreshChapterImages(Video video, IDirectoryService directoryService, IReadOnlyList<ChapterInfo> chapters, bool extractImages, bool saveChapters, CancellationToken cancellationToken)
         {
+            if (chapters.Count == 0)
+            {
+                return true;
+            }
+
             var libraryOptions = _libraryManager.GetLibraryOptions(video);
 
             if (!IsEligibleForChapterImageExtraction(video, libraryOptions))
@@ -100,6 +122,14 @@ namespace Emby.Server.Implementations.MediaEncoder
                 extractImages = false;
             }
 
+            var averageChapterDuration = GetAverageDurationBetweenChapters(chapters);
+            var threshold = TimeSpan.FromSeconds(1).Ticks;
+            if (averageChapterDuration < threshold)
+            {
+                _logger.LogInformation("Skipping chapter image extraction for {Video} as the average chapter duration {AverageDuration} was lower than the minimum threshold {Threshold}", video.Name, averageChapterDuration, threshold);
+                extractImages = false;
+            }
+
             var success = true;
             var changesMade = false;