Popcorn.Services.Movie.MovieService.GetMovieFullDetailsAsync C# (CSharp) Method

GetMovieFullDetailsAsync() public method

Get TMDb movie informations
public GetMovieFullDetailsAsync ( Popcorn.Models.Movie.Short.MovieShort movieToLoad, CancellationToken ct ) : Task
movieToLoad Popcorn.Models.Movie.Short.MovieShort Movie to load
ct System.Threading.CancellationToken Used to cancel loading
return Task
        public async Task<MovieFull> GetMovieFullDetailsAsync(MovieShort movieToLoad, CancellationToken ct)
        {
            var watch = Stopwatch.StartNew();

            var movie = new MovieFull();

            var restClient = new RestClient(Constants.YtsApiEndpoint);
            var request = new RestRequest("/{segment}", Method.GET);
            request.AddUrlSegment("segment", "movie_details.json");
            request.AddParameter("movie_id", movieToLoad.Id);
            request.AddParameter("with_images", "true");
            request.AddParameter("with_cast", "true");

            try
            {
                var response = await restClient.ExecuteGetTaskAsync<WrapperMovieFull>(request, ct);
                if (response.ErrorException != null)
                    throw response.ErrorException;

                await Task.Run(async () =>
                {
                    var tmdbInfos = await TmdbClient.GetMovieAsync(response.Data.Data.Movie.ImdbCode,
                        MovieMethods.Credits);

                    movie = new MovieFull
                    {
                        Id = response.Data.Data.Movie.Id,
                        Cast = response.Data.Data.Movie.Cast,
                        BackgroundImagePath = string.Empty,
                        DateUploaded = response.Data.Data.Movie.DateUploaded,
                        DateUploadedUnix = response.Data.Data.Movie.DateUploadedUnix,
                        DescriptionFull = tmdbInfos.Overview,
                        DescriptionIntro = response.Data.Data.Movie.DescriptionIntro,
                        DownloadCount = response.Data.Data.Movie.DownloadCount,
                        FullHdAvailable = response.Data.Data.Movie.Torrents.Any(torrent => torrent.Quality == "1080p"),
                        Genres = tmdbInfos.Genres.Select(a => a.Name).ToList(),
                        ImdbCode = response.Data.Data.Movie.ImdbCode,
                        Language = response.Data.Data.Movie.Language,
                        LikeCount = response.Data.Data.Movie.LikeCount,
                        MpaRating = response.Data.Data.Movie.MpaRating,
                        LargeCoverImage = response.Data.Data.Movie.LargeCoverImage,
                        PosterImagePath = string.Empty,
                        RatingValue = response.Data.Data.Movie.Rating,
                        RtAudienceRating = response.Data.Data.Movie.RtAudienceRating,
                        RtAudienceScore = response.Data.Data.Movie.RtAudienceScore,
                        RtCriticsRating = response.Data.Data.Movie.RtCriticsRating,
                        RtCrtiticsScore = response.Data.Data.Movie.RtCrtiticsScore,
                        Runtime = response.Data.Data.Movie.Runtime,
                        Title = tmdbInfos.Title,
                        TitleLong = response.Data.Data.Movie.TitleLong,
                        Torrents = response.Data.Data.Movie.Torrents,
                        Url = response.Data.Data.Movie.Url,
                        WatchInFullHdQuality = false,
                        Year = response.Data.Data.Movie.Year,
                        YtTrailerCode = response.Data.Data.Movie.YtTrailerCode
                    };
                }, ct);
            }
            catch (Exception exception) when (exception is TaskCanceledException)
            {
                Logger.Debug(
                    "GetMovieFullDetailsAsync cancelled.");
            }
            catch (Exception exception)
            {
                Logger.Error(
                    $"GetMovieFullDetailsAsync: {exception.Message}");
                throw;
            }
            finally
            {
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Debug(
                    $"GetMovieFullDetailsAsync ({movie.ImdbCode}) in {elapsedMs} milliseconds.");
            }

            return movie;
        }