예제 #1
0
        /// <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));
            }
        }