function aggregator_refresh

Checks a news feed for new items.

Parameters

$feed: An object describing the feed to be refreshed.

5 calls to aggregator_refresh()
aggregator_admin_refresh_feed in modules/aggregator/aggregator.admin.inc
Page callback: Refreshes a feed, then redirects to the overview page.
FeedParserTestCase::testAtomSample in modules/aggregator/aggregator.test
Tests a feed that uses the Atom format.
FeedParserTestCase::testHtmlEntitiesSample in modules/aggregator/aggregator.test
Tests a feed that uses HTML entities in item titles.
FeedParserTestCase::testRSS091Sample in modules/aggregator/aggregator.test
Tests a feed that uses the RSS 0.91 format.
UpdateFeedItemTestCase::testUpdateFeedItem in modules/aggregator/aggregator.test
Tests running "update items" from 'admin/config/services/aggregator' page.
2 string references to 'aggregator_refresh'
aggregator_cron_queue_info in modules/aggregator/aggregator.module
Implements hook_cron_queue_info().
hook_cron_queue_info in modules/system/system.api.php
Declare queues holding items that need to be run periodically.

File

modules/aggregator/aggregator.module, line 620

Code

function aggregator_refresh($feed) {
    // Store feed URL to track changes.
    $feed_url = $feed->url;
    // Fetch the feed.
    list($fetcher, $parser, $processors) = _aggregator_get_variables();
    $success = module_invoke($fetcher, 'aggregator_fetch', $feed);
    // We store the hash of feed data in the database. When refreshing a
    // feed we compare stored hash and new hash calculated from downloaded
    // data. If both are equal we say that feed is not updated.
    $hash = hash('sha256', $feed->source_string);
    if ($success && $feed->hash != $hash) {
        // Parse the feed.
        if (module_invoke($parser, 'aggregator_parse', $feed)) {
            // Update feed with parsed data.
            db_merge('aggregator_feed')->key(array(
                'fid' => $feed->fid,
            ))
                ->fields(array(
                'url' => $feed->url,
                'link' => empty($feed->link) ? $feed->url : $feed->link,
                'description' => empty($feed->description) ? '' : $feed->description,
                'image' => empty($feed->image) ? '' : $feed->image,
                'hash' => $hash,
                'etag' => empty($feed->etag) ? '' : $feed->etag,
                'modified' => empty($feed->modified) ? 0 : $feed->modified,
            ))
                ->execute();
            // Log if feed URL has changed.
            if ($feed->url != $feed_url) {
                watchdog('aggregator', 'Updated URL for feed %title to %url.', array(
                    '%title' => $feed->title,
                    '%url' => $feed->url,
                ));
            }
            watchdog('aggregator', 'There is new syndicated content from %site.', array(
                '%site' => $feed->title,
            ));
            drupal_set_message(t('There is new syndicated content from %site.', array(
                '%site' => $feed->title,
            )));
            // If there are items on the feed, let all enabled processors do their work on it.
            if (@count($feed->items)) {
                foreach ($processors as $processor) {
                    module_invoke($processor, 'aggregator_process', $feed);
                }
            }
        }
    }
    else {
        drupal_set_message(t('There is no new syndicated content from %site.', array(
            '%site' => $feed->title,
        )));
    }
    // Regardless of successful or not, indicate that this feed has been checked.
    db_update('aggregator_feed')->fields(array(
        'checked' => REQUEST_TIME,
        'queued' => 0,
    ))
        ->condition('fid', $feed->fid)
        ->execute();
    // Expire old feed items.
    if (function_exists('aggregator_expire')) {
        aggregator_expire($feed);
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.