ArtistsValidator.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using System.Globalization;
  3. using System.Linq;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using Jellyfin.Data.Enums;
  7. using MediaBrowser.Controller.Entities;
  8. using MediaBrowser.Controller.Entities.Audio;
  9. using MediaBrowser.Controller.Library;
  10. using MediaBrowser.Controller.Persistence;
  11. using Microsoft.Extensions.Logging;
  12. namespace Emby.Server.Implementations.Library.Validators
  13. {
  14. /// <summary>
  15. /// Class ArtistsValidator.
  16. /// </summary>
  17. public class ArtistsValidator
  18. {
  19. /// <summary>
  20. /// The library manager.
  21. /// </summary>
  22. private readonly ILibraryManager _libraryManager;
  23. /// <summary>
  24. /// The logger.
  25. /// </summary>
  26. private readonly ILogger<ArtistsValidator> _logger;
  27. private readonly IItemRepository _itemRepo;
  28. /// <summary>
  29. /// Initializes a new instance of the <see cref="ArtistsValidator" /> class.
  30. /// </summary>
  31. /// <param name="libraryManager">The library manager.</param>
  32. /// <param name="logger">The logger.</param>
  33. /// <param name="itemRepo">The item repository.</param>
  34. public ArtistsValidator(ILibraryManager libraryManager, ILogger<ArtistsValidator> logger, IItemRepository itemRepo)
  35. {
  36. _libraryManager = libraryManager;
  37. _logger = logger;
  38. _itemRepo = itemRepo;
  39. }
  40. /// <summary>
  41. /// Runs the specified progress.
  42. /// </summary>
  43. /// <param name="progress">The progress.</param>
  44. /// <param name="cancellationToken">The cancellation token.</param>
  45. /// <returns>Task.</returns>
  46. public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
  47. {
  48. var names = _itemRepo.GetAllArtistNames();
  49. var numComplete = 0;
  50. var count = names.Count;
  51. foreach (var name in names)
  52. {
  53. try
  54. {
  55. var item = _libraryManager.GetArtist(name);
  56. await item.RefreshMetadata(cancellationToken).ConfigureAwait(false);
  57. }
  58. catch (OperationCanceledException)
  59. {
  60. // Don't clutter the log
  61. throw;
  62. }
  63. catch (Exception ex)
  64. {
  65. _logger.LogError(ex, "Error refreshing {ArtistName}", name);
  66. }
  67. numComplete++;
  68. double percent = numComplete;
  69. percent /= count;
  70. percent *= 100;
  71. progress.Report(percent);
  72. }
  73. var deadEntities = _libraryManager.GetItemList(new InternalItemsQuery
  74. {
  75. IncludeItemTypes = new[] { BaseItemKind.MusicArtist },
  76. IsDeadArtist = true,
  77. IsLocked = false
  78. }).Cast<MusicArtist>().ToList();
  79. foreach (var item in deadEntities)
  80. {
  81. if (!item.IsAccessedByName)
  82. {
  83. continue;
  84. }
  85. _logger.LogInformation("Deleting dead {2} {0} {1}.", item.Id.ToString("N", CultureInfo.InvariantCulture), item.Name, item.GetType().Name);
  86. _libraryManager.DeleteItem(
  87. item,
  88. new DeleteOptions
  89. {
  90. DeleteFileLocation = false
  91. },
  92. false);
  93. }
  94. progress.Report(100);
  95. }
  96. }
  97. }