Пример #1
0
 public RssNewsController(LocaleFallback localeFallback, RssNewsContext dbContext, ILogger <RssNewsController> logger)
 {
     _localeFallback = localeFallback;
     _dbContext      = dbContext;
     _logger         = logger;
 }
        private async Task CheckForNews(RssNewsContext rssNewsContext, LastUpdateContext lastUpdateContext)
        {
            var updateNeeded = await this.CheckIfUpdateNeeded(lastUpdateContext);

            if (updateNeeded)
            {
                var feedUrl = string.Format(_feedUrl, _locale, _country);

                _logger.LogDebug($"Checking feed from: {feedUrl}");

                var feed = await FeedReader.ReadAsync(feedUrl);

                _logger.LogDebug($"Found {feed.Items.Count} items in feed.");

                var addCnt = 0;
                foreach (var item in feed.Items)
                {
                    // prevent duplicates if ID has changed
                    if (await rssNewsContext.News.FirstOrDefaultAsync(w => w.Id == item.Id || w.Link == item.Link) != null)
                    {
                        continue;
                    }

                    // news missing -- needs to be inserted

                    _logger.LogDebug($"Parsing news {item.Title}::{item.PublishingDateString}");

                    if (item.PublishingDate.HasValue && item.PublishingDate < DateTime.UtcNow.AddDays(-_settings.RetentionInDays))
                    {
                        _logger.LogDebug("News too old, skipping.");
                        continue;
                    }

                    var mrssItem = item.SpecificItem as MediaRssFeedItem;

                    byte[] img    = null;
                    var    endUrl = await this.CheckForRedirectsAsync(item.Link);

                    if (endUrl != null)
                    {
                        img = await this.GetThumbnail(endUrl);
                    }

                    rssNewsContext.News.Add(new Model.RssNews
                    {
                        Id         = item.Id,
                        FeedId     = FeedId,
                        Date       = item.PublishingDate.HasValue ? item.PublishingDate.Value.ToUniversalTime() : DateTime.UtcNow,
                        Title      = item.Title,
                        Link       = item.Link,
                        EndUrl     = endUrl,
                        ImageData  = img,
                        SourceName = mrssItem?.Source?.Value,
                        SourceUrl  = mrssItem?.Source?.Url,
                    });
                    addCnt++;

                    // break after adding some news
                    if (addCnt == _settings.MaxNewsInsertAtOnce)
                    {
                        break;
                    }
                }

                if (addCnt > 0)
                {
                    rssNewsContext.SaveChanges();
                }
                _logger.LogInformation($"Added {addCnt} news in the database");

                // set last update to now
                var entity = await lastUpdateContext.LastUpdates.AsNoTracking().SingleAsync(x => x.Id == FeedId);

                entity.Date = DateTime.UtcNow;
                lastUpdateContext.Update(entity);
                await lastUpdateContext.SaveChangesAsync();
            }
        }