private Response ProcessMovies(MovieSearchType searchType, string searchTerm) { var taskList = new List <Task>(); var apiMovies = new List <MovieResult>(); taskList.Add(Task.Factory.StartNew(() => { switch (searchType) { case MovieSearchType.Search: return(MovieApi.SearchMovie(searchTerm).Result.Select(x => new MovieResult() { Adult = x.Adult, BackdropPath = x.BackdropPath, GenreIds = x.GenreIds, 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()); case MovieSearchType.CurrentlyPlaying: return(MovieApi.GetCurrentPlayingMovies().Result.ToList()); case MovieSearchType.Upcoming: return(MovieApi.GetUpcomingMovies().Result.ToList()); default: return(new List <MovieResult>()); } }).ContinueWith((t) => { apiMovies = t.Result; })); Dictionary <int, RequestedModel> dbMovies = new Dictionary <int, RequestedModel>(); taskList.Add(Task.Factory.StartNew(() => { return(RequestService.GetAll().Where(x => x.Type == RequestType.Movie)); }).ContinueWith((t) => { var distinctResults = t.Result.DistinctBy(x => x.ProviderId); dbMovies = distinctResults.ToDictionary(x => x.ProviderId); })); Task.WaitAll(taskList.ToArray()); var cpCached = CpCacher.QueuedIds(); var plexMovies = Checker.GetPlexMovies(); var settings = PrService.GetSettings(); var viewMovies = new List <SearchMovieViewModel>(); foreach (MovieResult movie in apiMovies) { var viewMovie = new SearchMovieViewModel { Adult = movie.Adult, BackdropPath = movie.BackdropPath, GenreIds = movie.GenreIds, Id = movie.Id, OriginalLanguage = movie.OriginalLanguage, OriginalTitle = movie.OriginalTitle, Overview = movie.Overview, Popularity = movie.Popularity, PosterPath = movie.PosterPath, ReleaseDate = movie.ReleaseDate, Title = movie.Title, Video = movie.Video, VoteAverage = movie.VoteAverage, VoteCount = movie.VoteCount }; var canSee = CanUserSeeThisRequest(viewMovie.Id, settings.UsersCanViewOnlyOwnRequests, dbMovies); if (Checker.IsMovieAvailable(plexMovies.ToArray(), movie.Title, movie.ReleaseDate?.Year.ToString())) { viewMovie.Available = true; } else if (dbMovies.ContainsKey(movie.Id) && canSee) // compare to the requests db { var dbm = dbMovies[movie.Id]; viewMovie.Requested = true; viewMovie.Approved = dbm.Approved; viewMovie.Available = dbm.Available; } else if (cpCached.Contains(movie.Id) && canSee) // compare to the couchpotato db { viewMovie.Requested = true; } viewMovies.Add(viewMovie); } return(Response.AsJson(viewMovies)); }
// This function also searches for movies but is used to show them in a more user-friendly manner public static DataTable SearchForMovieDisplay(MovieSearchType type, MoviesToShow moviesToShow, string input) { string sql; if (input == "") { type = MovieSearchType.None; } if (moviesToShow == MoviesToShow.AllMovies) { switch (type) { case MovieSearchType.None: { sql = SqlProcedures.RetrieveMoviesDisplay(); return(Call(sql)); } case MovieSearchType.MovieTitle: { sql = SqlProcedures.GetMoviesByTitleDisplay(input); return(Call(sql)); } case MovieSearchType.MovieGenre: { sql = SqlProcedures.GetMoviesByGenreDisplay(input); return(Call(sql)); } case MovieSearchType.MovieDirector: { sql = SqlProcedures.GetMoviesByDirectorDisplay(input); return(Call(sql)); } } } else { bool isRemoved = (moviesToShow == MoviesToShow.OnlyUnavailable); switch (type) { case MovieSearchType.None: { sql = SqlProcedures.GetFilteredMoviesDisplay(isRemoved); return(Call(sql)); } case MovieSearchType.MovieTitle: { sql = SqlProcedures.GetFilteredMoviesByTitleDisplay(input, isRemoved); return(Call(sql)); } case MovieSearchType.MovieGenre: { sql = SqlProcedures.GetFilteredMoviesByGenreDisplay(input, isRemoved); return(Call(sql)); } case MovieSearchType.MovieDirector: { sql = SqlProcedures.GetFilteredMoviesByDirectorDisplay(input, isRemoved); return(Call(sql)); } } } return(null); }