Selaa lähdekoodia

refresh people on demand, when needed

Luke Pulverenti 8 vuotta sitten
vanhempi
sitoutus
1adcfaadef

+ 37 - 2
MediaBrowser.Api/UserLibrary/UserLibraryService.cs

@@ -12,6 +12,8 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using CommonIO;
+using MediaBrowser.Controller.Providers;
 
 
 namespace MediaBrowser.Api.UserLibrary
 namespace MediaBrowser.Api.UserLibrary
 {
 {
@@ -262,14 +264,16 @@ namespace MediaBrowser.Api.UserLibrary
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
         private readonly IDtoService _dtoService;
         private readonly IDtoService _dtoService;
         private readonly IUserViewManager _userViewManager;
         private readonly IUserViewManager _userViewManager;
+        private readonly IFileSystem _fileSystem;
 
 
-        public UserLibraryService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, IUserViewManager userViewManager)
+        public UserLibraryService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, IUserViewManager userViewManager, IFileSystem fileSystem)
         {
         {
             _userManager = userManager;
             _userManager = userManager;
             _libraryManager = libraryManager;
             _libraryManager = libraryManager;
             _userDataRepository = userDataRepository;
             _userDataRepository = userDataRepository;
             _dtoService = dtoService;
             _dtoService = dtoService;
             _userViewManager = userViewManager;
             _userViewManager = userViewManager;
+            _fileSystem = fileSystem;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -426,12 +430,14 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
         /// <returns>System.Object.</returns>
         /// <returns>System.Object.</returns>
-        public object Get(GetItem request)
+        public async Task<object> Get(GetItem request)
         {
         {
             var user = _userManager.GetUserById(request.UserId);
             var user = _userManager.GetUserById(request.UserId);
 
 
             var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id);
             var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id);
 
 
+            await RefreshItemOnDemandIfNeeded(item).ConfigureAwait(false);
+
             var dtoOptions = GetDtoOptions(request);
             var dtoOptions = GetDtoOptions(request);
 
 
             var result = _dtoService.GetBaseItemDto(item, dtoOptions, user);
             var result = _dtoService.GetBaseItemDto(item, dtoOptions, user);
@@ -439,6 +445,35 @@ namespace MediaBrowser.Api.UserLibrary
             return ToOptimizedSerializedResultUsingCache(result);
             return ToOptimizedSerializedResultUsingCache(result);
         }
         }
 
 
+        private async Task RefreshItemOnDemandIfNeeded(BaseItem item)
+        {
+            if (item is Person)
+            {
+                var hasMetdata = !string.IsNullOrWhiteSpace(item.Overview) && item.HasImage(ImageType.Primary);
+                var performFullRefresh = !hasMetdata && (DateTime.UtcNow - item.DateLastRefreshed).TotalDays >= 7;
+
+                if (!hasMetdata)
+                {
+                    var defaultMetadataRefreshMode = performFullRefresh
+                        ? MetadataRefreshMode.FullRefresh
+                        : MetadataRefreshMode.Default;
+
+                    var imageRefreshMode = performFullRefresh
+                        ? ImageRefreshMode.FullRefresh
+                        : ImageRefreshMode.Default;
+
+                    var options = new MetadataRefreshOptions(_fileSystem)
+                    {
+                        MetadataRefreshMode = defaultMetadataRefreshMode,
+                        ImageRefreshMode = imageRefreshMode,
+                        ForceSave = performFullRefresh
+                    };
+
+                    await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);
+                }
+            }
+        }
+
         /// <summary>
         /// <summary>
         /// Gets the specified request.
         /// Gets the specified request.
         /// </summary>
         /// </summary>

+ 9 - 0
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -2213,6 +2213,15 @@ namespace MediaBrowser.Controller.Entities
             }
             }
         }
         }
 
 
+        [IgnoreDataMember]
+        public virtual bool StopRefreshIfLocalMetadataFound
+        {
+            get
+            {
+                return true;
+            }
+        }
+
         public virtual IEnumerable<Guid> GetIdsForAncestorQuery()
         public virtual IEnumerable<Guid> GetIdsForAncestorQuery()
         {
         {
             return new[] { Id };
             return new[] { Id };

+ 1 - 1
MediaBrowser.Controller/Entities/IHasMetadata.cs

@@ -58,6 +58,6 @@ namespace MediaBrowser.Controller.Entities
 
 
         string GetPresentationUniqueKey();
         string GetPresentationUniqueKey();
         string CreatePresentationUniqueKey();
         string CreatePresentationUniqueKey();
-
+        bool StopRefreshIfLocalMetadataFound { get; }
     }
     }
 }
 }

+ 10 - 0
MediaBrowser.Controller/Entities/Movies/Movie.cs

@@ -179,5 +179,15 @@ namespace MediaBrowser.Controller.Entities.Movies
 
 
             return list;
             return list;
         }
         }
+
+        [IgnoreDataMember]
+        public override bool StopRefreshIfLocalMetadataFound
+        {
+            get
+            {
+                // Need people id's from internet metadata
+                return false;
+            }
+        }
     }
     }
 }
 }

+ 10 - 0
MediaBrowser.Controller/Entities/TV/Series.cs

@@ -519,5 +519,15 @@ namespace MediaBrowser.Controller.Entities.TV
 
 
             return list;
             return list;
         }
         }
+
+        [IgnoreDataMember]
+        public override bool StopRefreshIfLocalMetadataFound
+        {
+            get
+            {
+                // Need people id's from internet metadata
+                return false;
+            }
+        }
     }
     }
 }
 }

+ 10 - 0
MediaBrowser.Controller/Entities/Trailer.cs

@@ -124,5 +124,15 @@ namespace MediaBrowser.Controller.Entities
 
 
             return list;
             return list;
         }
         }
+
+        [IgnoreDataMember]
+        public override bool StopRefreshIfLocalMetadataFound
+        {
+            get
+            {
+                // Need people id's from internet metadata
+                return false;
+            }
+        }
     }
     }
 }
 }

+ 1 - 1
MediaBrowser.Providers/Manager/MetadataService.cs

@@ -532,7 +532,7 @@ namespace MediaBrowser.Providers.Manager
             }
             }
 
 
             // Local metadata is king - if any is found don't run remote providers
             // Local metadata is king - if any is found don't run remote providers
-            if (!options.ReplaceAllMetadata && (!hasLocalMetadata || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh))
+            if (!options.ReplaceAllMetadata && (!hasLocalMetadata || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || !item.StopRefreshIfLocalMetadataFound))
             {
             {
                 var remoteResult = await ExecuteRemoteProviders(temp, logName, id, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), cancellationToken)
                 var remoteResult = await ExecuteRemoteProviders(temp, logName, id, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), cancellationToken)
                     .ConfigureAwait(false);
                     .ConfigureAwait(false);