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