public void NavigateLandingPage(RssData data) { _navigationService.NavigateAsync(nameof(NewLandingPage), new NavigationParameters { { "url", data.Link } }); }
/// <summary> /// Reads the RSS feed /// </summary> /// <returns>True if read was successful, else False</returns> public bool ReadRssFeed() { try { WebRequest request = WebRequest.Create(RssFeedChannel); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); XmlDocument doc = new XmlDocument(); if (responseStream != null) { doc.Load(responseStream); } XmlNodeList rssItems = doc.SelectNodes("rss/channel/item"); int count = 0; if (rssItems != null) { foreach (XmlNode item in rssItems) { if (RssFeedItemLimit > 0 && count == RssFeedItemLimit) { break; } Dictionary <string, string> record = new Dictionary <string, string>(); foreach (string field in RssFields) { XmlNode node = item.SelectSingleNode(field); string text = (node != null) ? node.InnerText : ""; if (field == "pubDate") { DateTime dt = DateTime.Parse(text); text = dt.ToLocalTime().ToString("yyyy-MM-dd hh:mm:ss"); } record[field] = text; } RssData.Add(record); count++; } } if (responseStream != null) { responseStream.Close(); } return(true); } catch (Exception) { return(false); } }
public async Task StartJob() { bool existeNoticiaNova = false; string feed = null; var existingList = Barrel.Current.Get <List <RssData> >(_key) ?? new List <RssData>(); using (var client = new HttpClient()) { feed = await client.GetStringAsync("https://medium.com/feed/@bertuzzi"); } var parser = new RssParser(); var rss = parser.Parse(feed).OrderByDescending(e => e.PublishDate).ToList();; if (feed != null) { foreach (var rssSchema in rss) { var isExist = existingList.Any(e => e.Guid == rssSchema.InternalID); var rssdata = new RssData { Title = rssSchema.Title, PubDate = rssSchema.PublishDate, Link = rssSchema.FeedUrl, Guid = rssSchema.InternalID, Author = rssSchema.Author, Thumbnail = string.IsNullOrWhiteSpace(rssSchema.ImageUrl) ? $"https://placeimg.com/80/80/nature" : rssSchema.ImageUrl, Description = rssSchema.Summary }; if (!isExist) { //Se Existiu alguma noticia nova, pelo menos 1 vez existeNoticiaNova = true; existingList.Add(rssdata); } } if (existeNoticiaNova) { MessagingCenter.Send(existingList, "Update"); } } existingList = existingList.OrderByDescending(e => e.PubDate).ToList(); Barrel.Current.Add(_key, existingList, TimeSpan.FromDays(30)); }
public bool GetIsRead(string id) { try { using (var db = new RssData()) { var idNumber = Convert.ToInt32(id); var item = db.ReadHistories.SingleOrDefault(rh => rh.Id == idNumber); return item != null; } } catch (Exception) { return false; } }
public void SetRssReadStatus(int id) { using (var db = new RssData()) { var readHistory = db.ReadHistories.SingleOrDefault(rh => rh.Id == id); if (readHistory == null) { db.ReadHistories.Add(new ReadHistory {Id = id, ReadDate = DateTime.Now}); } else { db.ReadHistories.Remove(readHistory); } db.SaveChanges(); } }
public List <RssData> GetEpisodes(int count, int start = 0) //count determines number of episodes to display, start determines where to begin (default 0) //currently only supports one RSS feed { XmlDocument doc = new XmlDocument(); doc.Load(_context.Podcasts.FirstOrDefault().Feed); XmlElement root = doc.DocumentElement; XmlNodeList nodes = root.SelectNodes("channel/item"); List <RssData> rssFeedData = new List <RssData>(); for (int i = start; i < count + start; i++) { RssData episode = new RssData(); try { episode.Title = nodes[i].SelectSingleNode("title").InnerText; episode.Image = nodes[i].SelectSingleNode("./*[name()='itunes:image']/@href").InnerText; episode.Link = nodes[i].SelectSingleNode("link").InnerText; episode.PubDate = nodes[i].SelectSingleNode("pubDate").InnerText.Substring(5, 11); episode.Audio = nodes[i].SelectSingleNode("enclosure/@url").InnerText; episode.AudioType = nodes[i].SelectSingleNode("enclosure/@type").InnerText; try { episode.Description = nodes[i].SelectSingleNode("./*[name()='itunes:summary']").InnerText; } catch { try { episode.Description = nodes[i].SelectSingleNode("description").InnerText; } catch { } } rssFeedData.Add(episode); } catch { } //no handling yet for any RSS feed entries without all of these attributes - would this ever happen for an actual episode? (as opposed to non-episode posts, which do appear in the feed) } return(rssFeedData); }
public bool VerifyRSS(string url) //verifies that the feed URL is valid by attempting to parse one episode { try { XmlDocument doc = new XmlDocument(); doc.Load(url); XmlElement root = doc.DocumentElement; XmlNodeList nodes = root.SelectNodes("channel/item"); List <RssData> rssFeedData = new List <RssData>(); RssData episode = new RssData(); try { episode.Title = nodes[0].SelectSingleNode("title").InnerText; episode.Image = nodes[0].SelectSingleNode("./*[name()='itunes:image']/@href").InnerText; episode.Link = nodes[0].SelectSingleNode("link").InnerText; episode.PubDate = nodes[0].SelectSingleNode("pubDate").InnerText.Substring(5, 11); episode.Audio = nodes[0].SelectSingleNode("enclosure/@url").InnerText; episode.AudioType = nodes[0].SelectSingleNode("enclosure/@type").InnerText; try { episode.Description = nodes[0].SelectSingleNode("./*[name()='itunes:summary']").InnerText; } catch { try { episode.Description = nodes[0].SelectSingleNode("description").InnerText; } catch { } } } catch { } } catch { return(false); } return(true); }
//Task OnRetry(Exception e, int retryCount) //{ // return Task.Factory.StartNew(() => // { // var mensagem = $"Ocorreu um erro ao baixar os dados: {e.Message}, tentando novamente ({retryCount}).."; // _eventAggregator.GetEvent<MessageSentEvent>().Publish(mensagem); // Console.WriteLine(mensagem); // }); //} //public async Task<string> ObterRSSOnRetry() //{ // var httpClient = new HttpClient(); // var response = await httpClient.GetAsync("https://medium.com/feed/@bertuzzi"); // return await response.Content.ReadAsStringAsync(); //} public async Task <List <RssData> > ObterRSS() { string feed = null; List <RssData> rssRetorno = new List <RssData>(); int cont = 0; try { using (var client = new HttpClient()) { await Policy // .Handle<HttpRequestException>(ex => !ex.Message.ToLower().Contains("404")) .Handle <HttpRequestException>() .WaitAndRetryAsync ( retryCount: 3, sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), onRetry: (ex, time) => { cont++; var mensagem = $"Ocorreu um erro ao baixar os dados: {ex.Message}, tentando novamente ({cont}).."; _eventAggregator.GetEvent <MessageSentEvent>().Publish(mensagem); Console.WriteLine(mensagem); } ) .ExecuteAsync(async() => { Console.WriteLine($"Obtendo rss..."); feed = await client.GetStringAsync("https://medium.com/feed/@bertuzzi"); }); } //var func = new Func<Task<string>>(() => ObterRSSOnRetry()); //feed = await _networkService.Retry<string>(func, 3, OnRetry); var parser = new RssParser(); var rss = parser.Parse(feed).OrderByDescending(e => e.PublishDate).ToList(); if (feed != null) { foreach (var rssSchema in rss) { var rssdata = new RssData { Title = rssSchema.Title, PubDate = rssSchema.PublishDate, Link = rssSchema.FeedUrl, Guid = rssSchema.InternalID, Author = rssSchema.Author, Thumbnail = string.IsNullOrWhiteSpace(rssSchema.ImageUrl) ? $"https://placeimg.com/80/80/nature" : rssSchema.ImageUrl, Description = rssSchema.Summary }; rssRetorno.Add(rssdata); } } return(rssRetorno); } catch (Exception ex) { return(new List <RssData>()); } }
protected override void Prepare() { _context = new RssData(Alias + ".db"); }
public async Task <bool> StartJob() { bool existeNoticiaNova = false; string feed = null; try { var existingList = Barrel.Current.Get <List <RssData> >(_key) ?? new List <RssData>(); using (var client = new HttpClient()) { var timeoutPolicy = Policy.TimeoutAsync(15); HttpResponseMessage httpResponse = await timeoutPolicy .ExecuteAsync( async ct => await client.GetAsync("https://medium.com/feed/@bertuzzi", ct), CancellationToken.None ); feed = await httpResponse.Content.ReadAsStringAsync(); } var parser = new RssParser(); var rss = parser.Parse(feed).OrderByDescending(e => e.PublishDate).ToList(); if (feed != null) { foreach (var rssSchema in rss) { var isExist = existingList.Any(e => e.Guid == rssSchema.InternalID); var rssdata = new RssData { Title = rssSchema.Title, PubDate = rssSchema.PublishDate, Link = rssSchema.FeedUrl, Guid = rssSchema.InternalID, Author = rssSchema.Author, Thumbnail = string.IsNullOrWhiteSpace(rssSchema.ImageUrl) ? $"https://placeimg.com/80/80/nature" : rssSchema.ImageUrl, Description = rssSchema.Summary }; if (!isExist) { //Se Existiu alguma noticia nova, pelo menos 1 vez existeNoticiaNova = true; existingList.Add(rssdata); } } if (existeNoticiaNova) { MessagingCenter.Send(existingList, "Update"); } } existingList = existingList.OrderByDescending(e => e.PubDate).ToList(); Barrel.Current.Add(_key, existingList, TimeSpan.FromDays(30)); return(true); } catch (Exception ex) { return(false); } }