Ejemplo n.º 1
0
 public void NavigateLandingPage(RssData data)
 {
     _navigationService.NavigateAsync(nameof(NewLandingPage), new NavigationParameters
     {
         { "url", data.Link }
     });
 }
Ejemplo n.º 2
0
        /// <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);
            }
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
 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;
     }
 }
Ejemplo n.º 5
0
        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();
            }
        }
Ejemplo n.º 6
0
        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);
 }
Ejemplo n.º 8
0
        //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>());
            }
        }
Ejemplo n.º 9
0
 protected override void Prepare()
 {
     _context = new RssData(Alias + ".db");
 }
Ejemplo n.º 10
0
        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);
            }
        }