You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Ombi/src/Ombi.Core/Engine/MovieSearchEngine.cs

194 lines
7.5 KiB

using AutoMapper;
using Microsoft.Extensions.Logging;
7 years ago
using Ombi.Api.TheMovieDb;
using Ombi.Api.TheMovieDb.Models;
using Ombi.Core.Models.Requests;
using Ombi.Core.Models.Requests.Movie;
using Ombi.Core.Models.Search;
using Ombi.Core.Rules;
7 years ago
using Ombi.Core.Settings;
using Ombi.Core.Settings.Models.External;
using Ombi.Store.Repository;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using System.Threading.Tasks;
namespace Ombi.Core.Engine
{
7 years ago
public class MovieSearchEngine : BaseMediaEngine, IMovieEngine
{
public MovieSearchEngine(IPrincipal identity, IRequestServiceMain service, IMovieDbApi movApi, IMapper mapper,
ISettingsService<PlexSettings> plexSettings,
ISettingsService<EmbySettings> embySettings, IPlexContentRepository repo,
ILogger<MovieSearchEngine> logger, IRuleEvaluator r)
: base(identity, service, r)
{
7 years ago
MovieApi = movApi;
7 years ago
Mapper = mapper;
7 years ago
PlexSettings = plexSettings;
EmbySettings = embySettings;
Logger = logger;
PlexContentRepo = repo;
}
7 years ago
7 years ago
private IMovieDbApi MovieApi { get; }
7 years ago
private IMapper Mapper { get; }
7 years ago
private ISettingsService<PlexSettings> PlexSettings { get; }
private ISettingsService<EmbySettings> EmbySettings { get; }
private ILogger<MovieSearchEngine> Logger { get; }
private IPlexContentRepository PlexContentRepo { get; }
7 years ago
public async Task<IEnumerable<SearchMovieViewModel>> LookupImdbInformation(
IEnumerable<SearchMovieViewModel> movies)
{
7 years ago
var searchMovieViewModels
= movies as IList<SearchMovieViewModel> ?? movies.ToList();
if (searchMovieViewModels == null || !searchMovieViewModels.Any())
return new List<SearchMovieViewModel>();
var retVal = new List<SearchMovieViewModel>();
var dbMovies = await GetMovieRequests();
7 years ago
var plexSettings = await PlexSettings.GetSettingsAsync();
var embySettings = await EmbySettings.GetSettingsAsync();
foreach (var m in searchMovieViewModels)
{
var movieInfo = await MovieApi.GetMovieInformationWithVideo(m.Id);
7 years ago
var viewMovie = Mapper.Map<SearchMovieViewModel>(movieInfo);
7 years ago
7 years ago
retVal.Add(await ProcessSingleMovie(viewMovie, dbMovies, plexSettings, embySettings));
}
return retVal;
}
public async Task<IEnumerable<SearchMovieViewModel>> Search(string search)
{
7 years ago
var result = await MovieApi.SearchMovie(search);
if (result != null)
{
Logger.LogDebug("Search Result: {result}", result);
7 years ago
return await TransformMovieResultsToResponse(result);
}
return null;
}
public async Task<IEnumerable<SearchMovieViewModel>> PopularMovies()
{
7 years ago
var result = await MovieApi.PopularMovies();
if (result != null)
{
Logger.LogDebug("Search Result: {result}", result);
7 years ago
return await TransformMovieResultsToResponse(result);
}
return null;
}
public async Task<IEnumerable<SearchMovieViewModel>> TopRatedMovies()
{
7 years ago
var result = await MovieApi.TopRated();
if (result != null)
{
Logger.LogDebug("Search Result: {result}", result);
7 years ago
return await TransformMovieResultsToResponse(result);
}
return null;
}
public async Task<IEnumerable<SearchMovieViewModel>> UpcomingMovies()
{
7 years ago
var result = await MovieApi.Upcoming();
if (result != null)
{
Logger.LogDebug("Search Result: {result}", result);
7 years ago
return await TransformMovieResultsToResponse(result);
}
return null;
}
public async Task<IEnumerable<SearchMovieViewModel>> NowPlayingMovies()
{
7 years ago
var result = await MovieApi.NowPlaying();
if (result != null)
{
Logger.LogDebug("Search Result: {result}", result);
7 years ago
return await TransformMovieResultsToResponse(result);
}
return null;
}
private async Task<List<SearchMovieViewModel>> TransformMovieResultsToResponse(
IEnumerable<MovieSearchResult> movies)
{
var viewMovies = new List<SearchMovieViewModel>();
var dbMovies = await GetMovieRequests();
7 years ago
var plexSettings = await PlexSettings.GetSettingsAsync();
var embySettings = await EmbySettings.GetSettingsAsync();
foreach (var movie in movies)
7 years ago
viewMovies.Add(await ProcessSingleMovie(movie, dbMovies, plexSettings, embySettings));
7 years ago
return viewMovies;
}
7 years ago
private async Task<SearchMovieViewModel> ProcessSingleMovie(SearchMovieViewModel viewMovie,
7 years ago
Dictionary<int, MovieRequestModel> existingRequests, PlexSettings plexSettings, EmbySettings embySettings)
{
var showInfo = await MovieApi.GetMovieInformation(viewMovie.Id);
viewMovie.Id = showInfo.Id; // TheMovieDbId
7 years ago
if (plexSettings.Enable)
{
var item = await PlexContentRepo.Get(showInfo.ImdbId);
if (item != null)
{
viewMovie.Available = true;
viewMovie.PlexUrl = item.Url;
}
// var content = PlexContentRepository.GetAll();
// var plexMovies = PlexChecker.GetPlexMovies(content);
// var plexMovie = PlexChecker.GetMovie(plexMovies.ToArray(), movie.Title,
// movie.ReleaseDate?.Year.ToString(),
// viewMovie.ImdbId);
// if (plexMovie != null)
// {
// viewMovie.Available = true;
// viewMovie.PlexUrl = plexMovie.Url;
// }
7 years ago
}
if (embySettings.Enable)
{
// var embyContent = EmbyContentRepository.GetAll();
// var embyMovies = EmbyChecker.GetEmbyMovies(embyContent);
// var embyMovie = EmbyChecker.GetMovie(embyMovies.ToArray(), movie.Title,
// movie.ReleaseDate?.Year.ToString(), viewMovie.ImdbId);
// if (embyMovie != null)
// {
// viewMovie.Available = true;
// }
7 years ago
}
7 years ago
if (existingRequests.ContainsKey(viewMovie.Id)) // Do we already have a request for this?
{
var requestedMovie = existingRequests[viewMovie.Id];
7 years ago
viewMovie.Requested = true;
viewMovie.Approved = requestedMovie.Approved;
viewMovie.Available = requestedMovie.Available;
}
RunSearchRules(viewMovie);
7 years ago
return viewMovie;
}
private async Task<SearchMovieViewModel> ProcessSingleMovie(MovieSearchResult movie,
Dictionary<int, MovieRequestModel> existingRequests, PlexSettings plexSettings, EmbySettings embySettings)
7 years ago
{
var viewMovie = Mapper.Map<SearchMovieViewModel>(movie);
7 years ago
return await ProcessSingleMovie(viewMovie, existingRequests, plexSettings, embySettings);
}
}
}