GenresValidator.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using System.Collections.Generic;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Entities.Audio;
  4. using MediaBrowser.Controller.Library;
  5. using MediaBrowser.Model.Logging;
  6. using System;
  7. using System.Linq;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. namespace MediaBrowser.Server.Implementations.Library.Validators
  11. {
  12. class GenresValidator
  13. {
  14. /// <summary>
  15. /// The _library manager
  16. /// </summary>
  17. private readonly ILibraryManager _libraryManager;
  18. /// <summary>
  19. /// The _logger
  20. /// </summary>
  21. private readonly ILogger _logger;
  22. public GenresValidator(ILibraryManager libraryManager, ILogger logger)
  23. {
  24. _libraryManager = libraryManager;
  25. _logger = logger;
  26. }
  27. /// <summary>
  28. /// Runs the specified progress.
  29. /// </summary>
  30. /// <param name="progress">The progress.</param>
  31. /// <param name="cancellationToken">The cancellation token.</param>
  32. /// <returns>Task.</returns>
  33. public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
  34. {
  35. var items = _libraryManager.RootFolder.GetRecursiveChildren(i => !(i is IHasMusicGenres) && !(i is Game))
  36. .SelectMany(i => i.Genres)
  37. .DistinctNames()
  38. .ToList();
  39. var numComplete = 0;
  40. var count = items.Count;
  41. var validIds = new List<Guid>();
  42. foreach (var name in items)
  43. {
  44. try
  45. {
  46. var itemByName = _libraryManager.GetGenre(name);
  47. validIds.Add(itemByName.Id);
  48. await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);
  49. }
  50. catch (OperationCanceledException)
  51. {
  52. // Don't clutter the log
  53. break;
  54. }
  55. catch (Exception ex)
  56. {
  57. _logger.ErrorException("Error refreshing {0}", ex, name);
  58. }
  59. numComplete++;
  60. double percent = numComplete;
  61. percent /= count;
  62. percent *= 100;
  63. progress.Report(percent);
  64. }
  65. var allIds = _libraryManager.GetItemIds(new InternalItemsQuery
  66. {
  67. IncludeItemTypes = new[] { typeof(Genre).Name }
  68. });
  69. var invalidIds = allIds
  70. .Except(validIds)
  71. .ToList();
  72. foreach (var id in invalidIds)
  73. {
  74. cancellationToken.ThrowIfCancellationRequested();
  75. var item = _libraryManager.GetItemById(id);
  76. await _libraryManager.DeleteItem(item, new DeleteOptions
  77. {
  78. DeleteFileLocation = false
  79. }).ConfigureAwait(false);
  80. }
  81. progress.Report(100);
  82. }
  83. }
  84. }