private void HandleResult(int subjectTotalCount, DoubanResponse resp, Action action) { if (resp.RestResponse.StatusCode == HttpStatusCode.OK) { System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { action(); this.LoadMoreVisibility = this.SearchSubjectList.Count < subjectTotalCount ? Visibility.Visible : Visibility.Collapsed; this.OnPropertyChanged("LoadMoreVisibility"); this.OnPropertyChanged("SearchSubjectList"); this.IsBusy = false; }); } else if (SearchCompleted != null) { SearchCompleted(null, new DoubanSearchCompletedEventArgs() { IsSuccess = false }); } }
public void GetReview(string reviewId, Action<DoubanSubjectReview, DoubanResponse> action) { var feedsRequest = (HttpWebRequest)WebRequest.Create(string.Format(m_SubjectReviewUrl, reviewId)); feedsRequest.BeginGetResponse(r => { DoubanResponse doubanResp = new DoubanResponse(); try { var httpRequest = (HttpWebRequest)r.AsyncState; var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r); using (var reader = new StreamReader(httpResponse.GetResponseStream())) { DoubanSubjectReview review = new DoubanSubjectReview(); string content = reader.ReadToEnd(); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(content); HtmlNode root = doc.DocumentNode; List<HtmlNode> spanNodes = root.Descendants("span").Where(n => n.HasAttributes && n.Attributes.Contains("property")).ToList(); //标题 review.Title = m_ReviewTitleRegex.Match(content).Groups[1].Value; review.Title = m_HtmlTagRegex.Replace(review.Title, "").Replace("\n", "").Replace(" ", ""); //评论时间 review.Updated = m_ReviewDateRegex.Match(content).Groups[1].Value; //评分 review.Rating = new DoubanRating() { Average = spanNodes.Single(i => i.Attributes["property"].Value == "v:rating").InnerText }; //项目名称 review.SubjectTitle = m_ReviewItemRegex.Match(content).Groups[1].Value.Replace("\n", "").Replace(" ", ""); //作者 review.Author = new DoubanAuthor() { Name = m_ReviewerRegex.Match(content).Groups[1].Value }; IEnumerable<HtmlNode> imgs = doc.DocumentNode.Descendants("img").Where(n => n.HasAttributes && n.Attributes.Contains("class") && n.Attributes["class"].Value == "pil"); if (imgs.Count() > 0) { review.Author.Icon = imgs.ToList()[0].Attributes["src"].Value; } else//处理电影评论 { HtmlNode imgNode = doc.DocumentNode.DescendantNodes().SingleOrDefault(n => n.HasAttributes && n.Attributes.Contains("class") && n.Attributes["class"].Value == "main-avatar"); if (imgNode != null && imgNode.HasChildNodes) { review.Author.Icon = imgNode.Element("img").Attributes["src"].Value; } } //评论内容,去除html标记 string reviewContent = ""; HtmlNode desc = doc.GetElementbyId("link-report"); if (desc != null) { reviewContent = desc.InnerText; } review.Content = m_HtmlTagRegex.Replace(reviewContent, ""); doubanResp.RestResponse = new RestResponse() { StatusCode = httpResponse.StatusCode }; action(review, doubanResp); } } catch (Exception ex) { doubanResp.RestResponse.ErrorException = ex; doubanResp.RestResponse.StatusCode = HttpStatusCode.BadRequest; action(new DoubanSubjectReview(), doubanResp); } }, feedsRequest); }
private void GetTopics(DoubanGroupTopicSearch result, DoubanResponse resp, string listName, ObservableCollection<DoubanGroupTopic> list, string loadMoreName, EventHandler<DoubanSearchCompletedEventArgs> completedEvent) { if (resp.RestResponse.StatusCode == HttpStatusCode.OK && result.Topics.Count > 0) { System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { foreach (var item in result.Topics) { item.CommentsCount = item.CommentsCount + "回应"; list.Add(item); } int total = !string.IsNullOrEmpty(result.Total) ? int.Parse(result.Total) : 0; Visibility loadMore = (list.Count < total || result.HasMore) ? Visibility.Visible : Visibility.Collapsed; SetLoadMoreVisibility(loadMoreName, loadMore); this.OnPropertyChanged(listName); }); } else if (completedEvent != null) { System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { SetLoadMoreVisibility(loadMoreName, Visibility.Collapsed); completedEvent(this, new DoubanSearchCompletedEventArgs() { IsSuccess = false }); }); } }