|
|
@@ -26,6 +26,63 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public static function addFeed($url, $cat_id = 0, $new_cat_name = '', $http_auth = '') {
|
|
|
+ @set_time_limit(300);
|
|
|
+
|
|
|
+ $catDAO = new FreshRSS_CategoryDAO();
|
|
|
+
|
|
|
+ $cat = null;
|
|
|
+ if ($cat_id > 0) {
|
|
|
+ $cat = $catDAO->searchById($cat_id);
|
|
|
+ }
|
|
|
+ if ($cat == null && $new_cat_name != '') {
|
|
|
+ $cat = $catDAO->addCategory(array('name' => $new_cat_name));
|
|
|
+ }
|
|
|
+ if ($cat == null) {
|
|
|
+ $catDAO->checkDefault();
|
|
|
+ $def_cat = $catDAO->getDefault();
|
|
|
+ $cat = $def_cat->id();
|
|
|
+ }
|
|
|
+
|
|
|
+ $feed = new FreshRSS_Feed($url); //Throws FreshRSS_BadUrl_Exception
|
|
|
+ $feed->_httpAuth($http_auth);
|
|
|
+ $feed->load(true); //Throws FreshRSS_Feed_Exception, Minz_FileNotExistException
|
|
|
+ $feed->_category($cat_id);
|
|
|
+
|
|
|
+ $feedDAO = FreshRSS_Factory::createFeedDao();
|
|
|
+ if ($feedDAO->searchByUrl($feed->url())) {
|
|
|
+ throw new FreshRSS_AlreadySubscribed_Exception($url, $feed->name());
|
|
|
+ }
|
|
|
+
|
|
|
+ // Call the extension hook
|
|
|
+ $feed = Minz_ExtensionManager::callHook('feed_before_insert', $feed);
|
|
|
+ if ($feed === null) {
|
|
|
+ throw new FreshRSS_FeedNotAdded_Exception($url, $feed->name());
|
|
|
+ }
|
|
|
+
|
|
|
+ $values = array(
|
|
|
+ 'url' => $feed->url(),
|
|
|
+ 'category' => $feed->category(),
|
|
|
+ 'name' => $feed->name(),
|
|
|
+ 'website' => $feed->website(),
|
|
|
+ 'description' => $feed->description(),
|
|
|
+ 'lastUpdate' => time(),
|
|
|
+ 'httpAuth' => $feed->httpAuth(),
|
|
|
+ );
|
|
|
+
|
|
|
+ $id = $feedDAO->addFeed($values);
|
|
|
+ if (!$id) {
|
|
|
+ // There was an error in database... we cannot say what here.
|
|
|
+ throw new FreshRSS_FeedNotAdded_Exception($url, $feed->name());
|
|
|
+ }
|
|
|
+ $feed->_id($id);
|
|
|
+
|
|
|
+ // Ok, feed has been added in database. Now we have to refresh entries.
|
|
|
+ self::actualizeFeed($id, $url, false, null, true);
|
|
|
+
|
|
|
+ return $feed;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* This action subscribes to a feed.
|
|
|
*
|
|
|
@@ -59,7 +116,6 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
|
|
}
|
|
|
|
|
|
$feedDAO = FreshRSS_Factory::createFeedDao();
|
|
|
- $this->catDAO = new FreshRSS_CategoryDAO();
|
|
|
$url_redirect = array(
|
|
|
'c' => 'subscription',
|
|
|
'a' => 'index',
|
|
|
@@ -74,26 +130,13 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
|
|
}
|
|
|
|
|
|
if (Minz_Request::isPost()) {
|
|
|
- @set_time_limit(300);
|
|
|
-
|
|
|
$cat = Minz_Request::param('category');
|
|
|
+ $new_cat_name = '';
|
|
|
if ($cat === 'nc') {
|
|
|
// User want to create a new category, new_category parameter
|
|
|
// must exist
|
|
|
$new_cat = Minz_Request::param('new_category');
|
|
|
- if (empty($new_cat['name'])) {
|
|
|
- $cat = false;
|
|
|
- } else {
|
|
|
- $cat = $this->catDAO->addCategory($new_cat);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if ($cat === false) {
|
|
|
- // If category was not given or if creating new category failed,
|
|
|
- // get the default category
|
|
|
- $this->catDAO->checkDefault();
|
|
|
- $def_cat = $this->catDAO->getDefault();
|
|
|
- $cat = $def_cat->id();
|
|
|
+ $new_cat_name = isset($new_cat['name']) ? $new_cat['name'] : '';
|
|
|
}
|
|
|
|
|
|
// HTTP information are useful if feed is protected behind a
|
|
|
@@ -105,103 +148,24 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
|
|
$http_auth = $user . ':' . $pass;
|
|
|
}
|
|
|
|
|
|
- $transaction_started = false;
|
|
|
try {
|
|
|
- $feed = new FreshRSS_Feed($url);
|
|
|
+ $feed = self::addFeed($url, $cat, $new_cat_name, $http_auth);
|
|
|
} catch (FreshRSS_BadUrl_Exception $e) {
|
|
|
// Given url was not a valid url!
|
|
|
Minz_Log::warning($e->getMessage());
|
|
|
Minz_Request::bad(_t('feedback.sub.feed.invalid_url', $url), $url_redirect);
|
|
|
- }
|
|
|
-
|
|
|
- $feed->_httpAuth($http_auth);
|
|
|
-
|
|
|
- try {
|
|
|
- $feed->load(true);
|
|
|
} catch (FreshRSS_Feed_Exception $e) {
|
|
|
// Something went bad (timeout, server not found, etc.)
|
|
|
Minz_Log::warning($e->getMessage());
|
|
|
- Minz_Request::bad(
|
|
|
- _t('feedback.sub.feed.internal_problem', _url('index', 'logs')),
|
|
|
- $url_redirect
|
|
|
- );
|
|
|
+ Minz_Request::bad(_t('feedback.sub.feed.internal_problem', _url('index', 'logs')), $url_redirect);
|
|
|
} catch (Minz_FileNotExistException $e) {
|
|
|
// Cache directory doesn't exist!
|
|
|
Minz_Log::error($e->getMessage());
|
|
|
- Minz_Request::bad(
|
|
|
- _t('feedback.sub.feed.internal_problem', _url('index', 'logs')),
|
|
|
- $url_redirect
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- if ($feedDAO->searchByUrl($feed->url())) {
|
|
|
- Minz_Request::bad(
|
|
|
- _t('feedback.sub.feed.already_subscribed', $feed->name()),
|
|
|
- $url_redirect
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- $feed->_category($cat);
|
|
|
-
|
|
|
- // Call the extension hook
|
|
|
- $name = $feed->name();
|
|
|
- $feed = Minz_ExtensionManager::callHook('feed_before_insert', $feed);
|
|
|
- if ($feed === null) {
|
|
|
- Minz_Request::bad(_t('feedback.sub.feed.not_added', $name), $url_redirect);
|
|
|
- }
|
|
|
-
|
|
|
- $values = array(
|
|
|
- 'url' => $feed->url(),
|
|
|
- 'category' => $feed->category(),
|
|
|
- 'name' => $feed->name(),
|
|
|
- 'website' => $feed->website(),
|
|
|
- 'description' => $feed->description(),
|
|
|
- 'lastUpdate' => time(),
|
|
|
- 'httpAuth' => $feed->httpAuth(),
|
|
|
- );
|
|
|
-
|
|
|
- $id = $feedDAO->addFeed($values);
|
|
|
- if (!$id) {
|
|
|
- // There was an error in database... we cannot say what here.
|
|
|
- Minz_Request::bad(_t('feedback.sub.feed.not_added', $feed->name()), $url_redirect);
|
|
|
- }
|
|
|
-
|
|
|
- // Ok, feed has been added in database. Now we have to refresh entries.
|
|
|
- $feed->_id($id);
|
|
|
- $feed->faviconPrepare();
|
|
|
- //$feed->pubSubHubbubPrepare(); //TODO: prepare PubSubHubbub already when adding the feed
|
|
|
-
|
|
|
- $is_read = FreshRSS_Context::$user_conf->mark_when['reception'] ? 1 : 0;
|
|
|
-
|
|
|
- $entryDAO = FreshRSS_Factory::createEntryDao();
|
|
|
- // We want chronological order and SimplePie uses reverse order.
|
|
|
- $entries = array_reverse($feed->entries());
|
|
|
-
|
|
|
- // Calculate date of oldest entries we accept in DB.
|
|
|
- $nb_month_old = FreshRSS_Context::$user_conf->old_entries;
|
|
|
- $date_min = time() - (3600 * 24 * 30 * $nb_month_old);
|
|
|
-
|
|
|
- // Use a shared statement and a transaction to improve a LOT the
|
|
|
- // performances.
|
|
|
- $feedDAO->beginTransaction();
|
|
|
- foreach ($entries as $entry) {
|
|
|
- // Entries are added without any verification.
|
|
|
- $entry->_feed($feed->id());
|
|
|
- $entry->_id(min(time(), $entry->date(true)) . uSecString());
|
|
|
- $entry->_isRead($is_read);
|
|
|
-
|
|
|
- $entry = Minz_ExtensionManager::callHook('entry_before_insert', $entry);
|
|
|
- if ($entry === null) {
|
|
|
- // An extension has returned a null value, there is nothing to insert.
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- $values = $entry->toArray();
|
|
|
- $entryDAO->addEntry($values);
|
|
|
- }
|
|
|
- $feedDAO->updateLastUpdate($feed->id());
|
|
|
- if ($feedDAO->inTransaction()) {
|
|
|
- $feedDAO->commit();
|
|
|
+ Minz_Request::bad(_t('feedback.sub.feed.internal_problem', _url('index', 'logs')), $url_redirect);
|
|
|
+ } catch (FreshRSS_AlreadySubscribed_Exception $e) {
|
|
|
+ Minz_Request::bad(_t('feedback.sub.feed.already_subscribed', $e->feedName()), $url_redirect);
|
|
|
+ } catch (FreshRSS_FeedNotAdded_Exception $e) {
|
|
|
+ Minz_Request::bad(_t('feedback.sub.feed.not_added', $e->feedName()), $url_redirect);
|
|
|
}
|
|
|
|
|
|
// Entries are in DB, we redirect to feed configuration page.
|
|
|
@@ -211,6 +175,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
|
|
// GET request: we must ask confirmation to user before adding feed.
|
|
|
Minz_View::prependTitle(_t('sub.feed.title_add') . ' · ');
|
|
|
|
|
|
+ $this->catDAO = new FreshRSS_CategoryDAO();
|
|
|
$this->view->categories = $this->catDAO->listCategories(false);
|
|
|
$this->view->feed = new FreshRSS_Feed($url);
|
|
|
try {
|
|
|
@@ -261,7 +226,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public static function actualizeFeed($feed_id, $feed_url, $force, $simplePiePush = null) {
|
|
|
+ public static function actualizeFeed($feed_id, $feed_url, $force, $simplePiePush = null, $isNewFeed = false) {
|
|
|
@set_time_limit(300);
|
|
|
|
|
|
$feedDAO = FreshRSS_Factory::createFeedDao();
|
|
|
@@ -310,7 +275,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
|
|
if ($simplePiePush) {
|
|
|
$feed->loadEntries($simplePiePush); //Used by PubSubHubbub
|
|
|
} else {
|
|
|
- $feed->load(false);
|
|
|
+ $feed->load(false, $isNewFeed);
|
|
|
}
|
|
|
} catch (FreshRSS_Feed_Exception $e) {
|
|
|
Minz_Log::warning($e->getMessage());
|
|
|
@@ -320,7 +285,9 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
|
|
}
|
|
|
|
|
|
$feed_history = $feed->keepHistory();
|
|
|
- if ($feed_history == -2) {
|
|
|
+ if ($isNewFeed) {
|
|
|
+ $feed_history = -1; //∞
|
|
|
+ } elseif ($feed_history == -2) {
|
|
|
// TODO: -2 must be a constant!
|
|
|
// -2 means we take the default value from configuration
|
|
|
$feed_history = FreshRSS_Context::$user_conf->keep_history_default;
|
|
|
@@ -360,7 +327,9 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
|
|
|
// This entry should not be added considering configuration and date.
|
|
|
$oldGuids[] = $entry->guid();
|
|
|
} else {
|
|
|
- if ($entry_date < $date_min) {
|
|
|
+ if ($isNewFeed) {
|
|
|
+ $id = min(time(), $entry_date) . uSecString();
|
|
|
+ } elseif ($entry_date < $date_min) {
|
|
|
$id = min(time(), $entry_date) . uSecString();
|
|
|
$entry->_isRead(true); //Old article that was not in database. Probably an error, so mark as read
|
|
|
} else {
|