Ver código fonte

improved chapter saving to respect forced refreshing

Luke Pulverenti 12 anos atrás
pai
commit
80a256bdea

+ 71 - 35
MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs

@@ -7,6 +7,7 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Localization;
 using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Logging;
@@ -84,6 +85,14 @@ namespace MediaBrowser.Providers.MediaInfo
             }
         }
 
+        public override MetadataProviderPriority Priority
+        {
+            get
+            {
+                return MetadataProviderPriority.Second;
+            }
+        }
+
         /// <summary>
         /// Supports video files and dvd structures
         /// </summary>
@@ -149,7 +158,7 @@ namespace MediaBrowser.Providers.MediaInfo
 
                 cancellationToken.ThrowIfCancellationRequested();
 
-                await Fetch(myItem, cancellationToken, result, isoMount).ConfigureAwait(false);
+                await Fetch(myItem, force, cancellationToken, result, isoMount).ConfigureAwait(false);
 
                 SetLastRefreshed(item, DateTime.UtcNow);
             }
@@ -243,11 +252,12 @@ namespace MediaBrowser.Providers.MediaInfo
         /// Fetches the specified video.
         /// </summary>
         /// <param name="video">The video.</param>
+        /// <param name="force">if set to <c>true</c> [force].</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <param name="data">The data.</param>
         /// <param name="isoMount">The iso mount.</param>
         /// <returns>Task.</returns>
-        protected async Task Fetch(Video video, CancellationToken cancellationToken, MediaInfoResult data, IIsoMount isoMount)
+        protected async Task Fetch(Video video, bool force, CancellationToken cancellationToken, MediaInfoResult data, IIsoMount isoMount)
         {
             if (data.format != null)
             {
@@ -277,7 +287,7 @@ namespace MediaBrowser.Providers.MediaInfo
 
             AddExternalSubtitles(video);
 
-            FetchWtvInfo(video, data);
+            FetchWtvInfo(video, force, data);
 
             if (chapters.Count == 0 && video.MediaStreams.Any(i => i.Type == MediaStreamType.Video))
             {
@@ -285,68 +295,94 @@ namespace MediaBrowser.Providers.MediaInfo
             }
 
             await Kernel.Instance.FFMpegManager.PopulateChapterImages(video, chapters, false, false, cancellationToken).ConfigureAwait(false);
-            
-            await _itemRepo.SaveChapters(video.Id, chapters, cancellationToken).ConfigureAwait(false);
+
+            // Only save chapters if forcing or there are not already any saved ones
+            if (force || _itemRepo.GetChapter(video.Id, 0) == null)
+            {
+                await _itemRepo.SaveChapters(video.Id, chapters, cancellationToken).ConfigureAwait(false);
+            }
         }
 
         /// <summary>
         /// Fetches the WTV info.
         /// </summary>
         /// <param name="video">The video.</param>
+        /// <param name="force">if set to <c>true</c> [force].</param>
         /// <param name="data">The data.</param>
-        private void FetchWtvInfo(Video video, MediaInfoResult data)
+        private void FetchWtvInfo(Video video, bool force, MediaInfoResult data)
         {
             if (data.format == null || data.format.tags == null)
             {
                 return;
             }
 
-            if (!video.LockedFields.Contains(MetadataFields.Genres))
+            if (force || video.Genres.Count == 0)
             {
-                var genres = GetDictionaryValue(data.format.tags, "genre");
-
-                if (!string.IsNullOrEmpty(genres))
+                if (!video.LockedFields.Contains(MetadataFields.Genres))
                 {
-                    video.Genres = genres.Split(new[] { ';', '/' }, StringSplitOptions.RemoveEmptyEntries)
-                        .Where(i => !string.IsNullOrWhiteSpace(i))
-                        .Select(i => i.Trim())
-                        .ToList();
+                    var genres = GetDictionaryValue(data.format.tags, "genre");
+
+                    if (!string.IsNullOrEmpty(genres))
+                    {
+                        video.Genres = genres.Split(new[] { ';', '/' }, StringSplitOptions.RemoveEmptyEntries)
+                            .Where(i => !string.IsNullOrWhiteSpace(i))
+                            .Select(i => i.Trim())
+                            .ToList();
+                    }
                 }
             }
 
-            var overview = GetDictionaryValue(data.format.tags, "WM/SubTitleDescription");
-
-            if (!string.IsNullOrWhiteSpace(overview))
+            if (force || string.IsNullOrEmpty(video.Overview))
             {
-                video.Overview = overview;
-            }
+                if (!video.LockedFields.Contains(MetadataFields.Overview))
+                {
+                    var overview = GetDictionaryValue(data.format.tags, "WM/SubTitleDescription");
 
-            var officialRating = GetDictionaryValue(data.format.tags, "WM/ParentalRating");
+                    if (!string.IsNullOrWhiteSpace(overview))
+                    {
+                        video.Overview = overview;
+                    }
+                }
+            }
 
-            if (!string.IsNullOrWhiteSpace(officialRating))
+            if (force || string.IsNullOrEmpty(video.OfficialRating))
             {
-                video.OfficialRating = officialRating;
-            }
+                var officialRating = GetDictionaryValue(data.format.tags, "WM/ParentalRating");
 
-            var people = GetDictionaryValue(data.format.tags, "WM/MediaCredits");
+                if (!string.IsNullOrWhiteSpace(officialRating))
+                {
+                    video.OfficialRating = officialRating;
+                }
+            }
 
