LocalTrailerPostScanTask.cs 3.1 KB

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