API changes to allow for searching movies by actor

This commit is contained in:
smcpeck 2017-02-23 12:02:04 -06:00
parent a8288a93b0
commit 9380ba3e45
4 changed files with 88 additions and 12 deletions

View file

@ -69,6 +69,11 @@ namespace Ombi.Api
return movies?.Results ?? new List<MovieResult>(); return movies?.Results ?? new List<MovieResult>();
} }
private async Task<Movie> GetMovie(int id)
{
return await Client.GetMovie(id);
}
public TmdbMovieDetails GetMovieInformationWithVideos(int tmdbId) public TmdbMovieDetails GetMovieInformationWithVideos(int tmdbId)
{ {
var request = new RestRequest { Resource = "movie/{movieId}", Method = Method.GET }; var request = new RestRequest { Resource = "movie/{movieId}", Method = Method.GET };
@ -100,5 +105,33 @@ namespace Ombi.Api
var movies = await Client.GetMovie(imdbId); var movies = await Client.GetMovie(imdbId);
return movies ?? new Movie(); return movies ?? new Movie();
} }
public async Task<List<Movie>> SearchActor(string searchTerm)
{
SearchContainer<SearchPerson> result = await Client.SearchPerson(searchTerm);
var person = result?.Results[0] ?? null;
var movies = new List<Movie>();
var counter = 0;
try
{
if (person != null)
{
var credits = await Client.GetPersonMovieCredits(person.Id);
//only get the first 10 movies and delay a bit between each request so we don't overload the API
foreach (var credit in credits.Cast)
{ if (counter == 10)
break;
movies.Add(await GetMovie(credit.Id));
counter++;
await Task.Delay(50);
}
}
}
catch(Exception e)
{
Log.LogException(LogLevel.Error, $"Aggregating movies for {searchTerm} failed.", e);
}
return movies;
}
} }
} }

View file

@ -41,6 +41,7 @@ namespace Ombi.Core.SettingModels
public int Port { get; set; } public int Port { get; set; }
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
public bool SearchForMovies { get; set; } public bool SearchForMovies { get; set; }
public bool SearchForActors { get; set; }
public bool SearchForTvShows { get; set; } public bool SearchForTvShows { get; set; }
public bool SearchForMusic { get; set; } public bool SearchForMusic { get; set; }
[Obsolete("Use the user management settings")] [Obsolete("Use the user management settings")]

View file

@ -77,6 +77,7 @@ namespace Ombi.Core
{ {
SearchForMovies = true, SearchForMovies = true,
SearchForTvShows = true, SearchForTvShows = true,
SearchForActors = true,
BaseUrl = baseUrl ?? string.Empty, BaseUrl = baseUrl ?? string.Empty,
CollectAnalyticData = true, CollectAnalyticData = true,
}; };

View file

