Convert LibraryChangedNotifier to IHostedService

This commit is contained in:
Patrick Barron 2024-02-06 15:40:52 -05:00
parent d986a824cd
commit 4e02d8aa21
2 changed files with 25 additions and 22 deletions

View File

@ -13,19 +13,19 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Plugins;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Session; using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Session; using MediaBrowser.Model.Session;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.EntryPoints; namespace Emby.Server.Implementations.EntryPoints;
/// <summary> /// <summary>
/// A <see cref="IServerEntryPoint"/> that notifies users when libraries are updated. /// A <see cref="IHostedService"/> responsible for notifying users when libraries are updated.
/// </summary> /// </summary>
public sealed class LibraryChangedNotifier : IServerEntryPoint public sealed class LibraryChangedNotifier : IHostedService, IDisposable
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
private readonly IServerConfigurationManager _configurationManager; private readonly IServerConfigurationManager _configurationManager;
@ -70,7 +70,7 @@ public sealed class LibraryChangedNotifier : IServerEntryPoint
} }
/// <inheritdoc /> /// <inheritdoc />
public Task RunAsync() public Task StartAsync(CancellationToken cancellationToken)
{ {
_libraryManager.ItemAdded += OnLibraryItemAdded; _libraryManager.ItemAdded += OnLibraryItemAdded;
_libraryManager.ItemUpdated += OnLibraryItemUpdated; _libraryManager.ItemUpdated += OnLibraryItemUpdated;
@ -83,6 +83,20 @@ public sealed class LibraryChangedNotifier : IServerEntryPoint
return Task.CompletedTask; return Task.CompletedTask;
} }
/// <inheritdoc />
public Task StopAsync(CancellationToken cancellationToken)
{
_libraryManager.ItemAdded -= OnLibraryItemAdded;
_libraryManager.ItemUpdated -= OnLibraryItemUpdated;
_libraryManager.ItemRemoved -= OnLibraryItemRemoved;
_providerManager.RefreshCompleted -= OnProviderRefreshCompleted;
_providerManager.RefreshStarted -= OnProviderRefreshStarted;
_providerManager.RefreshProgress -= OnProviderRefreshProgress;
return Task.CompletedTask;
}
private void OnProviderRefreshProgress(object? sender, GenericEventArgs<Tuple<BaseItem, double>> e) private void OnProviderRefreshProgress(object? sender, GenericEventArgs<Tuple<BaseItem, double>> e)
{ {
var item = e.Argument.Item1; var item = e.Argument.Item1;
@ -137,9 +151,7 @@ public sealed class LibraryChangedNotifier : IServerEntryPoint
} }
private void OnProviderRefreshStarted(object? sender, GenericEventArgs<BaseItem> e) private void OnProviderRefreshStarted(object? sender, GenericEventArgs<BaseItem> e)
{ => OnProviderRefreshProgress(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 OnProviderRefreshCompleted(object? sender, GenericEventArgs<BaseItem> e) private void OnProviderRefreshCompleted(object? sender, GenericEventArgs<BaseItem> e)
{ {
@ -342,7 +354,7 @@ public sealed class LibraryChangedNotifier : IServerEntryPoint
return item.SourceType == SourceType.Library; return item.SourceType == SourceType.Library;
} }
private IEnumerable<string> GetTopParentIds(List<BaseItem> items, List<Folder> allUserRootChildren) private static IEnumerable<string> GetTopParentIds(List<BaseItem> items, List<Folder> allUserRootChildren)
{ {
var list = new List<string>(); var list = new List<string>();
@ -363,7 +375,7 @@ public sealed class LibraryChangedNotifier : IServerEntryPoint
return list.Distinct(StringComparer.Ordinal); return list.Distinct(StringComparer.Ordinal);
} }
private IEnumerable<T> TranslatePhysicalItemToUserLibrary<T>(T item, User user, bool includeIfNotFound = false) private T[] TranslatePhysicalItemToUserLibrary<T>(T item, User user, bool includeIfNotFound = false)
where T : BaseItem where T : BaseItem
{ {
// If the physical root changed, return the user root // If the physical root changed, return the user root
@ -384,18 +396,7 @@ public sealed class LibraryChangedNotifier : IServerEntryPoint
/// <inheritdoc /> /// <inheritdoc />
public void Dispose() public void Dispose()
{ {
_libraryManager.ItemAdded -= OnLibraryItemAdded; _libraryUpdateTimer?.Dispose();
_libraryManager.ItemUpdated -= OnLibraryItemUpdated; _libraryUpdateTimer = null;
_libraryManager.ItemRemoved -= OnLibraryItemRemoved;
_providerManager.RefreshCompleted -= OnProviderRefreshCompleted;
_providerManager.RefreshStarted -= OnProviderRefreshStarted;
_providerManager.RefreshProgress -= OnProviderRefreshProgress;
if (_libraryUpdateTimer is not null)
{
_libraryUpdateTimer.Dispose();
_libraryUpdateTimer = null;
}
} }
} }

View File

@ -4,6 +4,7 @@ using System.Net.Http;
using System.Net.Http.Headers; using System.Net.Http.Headers;
using System.Net.Mime; using System.Net.Mime;
using System.Text; using System.Text;
using Emby.Server.Implementations.EntryPoints;
using Jellyfin.Api.Middleware; using Jellyfin.Api.Middleware;
using Jellyfin.LiveTv.Extensions; using Jellyfin.LiveTv.Extensions;
using Jellyfin.MediaEncoding.Hls.Extensions; using Jellyfin.MediaEncoding.Hls.Extensions;
@ -126,6 +127,7 @@ namespace Jellyfin.Server
services.AddHostedService<AutoDiscoveryHost>(); services.AddHostedService<AutoDiscoveryHost>();
services.AddHostedService<PortForwardingHost>(); services.AddHostedService<PortForwardingHost>();
services.AddHostedService<LibraryChangedNotifier>();
} }
/// <summary> /// <summary>