TmdbPersonProvider.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #pragma warning disable CS1591
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Globalization;
  5. using System.Linq;
  6. using System.Net.Http;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using MediaBrowser.Common.Net;
  10. using MediaBrowser.Controller.Entities;
  11. using MediaBrowser.Controller.Providers;
  12. using MediaBrowser.Model.Entities;
  13. using MediaBrowser.Model.Providers;
  14. namespace MediaBrowser.Providers.Plugins.Tmdb.People
  15. {
  16. public class TmdbPersonProvider : IRemoteMetadataProvider<Person, PersonLookupInfo>
  17. {
  18. private readonly IHttpClientFactory _httpClientFactory;
  19. private readonly TmdbClientManager _tmdbClientManager;
  20. public TmdbPersonProvider(IHttpClientFactory httpClientFactory, TmdbClientManager tmdbClientManager)
  21. {
  22. _httpClientFactory = httpClientFactory;
  23. _tmdbClientManager = tmdbClientManager;
  24. }
  25. public string Name => TmdbUtils.ProviderName;
  26. public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(PersonLookupInfo searchInfo, CancellationToken cancellationToken)
  27. {
  28. var personTmdbId = Convert.ToInt32(searchInfo.GetProviderId(MetadataProvider.Tmdb), CultureInfo.InvariantCulture);
  29. if (personTmdbId <= 0)
  30. {
  31. var personResult = await _tmdbClientManager.GetPersonAsync(personTmdbId, cancellationToken).ConfigureAwait(false);
  32. if (personResult != null)
  33. {
  34. var result = new RemoteSearchResult
  35. {
  36. Name = personResult.Name,
  37. SearchProviderName = Name,
  38. Overview = personResult.Biography
  39. };
  40. if (personResult.Images?.Profiles != null && personResult.Images.Profiles.Count > 0)
  41. {
  42. result.ImageUrl = _tmdbClientManager.GetProfileUrl(personResult.Images.Profiles[0].FilePath);
  43. }
  44. result.SetProviderId(MetadataProvider.Tmdb, personResult.Id.ToString(CultureInfo.InvariantCulture));
  45. result.SetProviderId(MetadataProvider.Imdb, personResult.ExternalIds.ImdbId);
  46. return new[] { result };
  47. }
  48. }
  49. // TODO why? Because of the old rate limit?
  50. if (searchInfo.IsAutomated)
  51. {
  52. // Don't hammer moviedb searching by name
  53. return Enumerable.Empty<RemoteSearchResult>();
  54. }
  55. var personSearchResult = await _tmdbClientManager.SearchPersonAsync(searchInfo.Name, cancellationToken).ConfigureAwait(false);
  56. var remoteSearchResults = new List<RemoteSearchResult>();
  57. for (var i = 0; i < personSearchResult.Count; i++)
  58. {
  59. var person = personSearchResult[i];
  60. var remoteSearchResult = new RemoteSearchResult
  61. {
  62. SearchProviderName = Name,
  63. Name = person.Name,
  64. ImageUrl = _tmdbClientManager.GetProfileUrl(person.ProfilePath)
  65. };
  66. remoteSearchResult.SetProviderId(MetadataProvider.Tmdb, person.Id.ToString(CultureInfo.InvariantCulture));
  67. remoteSearchResults.Add(remoteSearchResult);
  68. }
  69. return remoteSearchResults;
  70. }
  71. public async Task<MetadataResult<Person>> GetMetadata(PersonLookupInfo id, CancellationToken cancellationToken)
  72. {
  73. var personTmdbId = Convert.ToInt32(id.GetProviderId(MetadataProvider.Tmdb), CultureInfo.InvariantCulture);
  74. // We don't already have an Id, need to fetch it
  75. if (personTmdbId <= 0)
  76. {
  77. var personSearchResults = await _tmdbClientManager.SearchPersonAsync(id.Name, cancellationToken).ConfigureAwait(false);
  78. if (personSearchResults.Count > 0)
  79. {
  80. personTmdbId = personSearchResults[0].Id;
  81. }
  82. }
  83. var result = new MetadataResult<Person>();
  84. if (personTmdbId > 0)
  85. {
  86. var person = await _tmdbClientManager.GetPersonAsync(personTmdbId, cancellationToken).ConfigureAwait(false);
  87. result.HasMetadata = true;
  88. var item = new Person
  89. {
  90. // Take name from incoming info, don't rename the person
  91. // TODO: This should go in PersonMetadataService, not each person provider
  92. Name = id.Name,
  93. HomePageUrl = person.Homepage,
  94. Overview = person.Biography,
  95. PremiereDate = person.Birthday?.ToUniversalTime(),
  96. EndDate = person.Deathday?.ToUniversalTime()
  97. };
  98. if (!string.IsNullOrWhiteSpace(person.PlaceOfBirth))
  99. {
  100. item.ProductionLocations = new[] { person.PlaceOfBirth };
  101. }
  102. item.SetProviderId(MetadataProvider.Tmdb, person.Id.ToString(CultureInfo.InvariantCulture));
  103. if (!string.IsNullOrEmpty(person.ImdbId))
  104. {
  105. item.SetProviderId(MetadataProvider.Imdb, person.ImdbId);
  106. }
  107. result.HasMetadata = true;
  108. result.Item = item;
  109. }
  110. return result;
  111. }
  112. public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
  113. {
  114. return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);
  115. }
  116. }
  117. }