NfoUserDataSaver.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using MediaBrowser.Common.Configuration;
  5. using MediaBrowser.Controller.Library;
  6. using MediaBrowser.Controller.Providers;
  7. using MediaBrowser.Model.Entities;
  8. using MediaBrowser.XbmcMetadata.Configuration;
  9. using MediaBrowser.XbmcMetadata.Savers;
  10. using Microsoft.Extensions.Hosting;
  11. using Microsoft.Extensions.Logging;
  12. namespace MediaBrowser.XbmcMetadata;
  13. /// <summary>
  14. /// <see cref="IHostedService"/> responsible for updating NFO files' user data.
  15. /// </summary>
  16. public sealed class NfoUserDataSaver : IHostedService
  17. {
  18. private readonly ILogger<NfoUserDataSaver> _logger;
  19. private readonly IConfigurationManager _config;
  20. private readonly IUserDataManager _userDataManager;
  21. private readonly IProviderManager _providerManager;
  22. /// <summary>
  23. /// Initializes a new instance of the <see cref="NfoUserDataSaver"/> class.
  24. /// </summary>
  25. /// <param name="logger">The <see cref="ILogger"/>.</param>
  26. /// <param name="config">The <see cref="IConfigurationManager"/>.</param>
  27. /// <param name="userDataManager">The <see cref="IUserDataManager"/>.</param>
  28. /// <param name="providerManager">The <see cref="IProviderManager"/>.</param>
  29. public NfoUserDataSaver(
  30. ILogger<NfoUserDataSaver> logger,
  31. IConfigurationManager config,
  32. IUserDataManager userDataManager,
  33. IProviderManager providerManager)
  34. {
  35. _logger = logger;
  36. _config = config;
  37. _userDataManager = userDataManager;
  38. _providerManager = providerManager;
  39. }
  40. /// <inheritdoc />
  41. public Task StartAsync(CancellationToken cancellationToken)
  42. {
  43. _userDataManager.UserDataSaved += OnUserDataSaved;
  44. return Task.CompletedTask;
  45. }
  46. /// <inheritdoc />
  47. public Task StopAsync(CancellationToken cancellationToken)
  48. {
  49. _userDataManager.UserDataSaved -= OnUserDataSaved;
  50. return Task.CompletedTask;
  51. }
  52. private async void OnUserDataSaved(object? sender, UserDataSaveEventArgs e)
  53. {
  54. if (e.SaveReason is not (UserDataSaveReason.PlaybackFinished
  55. or UserDataSaveReason.TogglePlayed or UserDataSaveReason.UpdateUserRating))
  56. {
  57. return;
  58. }
  59. if (string.IsNullOrWhiteSpace(_config.GetNfoConfiguration().UserId))
  60. {
  61. return;
  62. }
  63. var item = e.Item;
  64. if (!item.IsFileProtocol || !item.SupportsLocalMetadata)
  65. {
  66. return;
  67. }
  68. try
  69. {
  70. await _providerManager.SaveMetadataAsync(item, ItemUpdateType.MetadataDownload, [BaseNfoSaver.SaverName])
  71. .ConfigureAwait(false);
  72. }
  73. catch (Exception ex)
  74. {
  75. _logger.LogError(ex, "Error saving metadata for {Path}", item.Path ?? item.Name);
  76. }
  77. }
  78. }