diff --git a/Controllers/ValuesController.cs b/Controllers/ValuesController.cs index c90cf1b..d6c5ea6 100644 --- a/Controllers/ValuesController.cs +++ b/Controllers/ValuesController.cs @@ -17,6 +17,7 @@ namespace jezebel.Controllers { IMemoryCache cache; const string jezCache = "jezebelRss"; + HashSet urls = new HashSet() { "http://jezebel.com/rss", "http://pictorial.jezebel.com/rss", "http://themuse.jezebel.com/rss", "http://thatswhatshesaid.jezebel.com/rss", "http://theslot.jezebel.com/rss" }; public ValuesController(IMemoryCache cache) { @@ -28,12 +29,20 @@ namespace jezebel.Controllers { using (var httpClient = new HttpClient()) { - var result = cache.Get(jezCache); + + var result = cache.Get>(jezCache); if(result == null || bypassCache) { - var rssRaw = await httpClient.GetStreamAsync("http://jezebel.com/rss"); - var xmlReader = new XmlSerializer(typeof(Rss)); - result = (Rss)xmlReader.Deserialize(rssRaw); + var lst = new System.Collections.Concurrent.ConcurrentBag(); + Parallel.ForEach(urls, url => + { + var rssRaw = httpClient.GetStreamAsync(url).Result; + var xmlReader = new XmlSerializer(typeof(Rss)); + var rssDeserialized = (Rss)xmlReader.Deserialize(rssRaw); + rssDeserialized.Channel.Items.ForEach(a => lst.Add(a)); + }); + + result = lst.Where(a => !a.Category.Any(b => b.Text.Contains("deals"))).Distinct(new Item()).ToList(); using (var entry = cache.CreateEntry(jezCache)) { entry.SetValue(result); @@ -43,8 +52,8 @@ namespace jezebel.Controllers } var rng = new Random(); - var randomArticleNumber = rng.Next(0, result.Channel.Items.Count); - var randomArticle = result.Channel.Items[randomArticleNumber]; + var randomArticleNumber = rng.Next(0, result.Count); + var randomArticle = result[randomArticleNumber]; var resultString = $"{randomArticle.Title} by {randomArticle.Creator} {randomArticle.Link}"; return new ContentResult() { Content = resultString, ContentType = "text", StatusCode = 200 }; diff --git a/Rss.cs b/Rss.cs index f4f8b5c..4782b77 100644 --- a/Rss.cs +++ b/Rss.cs @@ -34,7 +34,7 @@ namespace jezebel } [XmlRoot(ElementName = "item")] - public class Item + public class Item : IEqualityComparer { [XmlElement(ElementName = "title")] public string Title { get; set; } @@ -50,6 +50,16 @@ namespace jezebel public Guid Guid { get; set; } [XmlElement(ElementName = "creator", Namespace = "http://purl.org/dc/elements/1.1/")] public string Creator { get; set; } + + public bool Equals(Item x, Item y) + { + return x.Title.Equals(y.Title); + } + + public int GetHashCode(Item obj) + { + return obj.Title.GetHashCode(); + } } [XmlRoot(ElementName = "channel")]