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 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 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(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(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); _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; }
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: var data = animeMode ? await new AnimeSearchQuery(Utilities.CleanAnimeTitle(title),requestedApiType).GetRequestResponse(false) : await new MangaSearchQuery(Utilities.CleanAnimeTitle(title)).GetRequestResponse(false); 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); 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) { // probably MAl garbled response } return output; }
private void ExtractData(AnimeGeneralDetailsData data) { Title = _animeItemReference?.Title ?? data.Title; Type = data.Type; Status = data.Status; Synopsis = data.Synopsis; StartDate = data.StartDate; EndDate = data.EndDate; GlobalScore = data.GlobalScore; _imgUrl = data.ImgUrl; if (Settings.SelectedApiType == ApiType.Hummingbird) MalId = data.MalId; _synonyms = data.Synonyms; _synonyms = _synonyms.Where(s => !string.IsNullOrWhiteSpace(s)).ToList(); for (var i = 0; i < _synonyms.Count; i++) _synonyms[i] = Regex.Replace(_synonyms[i], @" ?\(.*?\)", string.Empty); //removes string from brackets (sthsth) lol -> lol AllEpisodes = data.AllEpisodes; if (!AnimeMode) { AllVolumes = data.AllVolumes; var vm = _animeItemReference as AnimeItemViewModel; if (vm != null) { vm.UpdateChapterData(data.AllEpisodes); } } PopulateData(); }
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); 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; }