private View RecomItemDelegate(int i, DirectRecommendationData animeReviewData, View convertView) { var view = convertView; FlowTextView txt = null; if (view == null) { view = MainActivity.CurrentContext.LayoutInflater.Inflate(Resource.Layout.AnimeRecomItem,null); txt = view.FindViewById<FlowTextView>(Resource.Id.AnimeRecomItemRecomContent); txt.TextColor = ResourceExtension.BrushText; txt.SetTypeface(Typeface.Create(Typeface.Default, TypefaceStyle.Normal)); txt.SetTextSize(_pixelSize); } view.Tag = new JavaObjectWrapper<DirectRecommendationData>(animeReviewData); view.FindViewById<TextView>(Resource.Id.AnimeRecomItemShowTitle).Text = animeReviewData.Title; view.FindViewById<TextView>(Resource.Id.AnimeRecomItemShowType).Text = animeReviewData.Type.ToString(); txt = txt ?? view.FindViewById<FlowTextView>(Resource.Id.AnimeRecomItemRecomContent); txt.Text = animeReviewData.Description; var img = view.FindViewById<ImageViewAsync>(Resource.Id.AnimeRecomItemImage); ImageService.Instance.LoadUrl(animeReviewData.ImageUrl).FadeAnimation(true, true).Into(img); return view; }
public async Task<List<DirectRecommendationData>> GetDirectRecommendations(bool force = false) { var output = force ? new List<DirectRecommendationData>() : await DataCache.RetrieveDirectRecommendationData(_animeId, _animeMode) ?? new List<DirectRecommendationData>(); if (output.Count != 0) return output; var raw = await GetRequestResponse(false); if (string.IsNullOrEmpty(raw)) return null; var doc = new HtmlDocument(); doc.LoadHtml(raw); try { var recommNodes = doc.DocumentNode.Descendants("div") .Where( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#DirectRecomm:recommNode:class"]).Take(Settings.RecommsToPull); foreach (var recommNode in recommNodes) { try { var current = new DirectRecommendationData(); var tds = recommNode.Descendants("td").Take(2).ToList(); var img = tds[0].Descendants("img").First().Attributes["data-src"].Value; if (!img.Contains("questionmark")) { img = Regex.Replace(img, @"\/r\/\d+x\d+", ""); current.ImageUrl = img.Substring(0, img.IndexOf('?')); } current.Description = WebUtility.HtmlDecode(tds[1].Descendants("div").First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#DirectRecomm:recommNode:descClass"]) .Descendants("div") .First().InnerText.Trim().Replace(" ", "").Replace("read more", "")); current.Description = current.Description.Substring(0, current.Description.Length - 1); var titleNode = tds[1].ChildNodes[3].Descendants("a").First(); current.Title = titleNode.Descendants("strong").First().InnerText.Trim(); var link = titleNode.Attributes["href"].Value.Split('/'); current.Id = Convert.ToInt32(link[2]); current.Type = link[1] == "anime" ? RelatedItemType.Anime : link[1] == "manga" ? RelatedItemType.Manga : RelatedItemType.Unknown; output.Add(current); } catch (Exception) { //who knows...raw html is scary } } } catch (Exception) { //something we wrong } DataCache.SaveDirectRecommendationsData(_animeId, output, _animeMode); return output; }