private async Task <EpisodeInfo> ParsingLineInTable(HtmlElement element) { var subjectElement = FindElement("td", "subject", parents: element); if (subjectElement != null) { // 링크가 2개 나옴, 카테고리 | 제목 var links = subjectElement.GetElementsByTagName("a"); if (links != null && links.Count >= 2) { var subject = links[1].InnerText; Console.WriteLine("[Subject]" + subject); var magneticLinkElement = FindElement("td", "num", parents: element); if (magneticLinkElement != null) { string magnet = string.Empty; var result = await GetPageAsync((document) => { // 네비게이팅 설정 void Navigating(object sender, WebBrowserNavigatingEventArgs e) { // 주소에 마그넷이 있는지 확인 if (e.Url.OriginalString.Contains("magnet:")) { // 마그넷 정보를 담고, 클린 처리 magnet = e.Url.OriginalString; _browser.Navigating -= Navigating; e.Cancel = true; } } _browser.Navigating += Navigating; // 마그넷 링크를 클릭한다. var linkElement = magneticLinkElement.GetElementsByTagName("a"); linkElement[0].InvokeMember("click"); }, (document) => string.IsNullOrEmpty(magnet) == false); if (result == PageAsyncResult.None) { return(EpisodeInfo.Create(subject, magnet)); } else { MessageBox.Show("Time Out?"); } } } } return(null); }
// feeds에 모든 RSS 피드를 채워 넣음 public async void UpdateRSS() { _feeds = new List <SyndicationItem>(); Log.WriteLine("Updating RSS..."); // 리스트를 클로닝 해서 처리한다, 다른 스레드에서 리스트를 업뎃 할수 있기에 var rssList = new List <string>(Preference.Instance.RSSList); foreach (var uri in rssList) { var xmlstring = await RequestXMLString(uri); if (string.IsNullOrEmpty(xmlstring) == false) { Regex regex = new Regex(@"&(?![a-z]{2,5};)"); xmlstring = regex.Replace(xmlstring, "&"); // for Debuging //Debug_SaveXml("testRSS.xml"); try { using (XmlReader reader = XmlReader.Create(new StringReader(xmlstring))) { SyndicationFeed feed = SyndicationFeed.Load(reader); reader.Close(); Log.WriteLine(" '{0}' Found Feeds({1})...", uri, feed.Items.Count()); foreach (SyndicationItem item in feed.Items) { _feeds.Add(item); //Console.WriteLine("{0}, {1}", item.Title.Text, item.Links[0].Uri); } } } catch (Exception e) { Log.Error(e.Message); } } } // 성공적으로 새로운 Feed들을 가져왔다면 // 정보들을 서버로 다시 전송해준다. HttpInterface http = null; if (_http.TryGetTarget(out http) && _feeds.Count > 0) { Log.WriteLine("Request to store feeds to server"); var episodes = new List <EpisodeInfo>(_feeds.Count); foreach (var feed in _feeds) { episodes.Add(EpisodeInfo.Create(feed.Title.Text, feed.Links[0].Uri.ToString())); } string rest = "/store_feeds"; var errorCode = await http.RequestWithTimeout <List <EpisodeInfo>, string>(rest, episodes); Console.WriteLine("[{0}] {1}", rest, errorCode ?? "Not found error code"); } }