TMDB: Also search with IMDB or TVDB Id if specified

pull/5270/head
Bond_009 4 years ago
parent 5379fa0bd0
commit b2700ecf44

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
namespace MediaBrowser.Model.Entities namespace MediaBrowser.Model.Entities
{ {
@ -35,8 +36,9 @@ namespace MediaBrowser.Model.Entities
/// </summary> /// </summary>
/// <param name="instance">The instance.</param> /// <param name="instance">The instance.</param>
/// <param name="name">The name.</param> /// <param name="name">The name.</param>
/// <returns>System.String.</returns> /// <param name="id">The provider id.</param>
public static string? GetProviderId(this IHasProviderIds instance, string name) /// <returns><c>true</c> if a provider id with the given name was found; otherwise <c>false</c>.</returns>
public static bool TryGetProviderId(this IHasProviderIds instance, string name, [MaybeNullWhen(false)] out string id)
{ {
if (instance == null) if (instance == null)
{ {
@ -45,11 +47,35 @@ namespace MediaBrowser.Model.Entities
if (instance.ProviderIds == null) if (instance.ProviderIds == null)
{ {
return null; id = string.Empty;
return false;
} }
instance.ProviderIds.TryGetValue(name, out string? id); return instance.ProviderIds.TryGetValue(name, out id);
return string.IsNullOrEmpty(id) ? null : id; }
/// <summary>
/// Gets a provider id.
/// </summary>
/// <param name="instance">The instance.</param>
/// <param name="provider">The provider.</param>
/// <param name="id">The provider id.</param>
/// <returns><c>true</c> if a provider id with the given name was found; otherwise <c>false</c>.</returns>
public static bool TryGetProviderId(this IHasProviderIds instance, MetadataProvider provider, [MaybeNullWhen(false)] out string id)
{
return instance.TryGetProviderId(provider.ToString(), out id);
}
/// <summary>
/// Gets a provider id.
/// </summary>
/// <param name="instance">The instance.</param>
/// <param name="name">The name.</param>
/// <returns>System.String.</returns>
public static string? GetProviderId(this IHasProviderIds instance, string name)
{
instance.TryGetProviderId(name, out string? id);
return id;
} }
/// <summary> /// <summary>

@ -7,6 +7,8 @@ using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using TMDbLib.Objects.Find;
using TMDbLib.Objects.Search;
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.Movies;
@ -43,64 +45,89 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken) public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken)
{ {
var tmdbId = Convert.ToInt32(searchInfo.GetProviderId(MetadataProvider.Tmdb), CultureInfo.InvariantCulture); if (searchInfo.TryGetProviderId(MetadataProvider.Tmdb, out var id))
if (tmdbId == 0)
{ {
var movieResults = await _tmdbClientManager var movie = await _tmdbClientManager
.SearchMovieAsync(searchInfo.Name, searchInfo.Year ?? 0, searchInfo.MetadataLanguage, cancellationToken) .GetMovieAsync(
int.Parse(id, CultureInfo.InvariantCulture),
searchInfo.MetadataLanguage,
TmdbUtils.GetImageLanguagesParam(searchInfo.MetadataLanguage),
cancellationToken)
.ConfigureAwait(false); .ConfigureAwait(false);
var remoteSearchResults = new List<RemoteSearchResult>(); var remoteResult = new RemoteSearchResult
for (var i = 0; i < movieResults.Count; i++)
{ {
var movieResult = movieResults[i]; Name = movie.Title ?? movie.OriginalTitle,
var remoteSearchResult = new RemoteSearchResult SearchProviderName = Name,
{ ImageUrl = _tmdbClientManager.GetPosterUrl(movie.PosterPath),
Name = movieResult.Title ?? movieResult.OriginalTitle, Overview = movie.Overview
ImageUrl = _tmdbClientManager.GetPosterUrl(movieResult.PosterPath), };
Overview = movieResult.Overview,
SearchProviderName = Name if (movie.ReleaseDate != null)
}; {
var releaseDate = movie.ReleaseDate.Value.ToUniversalTime();
remoteResult.PremiereDate = releaseDate;
remoteResult.ProductionYear = releaseDate.Year;
}
var releaseDate = movieResult.ReleaseDate?.ToUniversalTime(); remoteResult.SetProviderId(MetadataProvider.Tmdb, movie.Id.ToString(CultureInfo.InvariantCulture));
remoteSearchResult.PremiereDate = releaseDate;
remoteSearchResult.ProductionYear = releaseDate?.Year;
remoteSearchResult.SetProviderId(MetadataProvider.Tmdb, movieResult.Id.ToString(CultureInfo.InvariantCulture)); if (!string.IsNullOrWhiteSpace(movie.ImdbId))
remoteSearchResults.Add(remoteSearchResult); {
remoteResult.SetProviderId(MetadataProvider.Imdb, movie.ImdbId);
} }
return remoteSearchResults; return new[] { remoteResult };
} }
var movie = await _tmdbClientManager IReadOnlyList<SearchMovie> movieResults;
.GetMovieAsync(tmdbId, searchInfo.MetadataLanguage, TmdbUtils.GetImageLanguagesParam(searchInfo.MetadataLanguage), cancellationToken) if (searchInfo.TryGetProviderId(MetadataProvider.Imdb, out id))
.ConfigureAwait(false);
var remoteResult = new RemoteSearchResult
{ {
Name = movie.Title ?? movie.OriginalTitle, var result = await _tmdbClientManager.FindByExternalIdAsync(
SearchProviderName = Name, id,
ImageUrl = _tmdbClientManager.GetPosterUrl(movie.PosterPath), FindExternalSource.Imdb,
Overview = movie.Overview TmdbUtils.GetImageLanguagesParam(searchInfo.MetadataLanguage),
}; cancellationToken).ConfigureAwait(false);
movieResults = result.MovieResults;
if (movie.ReleaseDate != null) }
else if (searchInfo.TryGetProviderId(MetadataProvider.Tvdb, out id))
{ {
var releaseDate = movie.ReleaseDate.Value.ToUniversalTime(); var result = await _tmdbClientManager.FindByExternalIdAsync(
remoteResult.PremiereDate = releaseDate; id,
remoteResult.ProductionYear = releaseDate.Year; 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)); var len = movieResults.Count;
var remoteSearchResults = new RemoteSearchResult[len];
if (!string.IsNullOrWhiteSpace(movie.ImdbId)) 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<MetadataResult<Movie>> GetMetadata(MovieInfo info, CancellationToken cancellationToken) public async Task<MetadataResult<Movie>> GetMetadata(MovieInfo info, CancellationToken cancellationToken)

Loading…
Cancel
Save