LocalTrailerPostScanTask.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using MediaBrowser.Controller.Channels;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Library;
  4. using MediaBrowser.Model.Entities;
  5. using System;
  6. using System.Linq;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using MediaBrowser.Controller.Entities.Movies;
  10. using MediaBrowser.Controller.Entities.TV;
  11. namespace MediaBrowser.Server.Implementations.Library
  12. {
  13. public class LocalTrailerPostScanTask : ILibraryPostScanTask
  14. {
  15. private readonly ILibraryManager _libraryManager;
  16. private readonly IChannelManager _channelManager;
  17. public LocalTrailerPostScanTask(ILibraryManager libraryManager, IChannelManager channelManager)
  18. {
  19. _libraryManager = libraryManager;
  20. _channelManager = channelManager;
  21. }
  22. public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
  23. {
  24. var items = _libraryManager.GetItemList(new InternalItemsQuery
  25. {
  26. IncludeItemTypes = new[] { typeof(BoxSet).Name, typeof(Game).Name, typeof(Movie).Name, typeof(Series).Name },
  27. Recursive = true
  28. }).OfType<IHasTrailers>().ToList();
  29. var trailerTypes = Enum.GetNames(typeof(TrailerType))
  30. .Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true))
  31. .Except(new[] { TrailerType.LocalTrailer })
  32. .ToArray();
  33. var trailers = _libraryManager.GetItemList(new InternalItemsQuery
  34. {
  35. IncludeItemTypes = new[] { typeof(Trailer).Name },
  36. TrailerTypes = trailerTypes,
  37. Recursive = true
  38. }).ToArray();
  39. var numComplete = 0;
  40. foreach (var item in items)
  41. {
  42. cancellationToken.ThrowIfCancellationRequested();
  43. await AssignTrailers(item, trailers).ConfigureAwait(false);
  44. numComplete++;
  45. double percent = numComplete;
  46. percent /= items.Count;
  47. progress.Report(percent * 100);
  48. }
  49. progress.Report(100);
  50. }
  51. private async Task AssignTrailers(IHasTrailers item, BaseItem[] channelTrailers)
  52. {
  53. if (item is Game)
  54. {
  55. return;
  56. }
  57. var imdbId = item.GetProviderId(MetadataProviders.Imdb);
  58. var tmdbId = item.GetProviderId(MetadataProviders.Tmdb);
  59. var trailers = channelTrailers.Where(i =>
  60. {
  61. if (!string.IsNullOrWhiteSpace(imdbId) &&
  62. string.Equals(imdbId, i.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase))
  63. {
  64. return true;
  65. }
  66. if (!string.IsNullOrWhiteSpace(tmdbId) &&
  67. string.Equals(tmdbId, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase))
  68. {
  69. return true;
  70. }
  71. return false;
  72. });
  73. var trailerIds = trailers.Select(i => i.Id)
  74. .ToList();
  75. if (!trailerIds.SequenceEqual(item.RemoteTrailerIds))
  76. {
  77. item.RemoteTrailerIds = trailerIds;
  78. var baseItem = (BaseItem)item;
  79. await baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None)
  80. .ConfigureAwait(false);
  81. }
  82. }
  83. }
  84. }