Esempio n. 1
0
        protected void ScrapRssFeed()
        {
            _logger.LogInformation("Starting scrapper");
            List <Episode>  episodes    = _database.GetAllEpisodes();
            List <Episode>  newEpisodes = new List <Episode>();
            SyndicationFeed feed        = null;

            try
            {
                using (var reader = XmlReader.Create(_configuration["RSSFeedURL"]))
                {
                    feed = SyndicationFeed.Load(reader);
                }
            }
            catch (Exception e)
            {
                SentrySdk.CaptureException(e);
            }

            if (feed != null)
            {
                foreach (var element in feed.Items)
                {
                    Episode episode = new Episode();
                    episode.Verified    = false;
                    episode.PublishedAt = element.PublishDate.LocalDateTime;
                    foreach (SyndicationElementExtension extension in element.ElementExtensions)
                    {
                        XElement ele = extension.GetObject <XElement>();
                        if (ele.Name.LocalName == "title")
                        {
                            episode.Title = ele.Value;
                        }
                        if (ele.Name.LocalName == "duration")
                        {
                            episode.Duration = TimeToInt(ele.Value);
                        }
                        if (ele.Name.LocalName == "explicit")
                        {
                            episode.Explicit = ele.Value == "yes" ? true : false;
                        }
                        if (ele.Name.LocalName == "episodeId")
                        {
                            episode.UUID = ele.Value;
                        }
                        if (ele.Name.LocalName == "episodeType")
                        {
                            episode.Type = ele.Value;
                        }
                        if (ele.Name.LocalName == "episode")
                        {
                            episode.EpisodeNumber = Int32.Parse(ele.Value);
                        }
                        if (ele.Name.LocalName == "image")
                        {
                            foreach (XAttribute attribute in ele.Attributes())
                            {
                                if (attribute.Name == "href")
                                {
                                    episode.Image = attribute.Value;
                                }
                            }
                        }
                        if (ele.Name.LocalName == "summary")
                        {
                            episode.Description = ele.Value;
                        }
                    }
                    // Only add episode if it is not in the database yet
                    if (episodes.FindIndex(x => x.UUID == episode.UUID) == -1 && newEpisodes.FindIndex(x => x.UUID == episode.UUID) == -1)
                    {
                        episode.CreatedAt = DateTime.Now;
                        episode.UpdatedAt = DateTime.Now;
                        _logger.LogInformation($"New episode detected (episodeNumber: {episode.Id})");
                        newEpisodes.Add(episode);
                    }
                }
            }
            _logger.LogInformation("Finished scrapper");

            if (newEpisodes.Count != 0)
            {
                _logger.LogInformation($"Inserting {newEpisodes.Count} new values into the database.");
                newEpisodes = newEpisodes.OrderBy(x => x.PublishedAt).ToList();
                try
                {
                    _database.AddEpisodes(newEpisodes);
                    _search.AddEpisodes(_database.GetAllNewEpisodes(newEpisodes));
                }
                catch (Exception e)
                {
                    SentrySdk.CaptureException(e);
                    _logger.LogCritical($"Error while inserting new episode into databse. Error:\n{e.Message}");
                }
                _logger.LogInformation($"Inserted {newEpisodes.Count} new values into the database.");
            }
        }