LocalTrailerPostScanTask.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 trailerResult = _libraryManager.GetItems(new InternalItemsQuery
  28. {
  29. IncludeItemTypes = new[] { typeof(Trailer).Name },
  30. //IsLocalTrailer = false
  31. });
  32. var trailers = trailerResult.Items;
  33. var numComplete = 0;
  34. foreach (var item in items)
  35. {
  36. cancellationToken.ThrowIfCancellationRequested();
  37. await AssignTrailers(item, trailers).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. }