diff options
| author | Patrick Barron <barronpm@gmail.com> | 2024-02-06 16:18:17 -0500 |
|---|---|---|
| committer | Patrick Barron <barronpm@gmail.com> | 2024-02-07 10:52:36 -0500 |
| commit | 690e603b90ae9d856386d5fb6bf3e32d4cb46a9c (patch) | |
| tree | 3103a12886f04cccc0833325d08fe423235e03dc /MediaBrowser.XbmcMetadata/NfoUserDataSaver.cs | |
| parent | 24b4d025967135a8895fedf1c45f3679f3b89393 (diff) | |
Use IHostedService for NFO user data
Diffstat (limited to 'MediaBrowser.XbmcMetadata/NfoUserDataSaver.cs')
| -rw-r--r-- | MediaBrowser.XbmcMetadata/NfoUserDataSaver.cs | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/MediaBrowser.XbmcMetadata/NfoUserDataSaver.cs b/MediaBrowser.XbmcMetadata/NfoUserDataSaver.cs new file mode 100644 index 000000000..b2882194d --- /dev/null +++ b/MediaBrowser.XbmcMetadata/NfoUserDataSaver.cs @@ -0,0 +1,87 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.XbmcMetadata.Configuration; +using MediaBrowser.XbmcMetadata.Savers; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace MediaBrowser.XbmcMetadata; + +/// <summary> +/// <see cref="IHostedService"/> responsible for updating NFO files' user data. +/// </summary> +public sealed class NfoUserDataSaver : IHostedService +{ + private readonly ILogger<NfoUserDataSaver> _logger; + private readonly IConfigurationManager _config; + private readonly IUserDataManager _userDataManager; + private readonly IProviderManager _providerManager; + + /// <summary> + /// Initializes a new instance of the <see cref="NfoUserDataSaver"/> class. + /// </summary> + /// <param name="logger">The <see cref="ILogger"/>.</param> + /// <param name="config">The <see cref="IConfigurationManager"/>.</param> + /// <param name="userDataManager">The <see cref="IUserDataManager"/>.</param> + /// <param name="providerManager">The <see cref="IProviderManager"/>.</param> + public NfoUserDataSaver( + ILogger<NfoUserDataSaver> logger, + IConfigurationManager config, + IUserDataManager userDataManager, + IProviderManager providerManager) + { + _logger = logger; + _config = config; + _userDataManager = userDataManager; + _providerManager = providerManager; + } + + /// <inheritdoc /> + public Task StartAsync(CancellationToken cancellationToken) + { + _userDataManager.UserDataSaved += OnUserDataSaved; + return Task.CompletedTask; + } + + /// <inheritdoc /> + public Task StopAsync(CancellationToken cancellationToken) + { + _userDataManager.UserDataSaved -= OnUserDataSaved; + return Task.CompletedTask; + } + + private async void OnUserDataSaved(object? sender, UserDataSaveEventArgs e) + { + if (e.SaveReason is not (UserDataSaveReason.PlaybackFinished + or UserDataSaveReason.TogglePlayed or UserDataSaveReason.UpdateUserRating)) + { + return; + } + + if (string.IsNullOrWhiteSpace(_config.GetNfoConfiguration().UserId)) + { + return; + } + + var item = e.Item; + if (!item.IsFileProtocol || !item.SupportsLocalMetadata) + { + return; + } + + try + { + await _providerManager.SaveMetadataAsync(item, ItemUpdateType.MetadataDownload, [BaseNfoSaver.SaverName]) + .ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error saving metadata for {Path}", item.Path ?? item.Name); + } + } +} |
