Beispiel #1
0
        public async Task FetchData()
        {
            if (_loaded)
            {
                return;
            }
            //Find for first
            DependentData =
                await
                new AnimeGeneralDetailsQuery().GetAnimeDetails(false, DependentId.ToString(), DependentTitle, true,
                                                               ApiType.Mal);

            //Find for second
            RecommendationData =
                await
                new AnimeGeneralDetailsQuery().GetAnimeDetails(false, RecommendationId.ToString(),
                                                               RecommendationTitle, true, ApiType.Mal);

            //If for some reason we fail
            if (DependentData == null || RecommendationData == null)
            {
                throw new ArgumentNullException(); // I'm to lazy to create my own so this will suffice
            }
            _loaded = true;
        }
Beispiel #2
0
 public static async void SaveAnimeSearchResultsData(string id, AnimeGeneralDetailsData data, bool anime)
 {
     try
     {
         await Task.Run(async() =>
         {
             var folder =
                 await
                 ApplicationData.Current.LocalFolder.CreateFolderAsync(
                     anime ? "AnimeDetails" : "MangaDetails",
                     CreationCollisionOption.OpenIfExists);
             var json =
                 JsonConvert.SerializeObject(new Tuple <DateTime, AnimeGeneralDetailsData>(DateTime.UtcNow, data));
             var file =
                 await
                 folder.CreateFileAsync($"mal_details_{id}.json",
                                        CreationCollisionOption.ReplaceExisting);
             await FileIO.WriteTextAsync(file, json);
         });
     }
     catch (Exception)
     {
         //magic
     }
 }
 public AnimeDetailsPageNavigationArgs(int id, string title, AnimeGeneralDetailsData element,
                                       IAnimeData animeReference,
                                       object args = null, bool humId = false)
 {
     Id            = id;
     Title         = title;
     AnimeElement  = element;
     PrevPageSetup = args;
     AnimeItem     = animeReference;
     _isHumId      = humId;
 }
Beispiel #4
0
 public static async void SaveAnimeSearchResultsData(string id, AnimeGeneralDetailsData data, bool anime)
 {
     try
     {
         await Task.Run(async() =>
         {
             await
             DataCacheService.SaveData(data, $"mal_details_{id}.json",
                                       anime ? "AnimeDetails" : "MangaDetails");
         });
     }
     catch (Exception)
     {
         //magic
     }
 }
Beispiel #5
0
 public AnimeSearchItemViewModel(AnimeGeneralDetailsData data, bool anime = true)
 {
     _item       = data;
     Id          = data.Id;
     GlobalScore = data.GlobalScore;
     AllEpisodes = data.AllEpisodes;
     if (!anime)
     {
         AllVolumes = data.AllVolumes;
     }
     Title     = data.Title;
     Type      = data.Type;
     Status    = data.Status;
     Synopsis  = data.Synopsis;
     ImgUrl    = data.ImgUrl;
     AnimeMode = anime;
 }
Beispiel #6
0
 public AnimeSearchItem(AnimeGeneralDetailsData data, bool anime = true) : this()
 {
     _item       = data;
     Id          = data.Id;
     GlobalScore = data.GlobalScore;
     AllEpisodes = data.AllEpisodes;
     if (!anime)
     {
         AllVolumes = data.AllVolumes;
     }
     Title               = data.Title;
     Type                = data.Type;
     Status              = data.Status;
     TxtType.Text        = Type;
     TxtTitle.Text       = Title;
     TxtGlobalScore.Text = GlobalScore.ToString("N2");
     TxtSynopsis.Text    = data.Synopsis;
     Img.Source          = new BitmapImage(new Uri(data.ImgUrl));
     WatchedEps.Text     = $"{(anime ? "Episodes" : "Chapters")} : {AllEpisodes}";
     _animeMode          = anime;
 }
