| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | using System;using System.Collections.Generic;using System.Globalization;using System.Net.Http;using System.Threading;using System.Threading.Tasks;using MediaBrowser.Common.Net;using MediaBrowser.Controller.Entities;using MediaBrowser.Controller.Providers;using MediaBrowser.Model.Entities;using MediaBrowser.Model.Providers;namespace MediaBrowser.Providers.Plugins.Tmdb.People{    /// <summary>    /// Person image provider powered by TMDb.    /// </summary>    public class TmdbPersonProvider : IRemoteMetadataProvider<Person, PersonLookupInfo>    {        private readonly IHttpClientFactory _httpClientFactory;        private readonly TmdbClientManager _tmdbClientManager;        /// <summary>        /// Initializes a new instance of the <see cref="TmdbPersonProvider"/> class.        /// </summary>        /// <param name="httpClientFactory">The <see cref="IHttpClientFactory"/>.</param>        /// <param name="tmdbClientManager">The <see cref="TmdbClientManager"/>.</param>        public TmdbPersonProvider(IHttpClientFactory httpClientFactory, TmdbClientManager tmdbClientManager)        {            _httpClientFactory = httpClientFactory;            _tmdbClientManager = tmdbClientManager;        }        /// <inheritdoc />        public string Name => TmdbUtils.ProviderName;        /// <inheritdoc />        public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(PersonLookupInfo searchInfo, CancellationToken cancellationToken)        {            if (searchInfo.TryGetProviderId(MetadataProvider.Tmdb, out var personTmdbId))            {                var personResult = await _tmdbClientManager.GetPersonAsync(int.Parse(personTmdbId, CultureInfo.InvariantCulture), searchInfo.MetadataLanguage, cancellationToken).ConfigureAwait(false);                if (personResult is not null)                {                    var result = new RemoteSearchResult                    {                        Name = personResult.Name,                        SearchProviderName = Name,                        Overview = personResult.Biography                    };                    if (personResult.Images?.Profiles is not null && personResult.Images.Profiles.Count > 0)                    {                        result.ImageUrl = _tmdbClientManager.GetProfileUrl(personResult.Images.Profiles[0].FilePath);                    }                    result.SetProviderId(MetadataProvider.Tmdb, personResult.Id.ToString(CultureInfo.InvariantCulture));                    if (!string.IsNullOrEmpty(personResult.ExternalIds.ImdbId))                    {                        result.SetProviderId(MetadataProvider.Imdb, personResult.ExternalIds.ImdbId);                    }                    return new[] { result };                }            }            var personSearchResult = await _tmdbClientManager.SearchPersonAsync(searchInfo.Name, cancellationToken).ConfigureAwait(false);            var remoteSearchResults = new RemoteSearchResult[personSearchResult.Count];            for (var i = 0; i < personSearchResult.Count; i++)            {                var person = personSearchResult[i];                var remoteSearchResult = new RemoteSearchResult                {                    SearchProviderName = Name,                    Name = person.Name,                    ImageUrl = _tmdbClientManager.GetProfileUrl(person.ProfilePath)                };                remoteSearchResult.SetProviderId(MetadataProvider.Tmdb, person.Id.ToString(CultureInfo.InvariantCulture));                remoteSearchResults[i] = remoteSearchResult;            }            return remoteSearchResults;        }        /// <inheritdoc />        public async Task<MetadataResult<Person>> GetMetadata(PersonLookupInfo info, CancellationToken cancellationToken)        {            var personTmdbId = Convert.ToInt32(info.GetProviderId(MetadataProvider.Tmdb), CultureInfo.InvariantCulture);            // We don't already have an Id, need to fetch it            if (personTmdbId <= 0)            {                var personSearchResults = await _tmdbClientManager.SearchPersonAsync(info.Name, cancellationToken).ConfigureAwait(false);                if (personSearchResults.Count > 0)                {                    personTmdbId = personSearchResults[0].Id;                }            }            var result = new MetadataResult<Person>();            if (personTmdbId > 0)            {                var person = await _tmdbClientManager.GetPersonAsync(personTmdbId, info.MetadataLanguage, cancellationToken).ConfigureAwait(false);                if (person is null)                {                    return result;                }                result.HasMetadata = true;                var item = new Person                {                    // Take name from incoming info, don't rename the person                    // TODO: This should go in PersonMetadataService, not each person provider                    Name = info.Name,                    HomePageUrl = person.Homepage,                    Overview = person.Biography,                    PremiereDate = person.Birthday?.ToUniversalTime(),                    EndDate = person.Deathday?.ToUniversalTime()                };                if (!string.IsNullOrWhiteSpace(person.PlaceOfBirth))                {                    item.ProductionLocations = new[] { person.PlaceOfBirth };                }                item.SetProviderId(MetadataProvider.Tmdb, person.Id.ToString(CultureInfo.InvariantCulture));                if (!string.IsNullOrEmpty(person.ImdbId))                {                    item.SetProviderId(MetadataProvider.Imdb, person.ImdbId);                }                result.HasMetadata = true;                result.Item = item;            }            return result;        }        /// <inheritdoc />        public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)        {            return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);        }    }}
 |