TmdbPersonProvider.cs 5.5 KB

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