public TRssItemCollection DownloadItems() { WebClient CurrentClient = new WebClient(); CurrentClient.Headers.Add("user-agent", "RssWatcher/1.0"); string XmlString = Encoding.Default.GetString(Encoding.GetEncoding("ISO-8859-1").GetBytes(new StreamReader(CurrentClient.OpenRead(Link), Encoding.GetEncoding("ISO-8859-1")).ReadToEnd())); XDocument SourceXml; try { SourceXml = XDocument.Parse(XmlString, LoadOptions.PreserveWhitespace); RssItems = new TRssItemCollection(SourceXml.Element("rss").Element("channel").Elements("item")); } catch { RssItems = new TRssItemCollection(); } if (DownloadCompleted != null) { DownloadCompleted(this, EventArgs.Empty); } return(RssItems); }
public void DownloadItems() { try { Trace.WriteLine(string.Format("Downloading items for channel {0} ...", Title)); Trace.Indent(); WebClient CurrentClient = new WebClient(); CurrentClient.Headers.Add("user-agent", "RssWatcher/1.0"); byte[] Data = CurrentClient.DownloadData(Link.Value); #region Discover the encoding if (ChannelEncoding == null || string.IsNullOrWhiteSpace(ChannelEncoding.WebName)) { string ContentType = CurrentClient.ResponseHeaders.Get("Content-Type"); string[] ContentTypeItems = ContentType.Split(';'); SplitArgs oArgs = new SplitArgs(ContentTypeItems); ChannelEncoding = Encoding.GetEncoding(oArgs.GetValue <string>("charset", DefaultChannelEncoding)); } Trace.WriteLine(string.Format("Encoding for {0} : {1}", Name, ChannelEncoding.WebName)); #endregion Discover the encoding #region If content is gzipped, then decompress string ContentEncoding = CurrentClient.ResponseHeaders.Get("Content-Encoding"); if (!string.IsNullOrWhiteSpace(ContentEncoding) && ContentEncoding.ToLower() == "gzip") { using (MemoryStream TempStream = new MemoryStream()) { using (GZipStream CompressedStream = new GZipStream(new MemoryStream(Data), CompressionMode.Decompress)) { CompressedStream.CopyTo(TempStream); } TempStream.Flush(); Data = new byte[TempStream.Length]; Buffer.BlockCopy(TempStream.GetBuffer(), 0, Data, 0, (int)TempStream.Length); } } #endregion If content is gzipped, then decompress #region Read and parse the data XDocument SourceXml; try { #region Skip the BOM code if it exists string TempXml = ChannelEncoding.GetString(Data); if (TempXml.IndexOf('<') > 0) { TempXml = TempXml.Substring(TempXml.IndexOf("<")); } #endregion Skip the BOM code if it exists SourceXml = XDocument.Parse(TempXml); XElement XChannel = SourceXml.Element("rss").Element("channel"); TItemCollection TempItems = new TItemCollection(XChannel.Elements("item")); DateTime TempLastBuildDate = LastBuildDate; Trace.WriteLine(string.Format("Found {0} item(s)", TempItems.Count)); List <TItem> NewItems = TempItems.Where(i => i.PubDate > LastBuildDate).ToList(); Trace.WriteLine(string.Format("{0} new item(s)", NewItems.Count)); foreach (TItem ItemItem in NewItems) { if (ItemItem.PubDate > TempLastBuildDate) { TempLastBuildDate = ItemItem.PubDate; } Items.Add(ItemItem); } LastBuildDate = TempLastBuildDate; Description = XChannel.SafeReadElementValue <string>("description", ""); if (XChannel.Elements().Any(x => x.Name == "image")) { Picture = new TChannelImage(XChannel.SafeReadElement("image")); } if (XChannel.Elements().Any(x => x.Name == "category")) { Category = XChannel.SafeReadElementValue <string>("category", ""); } if (XChannel.Elements().Any(x => x.Name == "language")) { Language = XChannel.SafeReadElementValue <string>("language", ""); } if (XChannel.Elements().Any(x => x.Name == "copyright")) { Copyright = XChannel.SafeReadElementValue <string>("copyright", ""); } Title = XChannel.SafeReadElementValue <string>("title", ""); } catch (Exception ex) { Trace.WriteLine(string.Format("Error while reading items for channel {0} : {1}", Name, ex.Message), Severity.Error); } #endregion Read and parse the data if (DownloadCompleted != null) { ItemsDownloadedEventArgs Args = new ItemsDownloadedEventArgs(Data, CurrentClient.ResponseHeaders, Encoding.UTF8.GetString(Data)); DownloadCompleted(this, Args); } return; } finally { Trace.Unindent(); Trace.WriteLine("Done."); } }