LocalTrailerPostScanTask.cs 3.2 KB

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