using Jellyfin.Plugin.MetaShark.Api; using Jellyfin.Plugin.MetaShark.Core; using Jellyfin.Plugin.MetaShark.Model; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Providers; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Jellyfin.Plugin.MetaShark.Providers { /// /// OddbPersonProvider. /// public class PersonProvider : BaseProvider, IRemoteMetadataProvider { /// /// Initializes a new instance of the class. /// /// Instance of the interface. /// Instance of the interface. /// Instance of . public PersonProvider(IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory, ILibraryManager libraryManager, DoubanApi doubanApi, TmdbApi tmdbApi, OmdbApi omdbApi) : base(httpClientFactory, loggerFactory.CreateLogger(), libraryManager, doubanApi, tmdbApi, omdbApi) { } /// public string Name => Plugin.PluginName; /// public async Task> GetSearchResults(PersonLookupInfo searchInfo, CancellationToken cancellationToken) { return await Task.FromResult>(new List()); } /// public async Task> GetMetadata(PersonLookupInfo info, CancellationToken cancellationToken) { MetadataResult result = new MetadataResult(); var cid = info.GetProviderId(DoubanProviderId); this.Log($"GetPersonMetadata of [cid]: {cid}"); if (!string.IsNullOrEmpty(cid)) { var c = await this._doubanApi.GetCelebrityAsync(cid, cancellationToken).ConfigureAwait(false); if (c != null) { Person p = new Person { Name = c.Name, HomePageUrl = c.Site, Overview = c.Intro, PremiereDate = DateTime.ParseExact(c.Birthdate, "yyyy年MM月dd日", System.Globalization.CultureInfo.CurrentCulture) }; p.SetProviderId(Plugin.ProviderId, c.Id); if (!string.IsNullOrWhiteSpace(c.Birthplace)) { p.ProductionLocations = new[] { c.Birthplace }; } if (!string.IsNullOrEmpty(c.Imdb)) { p.SetProviderId(MetadataProvider.Imdb, c.Imdb); } result.HasMetadata = true; result.Item = p; return result; } } var personTmdbId = info.GetProviderId(MetadataProvider.Tmdb); this.Log($"GetPersonMetadata of [personTmdbId]: {personTmdbId}"); if (!string.IsNullOrEmpty(personTmdbId)) { var person = await this._tmdbApi.GetPersonAsync(personTmdbId.ToInt(), cancellationToken).ConfigureAwait(false); if (person != null) { 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; } } return result; } /// public async Task GetImageResponse(string url, CancellationToken cancellationToken) { this.Log("Person GetImageResponse url: {0}", url); return await this._httpClientFactory.CreateClient().GetAsync(new Uri(url), cancellationToken).ConfigureAwait(false); } private void Log(string? message, params object?[] args) { this._logger.LogInformation($"[MetaShark] {message}", args); } } }