浏览代码

Restrict metadata refresh of missing/virtual episodes

This commit can significantly improe library scan times!
(in my case from 15minutes to 50s)

This fixes the following situation:

When a user has a series in his library with lots of episodes (like
thousands), the metadata for ALL series episodes was refreshed during
each library scan. This resulted in very long scan times, even when
using the provider's cached data.

This fix skips metadata refresh for episodes that are NOT present in the
local library and are having an airdate older than 30days (no more
changes likely to occur) during library scans.

But these skipped items would still be refreshed during a full metadata
refresh.

I believe this is an acceptable balance between performance and
accuracy.
softworkz 9 年之前
父节点
当前提交
ad6bde6355
共有 1 个文件被更改,包括 21 次插入3 次删除
  1. 21 3
      MediaBrowser.Controller/Entities/TV/Series.cs

+ 21 - 3
MediaBrowser.Controller/Entities/TV/Series.cs

@@ -255,7 +255,7 @@ namespace MediaBrowser.Controller.Entities.TV
             // Refresh current item
             await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
 
-            // Refresh TV
+            // Refresh seasons
             foreach (var item in seasons)
             {
                 cancellationToken.ThrowIfCancellationRequested();
@@ -268,12 +268,30 @@ namespace MediaBrowser.Controller.Entities.TV
                 progress.Report(percent * 100);
             }
 
-            // Refresh all non-songs
+            // Refresh episodes and other children
             foreach (var item in otherItems)
             {
                 cancellationToken.ThrowIfCancellationRequested();
 
-                await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+                var skipItem = false;
+
+                var episode = item as Episode;
+
+                if (episode != null
+                    && refreshOptions.MetadataRefreshMode != MetadataRefreshMode.FullRefresh
+                    && !refreshOptions.ReplaceAllMetadata
+                    && episode.IsMissingEpisode 
+                    && episode.LocationType == Model.Entities.LocationType.Virtual 
+                    && episode.PremiereDate.HasValue 
+                    && (DateTime.UtcNow - episode.PremiereDate.Value).TotalDays > 30)
+                {
+                    skipItem = true;
+                }
+
+                if (!skipItem)
+                {
+                    await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+                }
 
                 numComplete++;
                 double percent = numComplete;