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.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 trailers = _libraryManager.GetItemList(new InternalItemsQuery
  27. {
  28. IncludeItemTypes = new[] { typeof(Trailer).Name },
  29. ExcludeTrailerTypes = new[]
  30. {
  31. TrailerType.LocalTrailer
  32. }
  33. }).ToArray();
  34. var numComplete = 0;
  35. foreach (var item in items)
  36. {
  37. cancellationToken.ThrowIfCancellationRequested();
  38. await AssignTrailers(item, trailers).ConfigureAwait(false);
  39. numComplete++;
  40. double percent = numComplete;
  41. percent /= items.Count;
  42. progress.Report(percent * 100);
  43. }
  44. progress.Report(100);
  45. }
  46. private async Task AssignTrailers(IHasTrailers item, BaseItem[] channelTrailers)
  47. {
  48. if (item is Game)
  49. {
  50. return;
  51. }
  52. var imdbId = item.GetProviderId(MetadataProviders.Imdb);
  53. var tmdbId = item.GetProviderId(MetadataProviders.Tmdb);
  54. var trailers = channelTrailers.Where(i =>
  55. {
  56. if (!string.IsNullOrWhiteSpace(imdbId) &&
  57. string.Equals(imdbId, i.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase))
  58. {
  59. return true;
  60. }
  61. if (!string.IsNullOrWhiteSpace(tmdbId) &&
  62. string.Equals(tmdbId, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase))
  63. {
  64. return true;
  65. }
  66. return false;
  67. });
  68. var trailerIds = trailers.Select(i => i.Id)
  69. .ToList();
  70. if (!trailerIds.SequenceEqual(item.RemoteTrailerIds))
  71. {
  72. item.RemoteTrailerIds = trailerIds;
  73. var baseItem = (BaseItem)item;
  74. await baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None)
  75. .ConfigureAwait(false);
  76. }
  77. }
  78. }
  79. }