Index: simplefeed.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/simplefeed/simplefeed.install,v retrieving revision 1.10.2.4 diff -u -F^f -r1.10.2.4 simplefeed.install --- simplefeed.install 12 Jun 2008 09:38:05 -0000 1.10.2.4 +++ simplefeed.install 26 Sep 2008 03:27:04 -0000 @@ -15,9 +15,11 @@ function simplefeed_install() { expires int NOT NULL default '0', refresh int NOT NULL default '0', checked int NOT NULL default '0', + error int(1) NOT NULL default '0', hash varchar(32), PRIMARY KEY (vid), - KEY nid (nid) + KEY nid (nid), + KEY error (error) ) /*!40100 DEFAULT CHARACTER SET UTF8 */ "); break; case 'pgsql': @@ -28,10 +30,12 @@ function simplefeed_install() { expires int NOT NULL default '0', refresh int NOT NULL default '0', checked int NOT NULL default '0', + error int(1) NOT NULL default '0', hash varchar(32), PRIMARY KEY (vid) )"); db_query("CREATE INDEX {simplefeed_feed}_nid_idx ON {simplefeed_feed} (nid)"); + db_query("CREATE INDEX {simplefeed_feed}_error_idx ON {simplefeed_feed} (nid)"); break; } @@ -50,6 +54,7 @@ function simplefeed_uninstall() { variable_del('simplefeed_vocab'); variable_del('simplefeed_categories'); variable_del('simplefeed_cron_throttle'); + variable_get('simplefeed_check_url'); } function simplefeed_update_1() { @@ -64,3 +69,15 @@ function simplefeed_update_2() { $ret[] = update_sql("ALTER TABLE {simplefeed_feed} CHANGE url url text"); return $ret; } + +function simplefeed_update_3() { + $ret = array(); + $ret[] = update_sql("ALTER TABLE {simplefeed_feed} ADD COLUMN error int(1) NOT NULL DEFAULT 0"); + if ($GLOBALS['db_type'] == 'pgsql') { + db_query("CREATE INDEX {simplefeed_feed}_error_idx ON {simplefeed_feed} (error)"); + } + else { + db_query("CREATE INDEX error ON {simplefeed_feed} (error)"); + } + return $ret; +} Index: simplefeed.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/simplefeed/simplefeed.module,v retrieving revision 1.44.2.13 diff -u -F^f -r1.44.2.13 simplefeed.module --- simplefeed.module 26 Sep 2008 01:13:52 -0000 1.44.2.13 +++ simplefeed.module 26 Sep 2008 03:27:04 -0000 @@ -190,6 +190,28 @@ function simplefeed_validate($node) { if ($duplicate != '' && $duplicate != $node->nid) { form_set_error('url', t('The URL entered already exists. Please try a different URL.')); } + + if (variable_get('simplefeed_check_url', 1)) { + include_once './'. drupal_get_path('module', 'simplefeed') .'/simplepie.inc'; + + // init simplepie and have it see if it can find a feed + $feed = new SimplePie(); + $feed->enable_cache(FALSE); + $feed->set_timeout(15); + + // prevent SimplePie from using all of it's data santization since we use Drupal's input formats to handle this + $feed->set_stupidly_fast(TRUE); + $feed->set_feed_url($node->url); + + // feed hasn't been added yet, so use a very low time setting + // FeedBurner requires this + header("If-Modified-Since:" . 1); + $success = $feed->init(); + + if (!$success) { + form_set_error('url', t('A feed could not be found at this URL. Please try a different URL.')); + } + } } else { form_set_error('url', t('The URL entered is not valid. It should be in the format of: %url_format', array('%url_format' => 'http://www.example.com/rss.xml'))); @@ -420,6 +442,17 @@ function simplefeed_admin_settings() { '#options' => $throttle, '#default_value' => variable_get('simplefeed_cron_throttle', 50), ); + + $form['simplefeed_check_url'] = array( + '#type' => 'select', + '#title' => t('Verify feed before adding to database'), + '#description' => t('This setting determines whether or not SimpleFeed should check to see if a feed exists at the URL provided. This can slow down adding feeds slightly since a feed has to be fetched and verified before the node can be created.'), + '#options' => array( + 0 => t('No'), + 1 => t('Yes'), + ), + '#default_value' => variable_get('simplefeed_check_url', 1), + ); return system_settings_form($form); } @@ -471,7 +504,7 @@ function simplefeed_feed_refresh($nid = $limit = variable_get('simplefeed_cron_throttle', 50); // limit in ASC order so we grab the top N that haven't been checked recently // we can only update feed nodes that have a valid refresh time set; ignore "never" and "manual" options - $query = 'SELECT n.nid FROM {node} n INNER JOIN {simplefeed_feed} s ON n.vid = s.vid WHERE ((%d - s.checked) >= s.refresh) AND n.status = 1 AND s.refresh > 1 ORDER BY s.checked ASC'; + $query = 'SELECT n.nid FROM {node} n INNER JOIN {simplefeed_feed} s ON n.vid = s.vid WHERE ((%d - s.checked) >= s.refresh) AND n.status = 1 AND s.refresh > 1 AND s.error = 0 ORDER BY s.checked ASC'; if ($limit != 'unlimited') { $process_feeds = db_query_range($query, time(), 0, $limit); } @@ -534,10 +567,11 @@ function simplefeed_feed_process($nid) { } // finished processing this feed so we can mark it checked - db_query("UPDATE {simplefeed_feed} SET checked = %d, hash = '%s' WHERE vid = %d", time(), $hash, $process_feed->vid); + db_query("UPDATE {simplefeed_feed} SET checked = %d, hash = '%s', error = 0 WHERE vid = %d", time(), $hash, $process_feed->vid); } else if (isset($feed->error)) { watchdog('simplefeed', t('The feed %feed could not be processed due to the following error: %error', array('%feed' => $process_feed->title, '%error' => $feed->error)), WATCHDOG_ERROR, l('view', 'node/'. $process_feed->nid)); + db_query("UPDATE {simplefeed_feed} SET error = 1 WHERE vid = %d", $process_feed->vid); } else { watchdog('simplefeed', 'You shouldn\'t be here. Something has gone terribly wrong.');