-            if (!string.IsNullOrEmpty(people))
+            if (force || video.People.Count == 0)
             {
-                video.People = people.Split(new[] { ';', '/' }, StringSplitOptions.RemoveEmptyEntries)
-                    .Where(i => !string.IsNullOrWhiteSpace(i))
-                    .Select(i => new PersonInfo { Name = i.Trim(), Type = PersonType.Actor })
-                    .ToList();
-            }
+                if (!video.LockedFields.Contains(MetadataFields.Cast))
+                {
+                    var people = GetDictionaryValue(data.format.tags, "WM/MediaCredits");
 
-            var year = GetDictionaryValue(data.format.tags, "WM/OriginalReleaseTime");
+                    if (!string.IsNullOrEmpty(people))
+                    {
+                        video.People = people.Split(new[] { ';', '/' }, StringSplitOptions.RemoveEmptyEntries)
+                            .Where(i => !string.IsNullOrWhiteSpace(i))
+                            .Select(i => new PersonInfo { Name = i.Trim(), Type = PersonType.Actor })
+                            .ToList();
+                    }
+                }
+            }
 
-            if (!string.IsNullOrWhiteSpace(year))
+            if (force || !video.ProductionYear.HasValue)
             {
-                int val;
+                var year = GetDictionaryValue(data.format.tags, "WM/OriginalReleaseTime");
 
-                if (int.TryParse(year, NumberStyles.Integer, UsCulture, out val))
+                if (!string.IsNullOrWhiteSpace(year))
                 {
-                    video.ProductionYear = val;
+                    int val;
+
+                    if (int.TryParse(year, NumberStyles.Integer, UsCulture, out val))
+                    {
+                        video.ProductionYear = val;
+                    }
                 }
             }
         }

+ 1 - 1
MediaBrowser.Providers/Movies/MovieProviderFromXml.cs

@@ -49,7 +49,7 @@ namespace MediaBrowser.Providers.Movies
         /// <value>The priority.</value>
         public override MetadataProviderPriority Priority
         {
-            get { return MetadataProviderPriority.Second; }
+            get { return MetadataProviderPriority.First; }
         }
 
         /// <summary>

+ 1 - 1
MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs

@@ -43,7 +43,7 @@ namespace MediaBrowser.Providers.TV
         /// <value>The priority.</value>
         public override MetadataProviderPriority Priority
         {
-            get { return MetadataProviderPriority.Second; }
+            get { return MetadataProviderPriority.First; }
         }
 
         /// <summary>

+ 2 - 2
MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs

@@ -38,7 +38,7 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks
 
         private readonly List<Video> _newlyAddedItems = new List<Video>();
 
-        private const int NewItemDelay = 60000;
+        private const int NewItemDelay = 30000;
 
         /// <summary>
         /// The current new item timer
@@ -107,7 +107,7 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks
             // Limit to video files to reduce changes of ffmpeg crash dialog
             foreach (var item in newItems
                 .Where(i => i.LocationType == LocationType.FileSystem && i.VideoType == VideoType.VideoFile && string.IsNullOrEmpty(i.PrimaryImagePath) && i.MediaStreams.Any(m => m.Type == MediaStreamType.Video))
-                .Take(1))
+                .Take(2))
             {
                 try
                 {