|  | @@ -23,10 +23,12 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |      public class LibraryChangedNotifier : IServerEntryPoint
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  | -        /// The library manager.
 | 
	
		
			
				|  |  | +        /// The library update duration.
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  | -        private readonly ILibraryManager _libraryManager;
 | 
	
		
			
				|  |  | +        private const int LibraryUpdateDuration = 30000;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        private readonly ILibraryManager _libraryManager;
 | 
	
		
			
				|  |  | +        private readonly IProviderManager _providerManager;
 | 
	
		
			
				|  |  |          private readonly ISessionManager _sessionManager;
 | 
	
		
			
				|  |  |          private readonly IUserManager _userManager;
 | 
	
		
			
				|  |  |          private readonly ILogger<LibraryChangedNotifier> _logger;
 | 
	
	
		
			
				|  | @@ -38,23 +40,10 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private readonly List<Folder> _foldersAddedTo = new List<Folder>();
 | 
	
		
			
				|  |  |          private readonly List<Folder> _foldersRemovedFrom = new List<Folder>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          private readonly List<BaseItem> _itemsAdded = new List<BaseItem>();
 | 
	
		
			
				|  |  |          private readonly List<BaseItem> _itemsRemoved = new List<BaseItem>();
 | 
	
		
			
				|  |  |          private readonly List<BaseItem> _itemsUpdated = new List<BaseItem>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /// <summary>
 | 
	
		
			
				|  |  | -        /// Gets or sets the library update timer.
 | 
	
		
			
				|  |  | -        /// </summary>
 | 
	
		
			
				|  |  | -        /// <value>The library update timer.</value>
 | 
	
		
			
				|  |  | -        private Timer LibraryUpdateTimer { get; set; }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /// <summary>
 | 
	
		
			
				|  |  | -        /// The library update duration.
 | 
	
		
			
				|  |  | -        /// </summary>
 | 
	
		
			
				|  |  | -        private const int LibraryUpdateDuration = 30000;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private readonly IProviderManager _providerManager;
 | 
	
		
			
				|  |  | +        private readonly Dictionary<Guid, DateTime> _lastProgressMessageTimes = new Dictionary<Guid, DateTime>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public LibraryChangedNotifier(
 | 
	
		
			
				|  |  |              ILibraryManager libraryManager,
 | 
	
	
		
			
				|  | @@ -70,22 +59,26 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |              _providerManager = providerManager;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// Gets or sets the library update timer.
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        /// <value>The library update timer.</value>
 | 
	
		
			
				|  |  | +        private Timer LibraryUpdateTimer { get; set; }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          public Task RunAsync()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            _libraryManager.ItemAdded += libraryManager_ItemAdded;
 | 
	
		
			
				|  |  | -            _libraryManager.ItemUpdated += libraryManager_ItemUpdated;
 | 
	
		
			
				|  |  | -            _libraryManager.ItemRemoved += libraryManager_ItemRemoved;
 | 
	
		
			
				|  |  | +            _libraryManager.ItemAdded += OnLibraryItemAdded;
 | 
	
		
			
				|  |  | +            _libraryManager.ItemUpdated += OnLibraryItemUpdated;
 | 
	
		
			
				|  |  | +            _libraryManager.ItemRemoved += OnLibraryItemRemoved;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            _providerManager.RefreshCompleted += _providerManager_RefreshCompleted;
 | 
	
		
			
				|  |  | -            _providerManager.RefreshStarted += _providerManager_RefreshStarted;
 | 
	
		
			
				|  |  | -            _providerManager.RefreshProgress += _providerManager_RefreshProgress;
 | 
	
		
			
				|  |  | +            _providerManager.RefreshCompleted += OnProviderRefreshCompleted;
 | 
	
		
			
				|  |  | +            _providerManager.RefreshStarted += OnProviderRefreshStarted;
 | 
	
		
			
				|  |  | +            _providerManager.RefreshProgress += OnProviderRefreshProgress;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              return Task.CompletedTask;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private Dictionary<Guid, DateTime> _lastProgressMessageTimes = new Dictionary<Guid, DateTime>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private void _providerManager_RefreshProgress(object sender, GenericEventArgs<Tuple<BaseItem, double>> e)
 | 
	
		
			
				|  |  | +        private void OnProviderRefreshProgress(object sender, GenericEventArgs<Tuple<BaseItem, double>> e)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              var item = e.Argument.Item1;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -122,9 +115,11 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              foreach (var collectionFolder in collectionFolders)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                var collectionFolderDict = new Dictionary<string, string>();
 | 
	
		
			
				|  |  | -                collectionFolderDict["ItemId"] = collectionFolder.Id.ToString("N", CultureInfo.InvariantCulture);
 | 
	
		
			
				|  |  | -                collectionFolderDict["Progress"] = (collectionFolder.GetRefreshProgress() ?? 0).ToString(CultureInfo.InvariantCulture);
 | 
	
		
			
				|  |  | +                var collectionFolderDict = new Dictionary<string, string>
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    ["ItemId"] = collectionFolder.Id.ToString("N", CultureInfo.InvariantCulture),
 | 
	
		
			
				|  |  | +                    ["Progress"] = (collectionFolder.GetRefreshProgress() ?? 0).ToString(CultureInfo.InvariantCulture)
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  try
 | 
	
		
			
				|  |  |                  {
 | 
	
	
		
			
				|  | @@ -136,21 +131,19 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void _providerManager_RefreshStarted(object sender, GenericEventArgs<BaseItem> e)
 | 
	
		
			
				|  |  | +        private void OnProviderRefreshStarted(object sender, GenericEventArgs<BaseItem> e)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            _providerManager_RefreshProgress(sender, new GenericEventArgs<Tuple<BaseItem, double>>(new Tuple<BaseItem, double>(e.Argument, 0)));
 | 
	
		
			
				|  |  | +            OnProviderRefreshProgress(sender, new GenericEventArgs<Tuple<BaseItem, double>>(new Tuple<BaseItem, double>(e.Argument, 0)));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void _providerManager_RefreshCompleted(object sender, GenericEventArgs<BaseItem> e)
 | 
	
		
			
				|  |  | +        private void OnProviderRefreshCompleted(object sender, GenericEventArgs<BaseItem> e)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            _providerManager_RefreshProgress(sender, new GenericEventArgs<Tuple<BaseItem, double>>(new Tuple<BaseItem, double>(e.Argument, 100)));
 | 
	
		
			
				|  |  | +            OnProviderRefreshProgress(sender, new GenericEventArgs<Tuple<BaseItem, double>>(new Tuple<BaseItem, double>(e.Argument, 100)));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private static bool EnableRefreshMessage(BaseItem item)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            var folder = item as Folder;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (folder == null)
 | 
	
		
			
				|  |  | +            if (!(item is Folder folder))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  return false;
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -183,7 +176,7 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          /// <param name="sender">The source of the event.</param>
 | 
	
		
			
				|  |  |          /// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
 | 
	
		
			
				|  |  | -        void libraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
 | 
	
		
			
				|  |  | +        void OnLibraryItemAdded(object sender, ItemChangeEventArgs e)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if (!FilterItem(e.Item))
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -205,8 +198,7 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |                      LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                var parent = e.Item.GetParent() as Folder;
 | 
	
		
			
				|  |  | -                if (parent != null)
 | 
	
		
			
				|  |  | +                if (e.Item.GetParent() is Folder parent)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      _foldersAddedTo.Add(parent);
 | 
	
		
			
				|  |  |                  }
 | 
	
	
		
			
				|  | @@ -220,7 +212,7 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          /// <param name="sender">The source of the event.</param>
 | 
	
		
			
				|  |  |          /// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
 | 
	
		
			
				|  |  | -        void libraryManager_ItemUpdated(object sender, ItemChangeEventArgs e)
 | 
	
		
			
				|  |  | +        private void OnLibraryItemUpdated(object sender, ItemChangeEventArgs e)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if (!FilterItem(e.Item))
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -231,8 +223,7 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  if (LibraryUpdateTimer == null)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, LibraryUpdateDuration,
 | 
	
		
			
				|  |  | -                                                   Timeout.Infinite);
 | 
	
		
			
				|  |  | +                    LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, LibraryUpdateDuration, Timeout.Infinite);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  else
 | 
	
		
			
				|  |  |                  {
 | 
	
	
		
			
				|  | @@ -248,7 +239,7 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          /// <param name="sender">The source of the event.</param>
 | 
	
		
			
				|  |  |          /// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
 | 
	
		
			
				|  |  | -        void libraryManager_ItemRemoved(object sender, ItemChangeEventArgs e)
 | 
	
		
			
				|  |  | +        void OnLibraryItemRemoved(object sender, ItemChangeEventArgs e)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if (!FilterItem(e.Item))
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -259,16 +250,14 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  if (LibraryUpdateTimer == null)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, LibraryUpdateDuration,
 | 
	
		
			
				|  |  | -                                                   Timeout.Infinite);
 | 
	
		
			
				|  |  | +                    LibraryUpdateTimer = new Timer(LibraryUpdateTimerCallback, null, LibraryUpdateDuration, Timeout.Infinite);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  else
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                var parent = e.Parent as Folder;
 | 
	
		
			
				|  |  | -                if (parent != null)
 | 
	
		
			
				|  |  | +                if (e.Parent is Folder parent)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      _foldersRemovedFrom.Add(parent);
 | 
	
		
			
				|  |  |                  }
 | 
	
	
		
			
				|  | @@ -486,13 +475,13 @@ namespace Emby.Server.Implementations.EntryPoints
 | 
	
		
			
				|  |  |                      LibraryUpdateTimer = null;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                _libraryManager.ItemAdded -= libraryManager_ItemAdded;
 | 
	
		
			
				|  |  | -                _libraryManager.ItemUpdated -= libraryManager_ItemUpdated;
 | 
	
		
			
				|  |  | -                _libraryManager.ItemRemoved -= libraryManager_ItemRemoved;
 | 
	
		
			
				|  |  | +                _libraryManager.ItemAdded -= OnLibraryItemAdded;
 | 
	
		
			
				|  |  | +                _libraryManager.ItemUpdated -= OnLibraryItemUpdated;
 | 
	
		
			
				|  |  | +                _libraryManager.ItemRemoved -= OnLibraryItemRemoved;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                _providerManager.RefreshCompleted -= _providerManager_RefreshCompleted;
 | 
	
		
			
				|  |  | -                _providerManager.RefreshStarted -= _providerManager_RefreshStarted;
 | 
	
		
			
				|  |  | -                _providerManager.RefreshProgress -= _providerManager_RefreshProgress;
 | 
	
		
			
				|  |  | +                _providerManager.RefreshCompleted -= OnProviderRefreshCompleted;
 | 
	
		
			
				|  |  | +                _providerManager.RefreshStarted -= OnProviderRefreshStarted;
 | 
	
		
			
				|  |  | +                _providerManager.RefreshProgress -= OnProviderRefreshProgress;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 |