subscribe_to_feed: stop fetching URL multiple times while subscribing, various other speedups

This commit is contained in:
Andrew Dolgov 2012-09-23 13:38:58 +04:00
parent 386c4ce63c
commit 759e5132a1
4 changed files with 34 additions and 39 deletions

View File

@ -553,7 +553,7 @@ class Handler_Public extends Handler {
break; break;
case 4: case 4:
print_notice(__("Multiple feed URLs found.")); print_notice(__("Multiple feed URLs found."));
$feed_urls = get_feeds_from_html($feed_url); $feed_urls = $rc["feeds"];
break; break;
case 5: case 5:
print_error(T_sprintf("Could not subscribe to <b>%s</b>.<br>Can't download the Feed URL.", $feed_url)); print_error(T_sprintf("Could not subscribe to <b>%s</b>.<br>Can't download the Feed URL.", $feed_url));

View File

@ -195,12 +195,6 @@ class RPC extends Handler_Protected {
print json_encode(array("result" => $rc)); print json_encode(array("result" => $rc));
} }
function extractfeedurls() {
$urls = get_feeds_from_html($_REQUEST['url']);
print json_encode(array("urls" => $urls));
}
function togglepref() { function togglepref() {
$key = db_escape_string($_REQUEST["key"]); $key = db_escape_string($_REQUEST["key"]);
set_pref($this->link, $key, !get_pref($this->link, $key)); set_pref($this->link, $key, !get_pref($this->link, $key));

View File

@ -1810,15 +1810,19 @@
$update_method = 0; $update_method = 0;
if (!fetch_file_contents($url, false, $auth_login, $auth_pass)) $contents = @fetch_file_contents($url, false, $auth_login, $auth_pass);
return array("code" => 5, "message" => $fetch_last_error);
if (!$contents) {
return array("code" => 5, "message" => $fetch_last_error);
}
if (is_html($contents)) {
$feedUrls = get_feeds_from_html($url, $contents);
if (url_is_html($url, $auth_login, $auth_pass)) {
$feedUrls = get_feeds_from_html($url, $auth_login, $auth_pass);
if (count($feedUrls) == 0) { if (count($feedUrls) == 0) {
return array("code" => 3); return array("code" => 3);
} else if (count($feedUrls) > 1) { } else if (count($feedUrls) > 1) {
return array("code" => 4); return array("code" => 4, "feeds" => $feedUrls);
} }
//use feed url as new URL //use feed url as new URL
$url = key($feedUrls); $url = key($feedUrls);
@ -4758,22 +4762,13 @@
return false; return false;
} }
/** function get_feeds_from_html($url, $content)
* Extracts RSS/Atom feed URLs from the given HTML URL.
*
* @param string $url HTML page URL
*
* @return array Array of feeds. Key is the full URL, value the title
*/
function get_feeds_from_html($url, $login = false, $pass = false)
{ {
$url = fix_url($url); $url = fix_url($url);
$baseUrl = substr($url, 0, strrpos($url, '/') + 1); $baseUrl = substr($url, 0, strrpos($url, '/') + 1);
libxml_use_internal_errors(true); libxml_use_internal_errors(true);
$content = @fetch_file_contents($url, false, $login, $pass);
$doc = new DOMDocument(); $doc = new DOMDocument();
$doc->loadHTML($content); $doc->loadHTML($content);
$xpath = new DOMXPath($doc); $xpath = new DOMXPath($doc);
@ -4794,23 +4789,12 @@
return $feedUrls; return $feedUrls;
} }
/** function is_html($content) {
* Checks if the content behind the given URL is a HTML file return preg_match("/<html|DOCTYPE html/i", $content) !== 0;
*
* @param string $url URL to check
*
* @return boolean True if the URL contains HTML content
*/
function url_is_html($url, $login = false, $pass = false) {
$content = substr(fetch_file_contents($url, false, $login, $pass), 0, 1000);
if (stripos($content, '<html>') === false
&& stripos($content, '<html ') === false
) {
return false;
} }
return true; function url_is_html($url, $login = false, $pass = false) {
return is_html(fetch_file_contents($url, false, $login, $pass));
} }
function print_label_select($link, $name, $value, $attributes = "") { function print_label_select($link, $name, $value, $attributes = "") {

View File

@ -881,7 +881,7 @@ function quickAddFeed() {
alert(__("Specified URL doesn't seem to contain any feeds.")); alert(__("Specified URL doesn't seem to contain any feeds."));
break; break;
case 4: case 4:
notify_progress("Searching for feed urls...", true); /* notify_progress("Searching for feed urls...", true);
new Ajax.Request("backend.php", { new Ajax.Request("backend.php", {
parameters: 'op=rpc&method=extractfeedurls&url=' + param_escape(feed_url), parameters: 'op=rpc&method=extractfeedurls&url=' + param_escape(feed_url),
@ -912,6 +912,23 @@ function quickAddFeed() {
Effect.Appear('feedDlg_feedsContainer', {duration : 0.5}); Effect.Appear('feedDlg_feedsContainer', {duration : 0.5});
} }
}); });
break; */
feeds = rc['feeds'];
var select = dijit.byId("feedDlg_feedContainerSelect");
while (select.getOptions().length > 0)
select.removeOption(0);
var count = 0;
for (var feedUrl in feeds) {
select.addOption({value: feedUrl, label: feeds[feedUrl]});
count++;
}
Effect.Appear('feedDlg_feedsContainer', {duration : 0.5});
break; break;
case 5: case 5:
alert(__("Couldn't download the specified URL: %s"). alert(__("Couldn't download the specified URL: %s").