diff --git a/MediaBrowser.Model/Entities/ProviderIdsExtensions.cs b/MediaBrowser.Model/Entities/ProviderIdsExtensions.cs index 98097477c6..c643f1ecd1 100644 --- a/MediaBrowser.Model/Entities/ProviderIdsExtensions.cs +++ b/MediaBrowser.Model/Entities/ProviderIdsExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace MediaBrowser.Model.Entities { @@ -35,8 +36,9 @@ namespace MediaBrowser.Model.Entities /// /// The instance. /// The name. - /// System.String. - public static string? GetProviderId(this IHasProviderIds instance, string name) + /// The provider id. + /// true if a provider id with the given name was found; otherwise false. + public static bool TryGetProviderId(this IHasProviderIds instance, string name, [MaybeNullWhen(false)] out string id) { if (instance == null) { @@ -45,11 +47,35 @@ namespace MediaBrowser.Model.Entities if (instance.ProviderIds == null) { - return null; + id = string.Empty; + return false; } - instance.ProviderIds.TryGetValue(name, out string? id); - return string.IsNullOrEmpty(id) ? null : id; + return instance.ProviderIds.TryGetValue(name, out id); + } + + /// + /// Gets a provider id. + /// + /// The instance. + /// The provider. + /// The provider id. + /// true if a provider id with the given name was found; otherwise false. + public static bool TryGetProviderId(this IHasProviderIds instance, MetadataProvider provider, [MaybeNullWhen(false)] out string id) + { + return instance.TryGetProviderId(provider.ToString(), out id); + } + + /// + /// Gets a provider id. + /// + /// The instance. + /// The name. + /// System.String. + public static string? GetProviderId(this IHasProviderIds instance, string name) + { + instance.TryGetProviderId(name, out string? id); + return id; } /// diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs b/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs index f6926d680d..9a3e3d5fad 100644 --- a/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs +++ b/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs @@ -7,6 +7,8 @@ using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using TMDbLib.Objects.Find; +using TMDbLib.Objects.Search; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; @@ -43,64 +45,89 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies public async Task> GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken) { - var tmdbId = Convert.ToInt32(searchInfo.GetProviderId(MetadataProvider.Tmdb), CultureInfo.InvariantCulture); - - if (tmdbId == 0) + if (searchInfo.TryGetProviderId(MetadataProvider.Tmdb, out var id)) { - var movieResults = await _tmdbClientManager - .SearchMovieAsync(searchInfo.Name, searchInfo.Year ?? 0, searchInfo.MetadataLanguage, cancellationToken) + var movie = await _tmdbClientManager + .GetMovieAsync( + int.Parse(id, CultureInfo.InvariantCulture), + searchInfo.MetadataLanguage, + TmdbUtils.GetImageLanguagesParam(searchInfo.MetadataLanguage), + cancellationToken) .ConfigureAwait(false); - var remoteSearchResults = new List(); - for (var i = 0; i < movieResults.Count; i++) + var remoteResult = new RemoteSearchResult { - var movieResult = movieResults[i]; - var remoteSearchResult = new RemoteSearchResult - { - Name = movieResult.Title ?? movieResult.OriginalTitle, - ImageUrl = _tmdbClientManager.GetPosterUrl(movieResult.PosterPath), - Overview = movieResult.Overview, - SearchProviderName = Name - }; + Name = movie.Title ?? movie.OriginalTitle, + SearchProviderName = Name, + ImageUrl = _tmdbClientManager.GetPosterUrl(movie.PosterPath), + Overview = movie.Overview + }; + + if (movie.ReleaseDate != null) + { + var releaseDate = movie.ReleaseDate.Value.ToUniversalTime(); + remoteResult.PremiereDate = releaseDate; + remoteResult.ProductionYear = releaseDate.Year; + } - var releaseDate = movieResult.ReleaseDate?.ToUniversalTime(); - remoteSearchResult.PremiereDate = releaseDate; - remoteSearchResult.ProductionYear = releaseDate?.Year; + remoteResult.SetProviderId(MetadataProvider.Tmdb, movie.Id.ToString(CultureInfo.InvariantCulture)); - remoteSearchResult.SetProviderId(MetadataProvider.Tmdb, movieResult.Id.ToString(CultureInfo.InvariantCulture)); - remoteSearchResults.Add(remoteSearchResult); + if (!string.IsNullOrWhiteSpace(movie.ImdbId)) + { + remoteResult.SetProviderId(MetadataProvider.Imdb, movie.ImdbId); } - return remoteSearchResults; + return new[] { remoteResult }; } - var movie = await _tmdbClientManager - .GetMovieAsync(tmdbId, searchInfo.MetadataLanguage, TmdbUtils.GetImageLanguagesParam(searchInfo.MetadataLanguage), cancellationToken) - .ConfigureAwait(false); - - var remoteResult = new RemoteSearchResult + IReadOnlyList movieResults; + if (searchInfo.TryGetProviderId(MetadataProvider.Imdb, out id)) { - Name = movie.Title ?? movie.OriginalTitle, - SearchProviderName = Name, - ImageUrl = _tmdbClientManager.GetPosterUrl(movie.PosterPath), - Overview = movie.Overview - }; - - if (movie.ReleaseDate != null) + var result = await _tmdbClientManager.FindByExternalIdAsync( + id, + FindExternalSource.Imdb, + TmdbUtils.GetImageLanguagesParam(searchInfo.MetadataLanguage), + cancellationToken).ConfigureAwait(false); + movieResults = result.MovieResults; + } + else if (searchInfo.TryGetProviderId(MetadataProvider.Tvdb, out id)) { - var releaseDate = movie.ReleaseDate.Value.ToUniversalTime(); - remoteResult.PremiereDate = releaseDate; - remoteResult.ProductionYear = releaseDate.Year; + var result = await _tmdbClientManager.FindByExternalIdAsync( + id, + FindExternalSource.TvDb, + TmdbUtils.GetImageLanguagesParam(searchInfo.MetadataLanguage), + cancellationToken).ConfigureAwait(false); + movieResults = result.MovieResults; + } + else + { + movieResults = await _tmdbClientManager + .SearchMovieAsync(searchInfo.Name, searchInfo.Year ?? 0, searchInfo.MetadataLanguage, cancellationToken) + .ConfigureAwait(false); } - remoteResult.SetProviderId(MetadataProvider.Tmdb, movie.Id.ToString(CultureInfo.InvariantCulture)); - - if (!string.IsNullOrWhiteSpace(movie.ImdbId)) + var len = movieResults.Count; + var remoteSearchResults = new RemoteSearchResult[len]; + for (var i = 0; i < len; i++) { - remoteResult.SetProviderId(MetadataProvider.Imdb, movie.ImdbId); + var movieResult = movieResults[i]; + var remoteSearchResult = new RemoteSearchResult + { + Name = movieResult.Title ?? movieResult.OriginalTitle, + ImageUrl = _tmdbClientManager.GetPosterUrl(movieResult.PosterPath), + Overview = movieResult.Overview, + SearchProviderName = Name + }; + + var releaseDate = movieResult.ReleaseDate?.ToUniversalTime(); + remoteSearchResult.PremiereDate = releaseDate; + remoteSearchResult.ProductionYear = releaseDate?.Year; + + remoteSearchResult.SetProviderId(MetadataProvider.Tmdb, movieResult.Id.ToString(CultureInfo.InvariantCulture)); + remoteSearchResults[i] = remoteSearchResult; } - return new[] { remoteResult }; + return remoteSearchResults; } public async Task> GetMetadata(MovieInfo info, CancellationToken cancellationToken)