diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs
index 39beda9ce..43ce4cd40 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;
- }
-
- var officialRating = GetDictionaryValue(data.format.tags, "WM/ParentalRating");
-
- if (!string.IsNullOrWhiteSpace(officialRating))
- {
- video.OfficialRating = officialRating;
- }
-
- var people = GetDictionaryValue(data.format.tags, "WM/MediaCredits");
-
- 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();
- }
-
- var year = GetDictionaryValue(data.format.tags, "WM/OriginalReleaseTime");
-
- if (!string.IsNullOrWhiteSpace(year))
- {
- int val;
-
- if (int.TryParse(year, NumberStyles.Integer, UsCulture, out val))
+ if (!video.LockedFields.Contains(MetadataFields.Overview))
{
- video.ProductionYear = val;
+ var overview = GetDictionaryValue(data.format.tags, "WM/SubTitleDescription");
+
+ if (!string.IsNullOrWhiteSpace(overview))
+ {
+ video.Overview = overview;
+ }
+ }
+ }
+
+ if (force || string.IsNullOrEmpty(video.OfficialRating))
+ {
+ var officialRating = GetDictionaryValue(data.format.tags, "WM/ParentalRating");
+
+ if (!string.IsNullOrWhiteSpace(officialRating))
+ {
+ video.OfficialRating = officialRating;
+ }
+ }
+
+ if (force || video.People.Count == 0)
+ {
+ if (!video.LockedFields.Contains(MetadataFields.Cast))
+ {
+ var people = GetDictionaryValue(data.format.tags, "WM/MediaCredits");
+
+ 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 (force || !video.ProductionYear.HasValue)
+ {
+ var year = GetDictionaryValue(data.format.tags, "WM/OriginalReleaseTime");
+
+ if (!string.IsNullOrWhiteSpace(year))
+ {
+ 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 d6ab77881..76fee746c 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 2408b14ce..e91d7ead7 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 0aaafec83..1cc19b02f 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