/// <summary> /// Retrieve an anime from MAL /// </summary> /// <param name="id">MAL Id</param> /// <param name="loginDetails">Username and password for retrieving user information. Pass null to retrieve pulbic page</param> /// <returns>Anime instance</returns> private async Task <RetrievalWrapper <Anime> > DoAnimeRetrieval(int id, Tuple <string, string> loginDetails) { var anime = new Anime(); try { var animePageTask = loginDetails == null ? _pageRetriever.RetrieveHtmlPageAsync(MalRouteBuilder.AnimeUrl(id)) : _pageRetriever.RetrieveHtmlPageAsync(MalRouteBuilder.AnimeUrl(id), loginDetails.Item1, loginDetails.Item2); var characterTask = _pageRetriever.RetrieveHtmlPageAsync(MalRouteBuilder.AnimeCharacterUrl(id)); var animeResponse = await animePageTask; if (animeResponse.ResponseStatusCode == null) { throw animeResponse.Exception; } if (!new HttpResponseMessage(animeResponse.ResponseStatusCode.Value) .IsSuccessStatusCode) { anime.ErrorOccured = true; anime.ErrorMessage = $"Status code {animeResponse.ResponseStatusCode.Value} does not indicate success"; return(new RetrievalWrapper <Anime>(animeResponse.ResponseStatusCode.Value, false, anime)); } var characterResponse = await characterTask; var animeDoc = animeResponse.Document; var characterDoc = characterResponse.Document; anime .RetrieveAnimeId(animeDoc) .RetrieveAnimeTitle(animeDoc) .RetrieveAlternativeTitles(animeDoc) .RetrieveSynopsis(animeDoc) .RetrieveImage(animeDoc) .RetrieveType(animeDoc) .RetrieveEpisodes(animeDoc) .RetrieveStatus(animeDoc) .RetrieveAirDates(animeDoc) .RetrieveRating(animeDoc) .RetrieveRank(animeDoc) .RetrievePopularity(animeDoc) .RetrieveScore(animeDoc) .RetrieveMemberCount(animeDoc) .RetrieveFavotireCount(animeDoc) .RetrieveGenres(animeDoc) .RetrieveInfoUrls(animeDoc) .RetrieveRelatedAnime(animeDoc) .PopulateCharacterAndSeiyuuInformation(characterDoc); if (loginDetails != null) { anime .RetrieveUserScore(animeDoc) .RetrieveUserEpisode(animeDoc) .RetrieveUserStatus(animeDoc); } // TODO - Add sanity check return(new RetrievalWrapper <Anime>(animeResponse.ResponseStatusCode.Value, animeResponse.Success, anime)); } catch (Exception exception) { anime.ErrorOccured = true; anime.ErrorMessage = exception.Message; return(new RetrievalWrapper <Anime>(exception, anime)); } }