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);
}