/// <inheritdoc /> public async Task <IEnumerable <RemoteSearchResult> > GetSearchResults(PersonLookupInfo searchInfo, CancellationToken cancellationToken) { var personTmdbId = Convert.ToInt32(searchInfo.GetProviderId(MetadataProvider.Tmdb), CultureInfo.InvariantCulture); if (personTmdbId <= 0) { var personResult = await _tmdbClientManager.GetPersonAsync(personTmdbId, cancellationToken).ConfigureAwait(false); if (personResult != null) { var result = new RemoteSearchResult { Name = personResult.Name, SearchProviderName = Name, Overview = personResult.Biography }; if (personResult.Images?.Profiles != null && personResult.Images.Profiles.Count > 0) { result.ImageUrl = _tmdbClientManager.GetProfileUrl(personResult.Images.Profiles[0].FilePath); } result.SetProviderId(MetadataProvider.Tmdb, personResult.Id.ToString(CultureInfo.InvariantCulture)); result.SetProviderId(MetadataProvider.Imdb, personResult.ExternalIds.ImdbId); return(new[] { result }); } } // TODO why? Because of the old rate limit? if (searchInfo.IsAutomated) { // Don't hammer moviedb searching by name return(Enumerable.Empty <RemoteSearchResult>()); } var personSearchResult = await _tmdbClientManager.SearchPersonAsync(searchInfo.Name, cancellationToken).ConfigureAwait(false); var remoteSearchResults = new List <RemoteSearchResult>(); 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.Add(remoteSearchResult); } return(remoteSearchResults); }
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), cancellationToken).ConfigureAwait(false); if (personResult != null) { var result = new RemoteSearchResult { Name = personResult.Name, SearchProviderName = Name, Overview = personResult.Biography }; if (personResult.Images?.Profiles != 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 List <RemoteSearchResult>(); 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.Add(remoteSearchResult); } return(remoteSearchResults); }
public async Task <IEnumerable <RemoteImageInfo> > GetImages(BaseItem item, CancellationToken cancellationToken) { var person = (Person)item; if (!person.TryGetProviderId(MetadataProvider.Tmdb, out var personTmdbId)) { return(Enumerable.Empty <RemoteImageInfo>()); } var personResult = await _tmdbClientManager.GetPersonAsync(int.Parse(personTmdbId, CultureInfo.InvariantCulture), cancellationToken).ConfigureAwait(false); if (personResult?.Images?.Profiles == null) { return(Enumerable.Empty <RemoteImageInfo>()); } var remoteImages = new RemoteImageInfo[personResult.Images.Profiles.Count]; var language = item.GetPreferredMetadataLanguage(); for (var i = 0; i < personResult.Images.Profiles.Count; i++) { var image = personResult.Images.Profiles[i]; remoteImages[i] = new RemoteImageInfo { ProviderName = Name, Type = ImageType.Primary, Width = image.Width, Height = image.Height, Language = TmdbUtils.AdjustImageLanguage(image.Iso_639_1, language), Url = _tmdbClientManager.GetProfileUrl(image.FilePath) }; } return(remoteImages.OrderByLanguageDescending(language)); }
public async Task <MetadataResult <Movie> > GetMetadata(MovieInfo info, CancellationToken cancellationToken) { var tmdbId = info.GetProviderId(MetadataProvider.Tmdb); var imdbId = info.GetProviderId(MetadataProvider.Imdb); if (string.IsNullOrEmpty(tmdbId) && string.IsNullOrEmpty(imdbId)) { // ParseName is required here. // Caller provides the filename with extension stripped and NOT the parsed filename var parsedName = _libraryManager.ParseName(info.Name); var cleanedName = TmdbUtils.CleanName(parsedName.Name); var searchResults = await _tmdbClientManager.SearchMovieAsync(cleanedName, info.Year ?? parsedName.Year ?? 0, info.MetadataLanguage, cancellationToken).ConfigureAwait(false); if (searchResults.Count > 0) { tmdbId = searchResults[0].Id.ToString(CultureInfo.InvariantCulture); } } if (string.IsNullOrEmpty(tmdbId) && !string.IsNullOrEmpty(imdbId)) { var movieResultFromImdbId = await _tmdbClientManager.FindByExternalIdAsync(imdbId, FindExternalSource.Imdb, info.MetadataLanguage, cancellationToken).ConfigureAwait(false); if (movieResultFromImdbId?.MovieResults.Count > 0) { tmdbId = movieResultFromImdbId.MovieResults[0].Id.ToString(CultureInfo.InvariantCulture); } } if (string.IsNullOrEmpty(tmdbId)) { return(new MetadataResult <Movie>()); } var movieResult = await _tmdbClientManager .GetMovieAsync(Convert.ToInt32(tmdbId, CultureInfo.InvariantCulture), info.MetadataLanguage, TmdbUtils.GetImageLanguagesParam(info.MetadataLanguage), cancellationToken) .ConfigureAwait(false); if (movieResult == null) { return(new MetadataResult <Movie>()); } var movie = new Movie { Name = movieResult.Title ?? movieResult.OriginalTitle, OriginalTitle = movieResult.OriginalTitle, Overview = movieResult.Overview?.Replace("\n\n", "\n", StringComparison.InvariantCulture), Tagline = movieResult.Tagline, ProductionLocations = movieResult.ProductionCountries.Select(pc => pc.Name).ToArray() }; var metadataResult = new MetadataResult <Movie> { HasMetadata = true, ResultLanguage = info.MetadataLanguage, Item = movie }; movie.SetProviderId(MetadataProvider.Tmdb, tmdbId); movie.SetProviderId(MetadataProvider.Imdb, movieResult.ImdbId); if (movieResult.BelongsToCollection != null) { movie.SetProviderId(MetadataProvider.TmdbCollection, movieResult.BelongsToCollection.Id.ToString(CultureInfo.InvariantCulture)); movie.CollectionName = movieResult.BelongsToCollection.Name; } movie.CommunityRating = Convert.ToSingle(movieResult.VoteAverage); if (movieResult.Releases?.Countries != null) { var releases = movieResult.Releases.Countries.Where(i => !string.IsNullOrWhiteSpace(i.Certification)).ToList(); var ourRelease = releases.FirstOrDefault(c => string.Equals(c.Iso_3166_1, info.MetadataCountryCode, StringComparison.OrdinalIgnoreCase)); var usRelease = releases.FirstOrDefault(c => string.Equals(c.Iso_3166_1, "US", StringComparison.OrdinalIgnoreCase)); if (ourRelease != null) { movie.OfficialRating = TmdbUtils.BuildParentalRating(ourRelease.Iso_3166_1, ourRelease.Certification); } else if (usRelease != null) { movie.OfficialRating = usRelease.Certification; } } movie.PremiereDate = movieResult.ReleaseDate; movie.ProductionYear = movieResult.ReleaseDate?.Year; if (movieResult.ProductionCompanies != null) { movie.SetStudios(movieResult.ProductionCompanies.Select(c => c.Name)); } var genres = movieResult.Genres; foreach (var genre in genres.Select(g => g.Name)) { movie.AddGenre(genre); } if (movieResult.Keywords?.Keywords != null) { for (var i = 0; i < movieResult.Keywords.Keywords.Count; i++) { movie.AddTag(movieResult.Keywords.Keywords[i].Name); } } if (movieResult.Credits?.Cast != null) { foreach (var actor in movieResult.Credits.Cast.OrderBy(a => a.Order).Take(Plugin.Instance.Configuration.MaxCastMembers)) { var personInfo = new PersonInfo { Name = actor.Name.Trim(), Role = actor.Character, Type = PersonType.Actor, SortOrder = actor.Order }; if (!string.IsNullOrWhiteSpace(actor.ProfilePath)) { personInfo.ImageUrl = _tmdbClientManager.GetProfileUrl(actor.ProfilePath); } if (actor.Id > 0) { personInfo.SetProviderId(MetadataProvider.Tmdb, actor.Id.ToString(CultureInfo.InvariantCulture)); } metadataResult.AddPerson(personInfo); } } if (movieResult.Credits?.Crew != null) { var keepTypes = new[] { PersonType.Director, PersonType.Writer, PersonType.Producer }; foreach (var person in movieResult.Credits.Crew) { // Normalize this var type = TmdbUtils.MapCrewToPersonType(person); if (!keepTypes.Contains(type, StringComparer.OrdinalIgnoreCase) && !keepTypes.Contains(person.Job ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { continue; } var personInfo = new PersonInfo { Name = person.Name.Trim(), Role = person.Job, Type = type }; if (!string.IsNullOrWhiteSpace(person.ProfilePath)) { personInfo.ImageUrl = _tmdbClientManager.GetPosterUrl(person.ProfilePath); } if (person.Id > 0) { personInfo.SetProviderId(MetadataProvider.Tmdb, person.Id.ToString(CultureInfo.InvariantCulture)); } metadataResult.AddPerson(personInfo); } } if (movieResult.Videos?.Results != null) { var trailers = new List <MediaUrl>(); for (var i = 0; i < movieResult.Videos.Results.Count; i++) { var video = movieResult.Videos.Results[0]; if (!TmdbUtils.IsTrailerType(video)) { continue; } trailers.Add(new MediaUrl { Url = string.Format(CultureInfo.InvariantCulture, "https://www.youtube.com/watch?v={0}", video.Key), Name = video.Name }); } movie.RemoteTrailers = trailers; } return(metadataResult); }