Beispiel #7
0
        public async Task <List <AnimeGeneralDetailsData> > GetSearchResults()
        {
            var output = new List <AnimeGeneralDetailsData>();

            var raw = await GetRequestResponse();

            if (string.IsNullOrEmpty(raw))
            {
                return(output);
            }
            raw = WebUtility.HtmlDecode(raw);
            switch (CurrentApiType)
            {
            case ApiType.Mal:
                try
                {
                    var parsed = XElement.Parse(raw.Replace("&", ""));     //due to unparasable stuff returned by mal
                    foreach (var element in parsed.Elements("entry"))
                    {
                        var item = new AnimeGeneralDetailsData();
                        item.ParseXElement(element, true, Settings.PreferEnglishTitles);
                        output.Add(item);
                    }
                }
                catch (Exception)
                {
                    //mal can throw html in synopisis and xml cannot do much
                }

                break;

            case ApiType.Hummingbird:
                dynamic jsonObj = JsonConvert.DeserializeObject(raw);
                foreach (var entry in jsonObj)
                {
                    try
                    {
                        var allEps = 0;
                        if (entry.episode_count != null)
                        {
                            allEps = Convert.ToInt32(entry.episode_count.ToString());
                        }
                        output.Add(new AnimeGeneralDetailsData
                        {
                            Title       = entry.title.ToString(),
                            ImgUrl      = entry.cover_image.ToString(),
                            Type        = entry.show_type.ToString(),
                            Id          = Convert.ToInt32(entry.id.ToString()),
                            MalId       = Convert.ToInt32(entry.mal_id.ToString()),
                            AllEpisodes = allEps,
                            StartDate   = "0000-00-00",   //TODO : Do sth
                            EndDate     = "0000-00-00",
                            Status      = entry.status.ToString(),
                            Synopsis    = entry.synopsis.ToString(),
                            GlobalScore = float.Parse(entry.community_rating.ToString()),
                            Synonyms    = new List <string>()
                        });
                    }
                    catch (Exception e)
                    {
                    }
                }

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(output);
        }
        public async void SubmitQuery(string query)
        {
            if (query == PrevQuery)
            {
                return;
            }
            PrevQuery             = query;
            Loading               = Visibility.Visible;
            EmptyNoticeVisibility = Visibility.Collapsed;
            AnimeSearchItems.Clear();
            var data = new List <AnimeGeneralDetailsData>();

            _filters.Clear();
            _allAnimeSearchItems = new List <AnimeSearchItem>();
            if (_animeSearch)
            {
                await
                Task.Run(
                    async() =>
                    data = await new AnimeSearchQuery(Utils.CleanAnimeTitle(query)).GetSearchResults());

                try
                {
                    foreach (var item in data)
                    {
                        var type = item.Type;
                        _allAnimeSearchItems.Add(new AnimeSearchItem(item));
                        if (!_filters.Contains(type))
                        {
                            _filters.Add(type);
                        }
                    }
                }
                catch (Exception) //if MAL returns nothing it returns unparsable xml ...
                {
                    EmptyNoticeVisibility = Visibility.Visible;
                }
            }
            else // manga search
            {
                var response = "";
                await
                Task.Run(
                    async() =>
                    response = await new MangaSearchQuery(Utils.CleanAnimeTitle(query)).GetRequestResponse());

                try
                {
                    var parsedData = XDocument.Parse(response);
                    foreach (var item in parsedData.Element("manga").Elements("entry"))
                    {
                        var type      = item.Element("type").Value;
                        var mangaData = new AnimeGeneralDetailsData();
                        mangaData.ParseXElement(item, false);
                        _allAnimeSearchItems.Add(new AnimeSearchItem(mangaData, false));
                        if (!_filters.Contains(type))
                        {
                            _filters.Add(type);
                        }
                    }
                }
                catch (Exception) //if MAL returns nothing it returns unparsable xml ...
                {
                    EmptyNoticeVisibility = Visibility.Visible;
                }
            }
            ViewModelLocator.Main.PopulateSearchFilters(_filters);
            PopulateItems();
            Loading = Visibility.Collapsed;
        }
Beispiel #9
0
        public async Task <AnimeGeneralDetailsData> GetAnimeDetails(bool force, string id, string title, bool animeMode,
                                                                    ApiType?apiOverride = null)
        {
            var output = force ? null : await DataCache.RetrieveAnimeSearchResultsData(id, animeMode);

            if (output != null)
            {
                return(output);
            }

            var requestedApiType = apiOverride ?? CurrentApiType;

            try
            {
                switch (requestedApiType)
                {
                case ApiType.Mal:
                    string data = null;
                    if (!string.IsNullOrEmpty(title))
                    {
                        data = animeMode
                            ? await new AnimeSearchQuery(Utils.Utilities.CleanAnimeTitle(title), requestedApiType)
                               .GetRequestResponse()
                            : await new MangaSearchQuery(Utils.Utilities.CleanAnimeTitle(title)).GetRequestResponse();
                    }

                    if (string.IsNullOrEmpty(data) || !data.Contains(id))
                    {
                        //we are loading title from website because request came from mal url
                        var correctTitle = await AnimeTitleQuery.GetTitle(int.Parse(id), animeMode);

                        data = animeMode
                            ? await new AnimeSearchQuery(Utils.Utilities.CleanAnimeTitle(correctTitle), requestedApiType)
                               .GetRequestResponse()
                            : await new MangaSearchQuery(Utils.Utilities.CleanAnimeTitle(correctTitle)).GetRequestResponse();
                    }

                    data = WebUtility.HtmlDecode(data);

                    data = data.Replace("&", "");     //unparsable stuff ahaead :(
                    var parsedData = XDocument.Parse(data);

                    var elements = parsedData.Element(animeMode ? "anime" : "manga").Elements("entry");
                    var xmlObj   = elements.First(element => element.Element("id").Value == id);

                    output = new AnimeGeneralDetailsData();
                    output.ParseXElement(xmlObj, animeMode, Settings.PreferEnglishTitles);

                    DataCache.SaveAnimeSearchResultsData(id, output, animeMode);
                    break;

                case ApiType.Hummingbird:
                    Request =
                        WebRequest.Create(
                            Uri.EscapeUriString($"https://hummingbird.me/api/v1/anime/{id}"));
                    Request.ContentType = "application/x-www-form-urlencoded";
                    Request.Method      = "GET";

                    var raw = await GetRequestResponse();

                    if (string.IsNullOrEmpty(raw))
                    {
                        break;
                    }

                    dynamic jsonObj = JsonConvert.DeserializeObject(raw);
                    var     allEps  = 0;
                    if (jsonObj.episode_count != null)
                    {
                        allEps = Convert.ToInt32(jsonObj.episode_count.ToString());
                    }
                    output = new AnimeGeneralDetailsData
                    {
                        Title       = jsonObj.title.ToString(),
                        ImgUrl      = jsonObj.cover_image.ToString(),
                        Type        = jsonObj.show_type.ToString(),
                        Id          = Convert.ToInt32(jsonObj.id.ToString()),
                        MalId       = Convert.ToInt32(jsonObj.mal_id.ToString()),
                        AllEpisodes = allEps,
                        StartDate   = jsonObj.started_airing.ToString(),
                        EndDate     = jsonObj.finished_airing.ToString(),
                        Status      = jsonObj.status,
                        Synopsis    = jsonObj.synopsis,
                        GlobalScore = jsonObj.community_rating,
                        Synonyms    = new List <string> {
                            jsonObj.alternate_title.ToString()
                        }
                    };
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            catch (Exception e)
            {
                // todo android notification nav bug
                // probably MAl garbled response
            }

            return(output);
        }
        public async Task <List <AnimeGeneralDetailsData> > GetSearchResults()
        {
            var output = new List <AnimeGeneralDetailsData>();

            var raw = await GetRequestResponse();

            if (string.IsNullOrEmpty(raw))
            {
                return(output);
            }

            switch (CurrentApiType)
            {
            case ApiType.Mal:
                var parsed = XElement.Parse(raw);
                foreach (var element in parsed.Elements("entry"))
                {
                    var item = new AnimeGeneralDetailsData();
                    item.ParseXElement(element, true);
                    output.Add(item);
                }
                break;

            case ApiType.Hummingbird:
                dynamic jsonObj = JsonConvert.DeserializeObject(raw);
                foreach (var entry in jsonObj)
                {
                    try
                    {
                        var allEps = 0;
                        if (entry.episode_count != null)
                        {
                            allEps = Convert.ToInt32(entry.episode_count.ToString());
                        }
                        output.Add(new AnimeGeneralDetailsData
                        {
                            Title       = entry.title.ToString(),
                            ImgUrl      = entry.cover_image.ToString(),
                            Type        = entry.show_type.ToString(),
                            Id          = Convert.ToInt32(entry.id.ToString()),
                            MalId       = Convert.ToInt32(entry.mal_id.ToString()),
                            AllEpisodes = allEps,
                            StartDate   = AnimeItemViewModel.InvalidStartEndDate,   //TODO : Do sth
                            EndDate     = AnimeItemViewModel.InvalidStartEndDate,
                            Status      = entry.status.ToString(),
                            Synopsis    = entry.synopsis.ToString(),
                            GlobalScore = float.Parse(entry.community_rating.ToString()),
                            Synonyms    = new List <string>()
                        });
                    }
                    catch (Exception e)
                    {
                    }
                }

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(output);
        }
Beispiel #11
0
        public async Task <AnimeGeneralDetailsData> GetAnimeDetails(bool force, string id, string title, bool animeMode,
                                                                    ApiType?apiOverride = null)
        {
            var output = force ? null : await DataCache.RetrieveAnimeSearchResultsData(id, animeMode);

            if (output != null)
            {
                return(output);
            }

            var requestedApiType = apiOverride ?? CurrentApiType;

            switch (requestedApiType)
            {
            case ApiType.Mal:
                var data = animeMode
                        ? await new AnimeSearchQuery(Utils.CleanAnimeTitle(title)).GetRequestResponse(false)
                        : await new MangaSearchQuery(Utils.CleanAnimeTitle(title)).GetRequestResponse(false);
                data = WebUtility.HtmlDecode(data);
                data = data.Replace("&mdash", "").Replace("&rsquo", "").Replace("&", "");

                var parsedData = XDocument.Parse(data);

                var elements = parsedData.Element(animeMode ? "anime" : "manga").Elements("entry");
                var xmlObj   = elements.First(element => element.Element("id").Value == id);

                output = new AnimeGeneralDetailsData();
                output.ParseXElement(xmlObj, animeMode);

                DataCache.SaveAnimeSearchResultsData(id, output, animeMode);
                break;

            case ApiType.Hummingbird:
                Request =
                    WebRequest.Create(
                        Uri.EscapeUriString($"https://hummingbird.me/api/v1/anime/{id}"));
                Request.ContentType = "application/x-www-form-urlencoded";
                Request.Method      = "GET";

                var raw = await GetRequestResponse();

                if (string.IsNullOrEmpty(raw))
                {
                    break;
                }

                dynamic jsonObj = JsonConvert.DeserializeObject(raw);
                var     allEps  = 0;
                if (jsonObj.episode_count != null)
                {
                    allEps = Convert.ToInt32(jsonObj.episode_count.ToString());
                }
                output = new AnimeGeneralDetailsData
                {
                    Title       = jsonObj.title.ToString(),
                    ImgUrl      = jsonObj.cover_image.ToString(),
                    Type        = jsonObj.show_type.ToString(),
                    Id          = Convert.ToInt32(jsonObj.id.ToString()),
                    MalId       = Convert.ToInt32(jsonObj.mal_id.ToString()),
                    AllEpisodes = allEps,
                    StartDate   = jsonObj.started_airing.ToString(),
                    EndDate     = jsonObj.finished_airing.ToString(),
                    Status      = jsonObj.status,
                    Synopsis    = jsonObj.synopsis,
                    GlobalScore = jsonObj.community_rating,
                    Synonyms    = new List <string> {
                        jsonObj.alternate_title.ToString()
                    }
                };
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }


            return(output);
        }
        public async void SubmitQuery(string query)
        {
            if (string.IsNullOrEmpty(query) || query == PrevQuery || query.Length < 2)
            {
                IsFirstVisitGridVisible = false;
                EmptyNoticeVisibility   = false;
                return;
            }

            IsFirstVisitGridVisible = false;
            PrevQuery             = query;
            Loading               = true;
            EmptyNoticeVisibility = false;
            AnimeSearchItemViewModels.Clear();
            var data = new List <AnimeGeneralDetailsData>();

            _filters.Clear();
            _allAnimeSearchItemViewModels = new List <AnimeSearchItemViewModel>();
            if (_animeSearch)
            {
                await
                Task.Run(
                    async() =>
                    data = await new AnimeSearchQuery(Utils.Utilities.CleanAnimeTitle(query)).GetSearchResults());

                try
                {
                    foreach (var item in data)
                    {
                        var type = item.Type;
                        _allAnimeSearchItemViewModels.Add(new AnimeSearchItemViewModel(item));
                        if (!_filters.Contains(type))
                        {
                            _filters.Add(type);
                        }
                    }
                }
                catch (Exception) //if MAL returns nothing it returns unparsable xml ...
                {
                    //will display empty notice
                }
            }
            else // manga search
            {
                var response = "";
                await
                Task.Run(
                    async() =>
                    response = await new MangaSearchQuery(Utils.Utilities.CleanAnimeTitle(query)).GetRequestResponse());

                try
                {
                    response = WebUtility.HtmlDecode(response);
                    var parsedData = XDocument.Parse(response.Replace("&", "")); //due to unparasable stuff returned by mal);
                    foreach (var item in parsedData.Element("manga").Elements("entry"))
                    {
                        var type      = item.Element("type").Value;
                        var mangaData = new AnimeGeneralDetailsData();
                        mangaData.ParseXElement(item, false, Settings.PreferEnglishTitles);
                        _allAnimeSearchItemViewModels.Add(new AnimeSearchItemViewModel(mangaData, false));
                        if (!_filters.Contains(type))
                        {
                            _filters.Add(type);
                        }
                    }
                }
                catch (Exception) //if MAL returns nothing it returns unparsable xml ...
                {
                    //will display empty notice
                }
            }
            ViewModelLocator.GeneralMain.PopulateSearchFilters(_filters);
            PopulateItems();
            Loading = false;
        }