@ -115,6 +115,7 @@ namespace Ombi.UI.Modules
Get["SearchIndex", "/", true] = async (x, ct) => await RequestLoad(); Get["SearchIndex", "/", true] = async (x, ct) => await RequestLoad();
Get["actor/{searchTerm}", true] = async (x, ct) => await SearchActor((string)x.searchTerm);
Get["movie/{searchTerm}", true] = async (x, ct) => await SearchMovie((string)x.searchTerm); Get["movie/{searchTerm}", true] = async (x, ct) => await SearchMovie((string)x.searchTerm);
Get["tv/{searchTerm}", true] = async (x, ct) => await SearchTvShow((string)x.searchTerm); Get["tv/{searchTerm}", true] = async (x, ct) => await SearchTvShow((string)x.searchTerm);
Get["music/{searchTerm}", true] = async (x, ct) => await SearchAlbum((string)x.searchTerm); Get["music/{searchTerm}", true] = async (x, ct) => await SearchAlbum((string)x.searchTerm);
@ -209,6 +210,12 @@ namespace Ombi.UI.Modules
return await ProcessMovies(MovieSearchType.Search, searchTerm); return await ProcessMovies(MovieSearchType.Search, searchTerm);
} }
private async Task<Response> SearchActor(string searchTerm)
{
var movies = TransformMovieListToMovieResultList(await MovieApi.SearchActor(searchTerm).ConfigureAwait(false));
return await TransformMovieResultsToResponse(movies);
}
private Response GetTvPoster(int theTvDbId) private Response GetTvPoster(int theTvDbId)
{ {
var result = TvApi.ShowLookupByTheTvDbId(theTvDbId); var result = TvApi.ShowLookupByTheTvDbId(theTvDbId);
@ -220,15 +227,10 @@ namespace Ombi.UI.Modules
} }
return banner; return banner;
} }
private async Task<Response> ProcessMovies(MovieSearchType searchType, string searchTerm)
{
List<MovieResult> apiMovies;
switch (searchType) private List<MovieResult> TransformSearchMovieListToMovieResultList(List<TMDbLib.Objects.Search.SearchMovie> searchMovies)
{ {
case MovieSearchType.Search: return searchMovies.Select(x =>
var movies = await MovieApi.SearchMovie(searchTerm).ConfigureAwait(false);
apiMovies = movies.Select(x =>
new MovieResult new MovieResult
{ {
Adult = x.Adult, Adult = x.Adult,
@ -247,6 +249,39 @@ namespace Ombi.UI.Modules
VoteCount = x.VoteCount VoteCount = x.VoteCount
}) })
.ToList(); .ToList();
}
private List<MovieResult> TransformMovieListToMovieResultList(List<TMDbLib.Objects.Movies.Movie> movies)
{
return movies.Select(x =>
new MovieResult
{
Adult = x.Adult,
BackdropPath = x.BackdropPath,
GenreIds = x.Genres.Select(y => y.Id).ToList(),
Id = x.Id,
OriginalLanguage = x.OriginalLanguage,
OriginalTitle = x.OriginalTitle,
Overview = x.Overview,
Popularity = x.Popularity,
PosterPath = x.PosterPath,
ReleaseDate = x.ReleaseDate,
Title = x.Title,
Video = x.Video,
VoteAverage = x.VoteAverage,
VoteCount = x.VoteCount
})
.ToList();
}
private async Task<Response> ProcessMovies(MovieSearchType searchType, string searchTerm)
{
List<MovieResult> apiMovies;
switch (searchType)
{
case MovieSearchType.Search:
var movies = await MovieApi.SearchMovie(searchTerm).ConfigureAwait(false);
apiMovies = TransformSearchMovieListToMovieResultList(movies);
break; break;
case MovieSearchType.CurrentlyPlaying: case MovieSearchType.CurrentlyPlaying:
apiMovies = await MovieApi.GetCurrentPlayingMovies(); apiMovies = await MovieApi.GetCurrentPlayingMovies();
@ -259,6 +294,11 @@ namespace Ombi.UI.Modules
break; break;
} }
return await TransformMovieResultsToResponse(apiMovies);
}
private async Task<Response> TransformMovieResultsToResponse(List<MovieResult> movies)
{
var allResults = await RequestService.GetAllAsync(); var allResults = await RequestService.GetAllAsync();
allResults = allResults.Where(x => x.Type == RequestType.Movie); allResults = allResults.Where(x => x.Type == RequestType.Movie);
@ -273,7 +313,7 @@ namespace Ombi.UI.Modules
var plexMovies = Checker.GetPlexMovies(content); var plexMovies = Checker.GetPlexMovies(content);
var viewMovies = new List<SearchMovieViewModel>(); var viewMovies = new List<SearchMovieViewModel>();
var counter = 0; var counter = 0;
foreach (var movie in apiMovies) foreach (var movie in movies)
{ {
var viewMovie = new SearchMovieViewModel var viewMovie = new SearchMovieViewModel
{ {
@ -335,7 +375,7 @@ namespace Ombi.UI.Modules
viewMovie.Approved = true; viewMovie.Approved = true;
viewMovie.Requested = true; viewMovie.Requested = true;
} }
else if(watcherCached.Contains(imdbId) && canSee) // compare to the watcher db else if (watcherCached.Contains(imdbId) && canSee) // compare to the watcher db
{ {
viewMovie.Approved = true; viewMovie.Approved = true;
viewMovie.Requested = true; viewMovie.Requested = true;
@ -349,6 +389,7 @@ namespace Ombi.UI.Modules
} }
return Response.AsJson(viewMovies); return Response.AsJson(viewMovies);
} }
private bool CanUserSeeThisRequest(int movieId, bool usersCanViewOnlyOwnRequests, private bool CanUserSeeThisRequest(int movieId, bool usersCanViewOnlyOwnRequests,