/// <summary> /// Get movies as a list from wrapped movies /// </summary> /// <param name="wrapper">Wrapped movies</param> /// <returns>List of movies</returns> private static IEnumerable <MovieShort> GetMoviesListFromWrapper(WrapperMovieShort wrapper) { return(wrapper?.Data?.Movies?.Select(movie => new MovieShort { ApiVersion = movie.ApiVersion, DateUploaded = movie.DateUploaded, DateUploadedUnix = movie.DateUploadedUnix, ExecutionTime = movie.ExecutionTime, Genres = movie.Genres, Id = movie.Id, ImdbCode = movie.ImdbCode, IsFavorite = false, HasBeenSeen = false, Language = movie.Language, MediumCoverImage = movie.MediumCoverImage, CoverImagePath = string.Empty, MpaRating = movie.MpaRating, RatingValue = movie.Rating, Runtime = movie.Runtime, ServerTime = movie.ServerTime, ServerTimezone = movie.ServerTimezone, SmallCoverImage = movie.SmallCoverImage, State = movie.State, Title = movie.Title, TitleLong = movie.TitleLong, Torrents = movie.Torrents, Url = movie.Url, Year = movie.Year }).ToList()); }
/// <summary> /// Search movies by criteria /// </summary> /// <param name="criteria">Criteria used for search</param> /// <param name="page">Page to return</param> /// <param name="limit">The maximum number of movies to return</param> /// <param name="genre">The genre to filter</param> /// <param name="ratingFilter">Used to filter by rating</param> /// <param name="ct">Cancellation token</param> /// <returns>Searched movies and the number of movies found</returns> public async Task <Tuple <IEnumerable <MovieShort>, int> > SearchMoviesAsync(string criteria, int page, int limit, MovieGenre genre, double ratingFilter, CancellationToken ct) { var watch = Stopwatch.StartNew(); var wrapper = new WrapperMovieShort(); if (limit < 1 || limit > 50) { limit = 20; } if (page < 1) { page = 1; } var restClient = new RestClient(Constants.YtsApiEndpoint); var request = new RestRequest("/{segment}", Method.GET); request.AddUrlSegment("segment", "list_movies.json"); request.AddParameter("limit", limit); request.AddParameter("page", page); if (genre != null) { request.AddParameter("genre", genre.EnglishName); } request.AddParameter("minimum_rating", ratingFilter); request.AddParameter("query_term", criteria); try { var response = await restClient.ExecuteGetTaskAsync <WrapperMovieShort>(request, ct); if (response.ErrorException != null) { throw response.ErrorException; } wrapper = response.Data; } catch (Exception exception) when(exception is TaskCanceledException) { Logger.Debug( "SearchMoviesAsync cancelled."); } catch (Exception exception) { Logger.Error( $"SearchMoviesAsync: {exception.Message}"); throw; } finally { watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Debug( $"SearchMoviesAsync ({criteria}, {page}, {limit}) in {elapsedMs} milliseconds."); } var movies = GetMoviesListFromWrapper(wrapper) ?? new List <MovieShort>(); var nbMovies = wrapper?.Data?.MovieCount ?? 0; return(new Tuple <IEnumerable <MovieShort>, int>(movies, nbMovies)); }