From 80a256bdea9246ad2eb4be3a4f089631179747dc Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 15 Aug 2013 10:56:43 -0400 Subject: [PATCH] improved chapter saving to respect forced refreshing --- .../MediaInfo/FFProbeVideoInfoProvider.cs | 106 ++++++++++++------ .../Movies/MovieProviderFromXml.cs | 2 +- .../TV/EpisodeProviderFromXml.cs | 2 +- .../ScheduledTasks/ChapterImagesTask.cs | 4 +- 4 files changed, 75 insertions(+), 39 deletions(-) diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs index 39beda9cee..43ce4cd408 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs +++ b/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; + } + } + /// /// Supports video files and dvd structures /// @@ -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. /// /// The video. + /// if set to true [force]. /// The cancellation token. /// The data. /// The iso mount. /// Task. - 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); + } } /// /// Fetches the WTV info. /// /// The video. + /// if set to true [force]. /// The data. - 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; + } } } } diff --git a/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs b/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs index d6ab77881a..76fee746c1 100644 --- a/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs +++ b/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs @@ -49,7 +49,7 @@ namespace MediaBrowser.Providers.Movies /// The priority. public override MetadataProviderPriority Priority { - get { return MetadataProviderPriority.Second; } + get { return MetadataProviderPriority.First; } } /// diff --git a/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs b/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs index 2408b14ce6..e91d7ead7e 100644 --- a/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs +++ b/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs @@ -43,7 +43,7 @@ namespace MediaBrowser.Providers.TV /// The priority. public override MetadataProviderPriority Priority { - get { return MetadataProviderPriority.Second; } + get { return MetadataProviderPriority.First; } } /// diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs index 0aaafec836..1cc19b02f0 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs @@ -38,7 +38,7 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks private readonly List