LocalTrailerPostScanTask.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System.Collections.Generic;
  2. using MediaBrowser.Controller.Channels;
  3. using MediaBrowser.Controller.Entities;
  4. using MediaBrowser.Controller.Library;
  5. using MediaBrowser.Model.Channels;
  6. using MediaBrowser.Model.Entities;
  7. using System;
  8. using System.Linq;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  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.RootFolder
  25. .RecursiveChildren
  26. .OfType<IHasTrailers>()
  27. .ToList();
  28. var channelTrailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
  29. {
  30. ExtraTypes = new[] { ExtraType.Trailer }
  31. }, CancellationToken.None);
  32. var channelTrailers = channelTrailerResult.Items;
  33. var numComplete = 0;
  34. foreach (var item in items)
  35. {
  36. cancellationToken.ThrowIfCancellationRequested();
  37. await AssignTrailers(item, channelTrailers).ConfigureAwait(false);
  38. numComplete++;
  39. double percent = numComplete;
  40. percent /= items.Count;
  41. progress.Report(percent * 100);
  42. }
  43. progress.Report(100);
  44. }
  45. private async Task AssignTrailers(IHasTrailers item, BaseItem[] channelTrailers)
  46. {
  47. if (item is Game)
  48. {
  49. return;
  50. }
  51. var imdbId = item.GetProviderId(MetadataProviders.Imdb);
  52. var tmdbId = item.GetProviderId(MetadataProviders.Tmdb);
  53. var trailers = channelTrailers.Where(i =>
  54. {
  55. if (!string.IsNullOrWhiteSpace(imdbId) &&
  56. string.Equals(imdbId, i.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase))
  57. {
  58. return true;
  59. }
  60. if (!string.IsNullOrWhiteSpace(tmdbId) &&
  61. string.Equals(tmdbId, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase))
  62. {
  63. return true;
  64. }
  65. return false;
  66. });
  67. var trailerIds = trailers.Select(i => i.Id)
  68. .ToList();
  69. if (!trailerIds.SequenceEqual(item.RemoteTrailerIds))
  70. {
  71. item.RemoteTrailerIds = trailerIds;
  72. var baseItem = (BaseItem)item;
  73. await baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None)
  74. .ConfigureAwait(false);
  75. }
  76. }
  77. }
  78. }