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