TvdbPersonImageProvider.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using MediaBrowser.Common.Net;
  7. using MediaBrowser.Controller.Dto;
  8. using MediaBrowser.Controller.Entities;
  9. using MediaBrowser.Controller.Entities.TV;
  10. using MediaBrowser.Controller.Library;
  11. using MediaBrowser.Controller.Providers;
  12. using MediaBrowser.Model.Entities;
  13. using MediaBrowser.Model.Providers;
  14. using Microsoft.Extensions.Logging;
  15. using TvDbSharper;
  16. namespace MediaBrowser.Providers.Plugins.TheTvdb
  17. {
  18. public class TvdbPersonImageProvider : IRemoteImageProvider, IHasOrder
  19. {
  20. private readonly IHttpClient _httpClient;
  21. private readonly ILogger<TvdbPersonImageProvider> _logger;
  22. private readonly ILibraryManager _libraryManager;
  23. private readonly TvdbClientManager _tvdbClientManager;
  24. public TvdbPersonImageProvider(ILibraryManager libraryManager, IHttpClient httpClient, ILogger<TvdbPersonImageProvider> logger, TvdbClientManager tvdbClientManager)
  25. {
  26. _libraryManager = libraryManager;
  27. _httpClient = httpClient;
  28. _logger = logger;
  29. _tvdbClientManager = tvdbClientManager;
  30. }
  31. /// <inheritdoc />
  32. public string Name => "TheTVDB";
  33. /// <inheritdoc />
  34. public int Order => 1;
  35. /// <inheritdoc />
  36. public bool Supports(BaseItem item) => item is Person;
  37. /// <inheritdoc />
  38. public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
  39. {
  40. yield return ImageType.Primary;
  41. }
  42. /// <inheritdoc />
  43. public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
  44. {
  45. var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery
  46. {
  47. IncludeItemTypes = new[] { typeof(Series).Name },
  48. PersonIds = new[] { item.Id },
  49. DtoOptions = new DtoOptions(false)
  50. {
  51. EnableImages = false
  52. }
  53. }).Cast<Series>()
  54. .Where(i => TvdbSeriesProvider.IsValidSeries(i.ProviderIds))
  55. .ToList();
  56. var infos = (await Task.WhenAll(seriesWithPerson.Select(async i =>
  57. await GetImageFromSeriesData(i, item.Name, cancellationToken).ConfigureAwait(false)))
  58. .ConfigureAwait(false))
  59. .Where(i => i != null)
  60. .Take(1);
  61. return infos;
  62. }
  63. private async Task<RemoteImageInfo> GetImageFromSeriesData(Series series, string personName, CancellationToken cancellationToken)
  64. {
  65. var tvdbId = Convert.ToInt32(series.GetProviderId(MetadataProvider.Tvdb));
  66. try
  67. {
  68. var actorsResult = await _tvdbClientManager
  69. .GetActorsAsync(tvdbId, series.GetPreferredMetadataLanguage(), cancellationToken)
  70. .ConfigureAwait(false);
  71. var actor = actorsResult.Data.FirstOrDefault(a =>
  72. string.Equals(a.Name, personName, StringComparison.OrdinalIgnoreCase) &&
  73. !string.IsNullOrEmpty(a.Image));
  74. if (actor == null)
  75. {
  76. return null;
  77. }
  78. return new RemoteImageInfo
  79. {
  80. Url = TvdbUtils.BannerUrl + actor.Image,
  81. Type = ImageType.Primary,
  82. ProviderName = Name
  83. };
  84. }
  85. catch (TvDbServerException e)
  86. {
  87. _logger.LogError(e, "Failed to retrieve actor {ActorName} from series {SeriesTvdbId}", personName, tvdbId);
  88. return null;
  89. }
  90. }
  91. /// <inheritdoc />
  92. public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
  93. {
  94. return _httpClient.GetResponse(new HttpRequestOptions
  95. {
  96. CancellationToken = cancellationToken,
  97. Url = url
  98. });
  99. }
  100. }
  101. }