diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index c21b9b05f3..e9eee9e40e 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -570,7 +570,9 @@ namespace MediaBrowser.Controller.Entities } return audio; - }).ToList(); + + // Sort them so that the list can be easily compared for changes + }).OrderBy(i => i.Path).ToList(); } /// @@ -594,7 +596,9 @@ namespace MediaBrowser.Controller.Entities } return item; - }).ToList(); + + // Sort them so that the list can be easily compared for changes + }).OrderBy(i => i.Path).ToList(); } public Task RefreshMetadata(CancellationToken cancellationToken) @@ -652,8 +656,19 @@ namespace MediaBrowser.Controller.Entities } } - if (themeSongsChanged || themeVideosChanged || localTrailersChanged) + if (themeSongsChanged) { + Logger.Debug("Theme songs have changed for {0}", Path); + options.ForceSave = true; + } + if (themeVideosChanged) + { + Logger.Debug("Theme videos have changed for {0}", Path); + options.ForceSave = true; + } + if (localTrailersChanged) + { + Logger.Debug("Local trailers have changed for {0}", Path); options.ForceSave = true; } } @@ -684,6 +699,7 @@ namespace MediaBrowser.Controller.Entities private async Task RefreshThemeVideos(IHasThemeMedia item, MetadataRefreshOptions options, IEnumerable fileSystemChildren, CancellationToken cancellationToken) { var newThemeVideos = LoadThemeVideos(fileSystemChildren).ToList(); + var newThemeVideoIds = newThemeVideos.Select(i => i.Id).ToList(); var themeVideosChanged = !item.ThemeVideoIds.SequenceEqual(newThemeVideoIds); diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index b625789a1e..61cd5a2dc8 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -366,7 +366,7 @@ namespace MediaBrowser.Controller.Entities cancellationToken.ThrowIfCancellationRequested(); - var validChildren = new List>(); + var validChildren = new List(); if (locationType != LocationType.Remote && locationType != LocationType.Virtual) { @@ -412,11 +412,11 @@ namespace MediaBrowser.Controller.Entities } currentChild.IsInMixedFolder = child.IsInMixedFolder; - validChildren.Add(new Tuple(currentChild, true)); + validChildren.Add(currentChild); } else { - validChildren.Add(new Tuple(currentChild, false)); + validChildren.Add(currentChild); } currentChild.IsOffline = false; @@ -426,17 +426,15 @@ namespace MediaBrowser.Controller.Entities //brand new item - needs to be added newItems.Add(child); - validChildren.Add(new Tuple(child, true)); + validChildren.Add(child); } } // If any items were added or removed.... if (newItems.Count > 0 || currentChildren.Count != validChildren.Count) { - var newChildren = validChildren.Select(c => c.Item1).ToList(); - // That's all the new and changed ones - now see if there are any that are missing - var itemsRemoved = currentChildren.Values.Except(newChildren).ToList(); + var itemsRemoved = currentChildren.Values.Except(validChildren).ToList(); var actualRemovals = new List(); @@ -446,14 +444,14 @@ namespace MediaBrowser.Controller.Entities item.LocationType == LocationType.Remote) { // Don't remove these because there's no way to accurately validate them. - validChildren.Add(new Tuple(item, false)); + validChildren.Add(item); } else if (!string.IsNullOrEmpty(item.Path) && IsPathOffline(item.Path)) { item.IsOffline = true; - validChildren.Add(new Tuple(item, false)); + validChildren.Add(item); } else { @@ -481,7 +479,7 @@ namespace MediaBrowser.Controller.Entities } else { - validChildren.AddRange(ActualChildren.Select(i => new Tuple(i, false))); + validChildren.AddRange(ActualChildren); } progress.Report(10); @@ -502,7 +500,7 @@ namespace MediaBrowser.Controller.Entities /// if set to true [recursive]. /// if set to true [force refresh metadata]. /// Task. - private async Task RefreshChildren(IList> children, IProgress progress, CancellationToken cancellationToken, bool? recursive, bool forceRefreshMetadata = false) + private async Task RefreshChildren(IList children, IProgress progress, CancellationToken cancellationToken, bool? recursive, bool forceRefreshMetadata = false) { var list = children; @@ -525,17 +523,16 @@ namespace MediaBrowser.Controller.Entities await Task.WhenAll(tasks).ConfigureAwait(false); } - private async Task RefreshChild(Tuple currentTuple, IProgress progress, Dictionary percentages, int childCount, CancellationToken cancellationToken, bool? recursive, bool forceRefreshMetadata = false) + private async Task RefreshChild(BaseItem item, IProgress progress, Dictionary percentages, int childCount, CancellationToken cancellationToken, bool? recursive, bool forceRefreshMetadata = false) { cancellationToken.ThrowIfCancellationRequested(); - var child = currentTuple.Item1; + var child = item; try { //refresh it await child.RefreshMetadata(new MetadataRefreshOptions { - ForceSave = currentTuple.Item2, ReplaceAllMetadata = forceRefreshMetadata }, cancellationToken).ConfigureAwait(false); @@ -546,7 +543,7 @@ namespace MediaBrowser.Controller.Entities } // Refresh children if a folder and the item changed or recursive is set to true - var refreshChildren = child.IsFolder && (currentTuple.Item2 || (recursive.HasValue && recursive.Value)); + var refreshChildren = child.IsFolder; if (refreshChildren) { diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 41a1969d65..b3145e4967 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -157,7 +157,9 @@ namespace MediaBrowser.Controller.Entities.Movies } return video; - }); + + // Sort them so that the list can be easily compared for changes + }).OrderBy(i => i.Path).ToList(); } protected override bool GetBlockUnratedValue(UserConfiguration config) diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index de78068b38..6aa3ae819a 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -238,7 +238,8 @@ namespace MediaBrowser.Controller.Entities return video; - }).ToList(); + // Sort them so that the list can be easily compared for changes + }).OrderBy(i => i.Path).ToList(); } public override IEnumerable GetDeletePaths()