TvdbPersonImageProvider.cs 4.1 KB

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