mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-11 07:46:05 -07:00
API changes to allow for searching movies by actor
This commit is contained in:
parent
a8288a93b0
commit
9380ba3e45
4 changed files with 88 additions and 12 deletions
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")]
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue