X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=functions.php;h=7fc5aa7ea41d2fe0b1051e15fbdfb79bdd7a93d3;hb=c90a028cdc9548a4ef1f6359b53b2c9d96c3a7a8;hp=161335c96536d128dc596235f7b96d9b3ca36428;hpb=3809b27874608388ec145d76b6da28b1e7eadab1;p=tt-rss.git
diff --git a/functions.php b/functions.php
index 161335c9..7fc5aa7e 100644
--- a/functions.php
+++ b/functions.php
@@ -1,10 +1,8 @@
connect(MEMCACHE_SERVER, 11211);
+ }
+
require_once 'db-prefs.php';
require_once 'compat.php';
require_once 'errors.php';
@@ -350,33 +353,31 @@
}
}
- function fetch_file_contents($url) {
+ function fetch_file_contents($url, $type) {
if (USE_CURL_FOR_ICONS) {
- $tmpfile = tempnam(TMP_DIRECTORY, "ttrss-tmp");
-
$ch = curl_init($url);
- $fp = fopen($tmpfile, "w");
- if ($fp) {
- curl_setopt($ch, CURLOPT_FILE, $fp);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
- curl_setopt($ch, CURLOPT_TIMEOUT, 45);
- curl_exec($ch);
-
- if (strpos(curl_getinfo($ch, CURLINFO_CONTENT_TYPE), "image/") !== false) {
- curl_close($ch);
- fclose($fp);
- $contents = file_get_contents($tmpfile);
- } else {
- curl_close($ch);
- fclose($fp);
- }
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
+ curl_setopt($ch, CURLOPT_TIMEOUT, 45);
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+ curl_setopt($ch, CURLOPT_MAXREDIRS, 20);
+ curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+
+ $contents = curl_exec($ch);
+ if ($contents === false) {
+ curl_close($ch);
+ return false;
}
- unlink($tmpfile);
+ $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
+ curl_close($ch);
- return $contents;
+ if ($type && strpos($content_type, "$type") === false) {
+ return false;
+ }
+ return $contents;
} else {
return file_get_contents($url);
}
@@ -488,14 +489,16 @@
$icon_file = ICONS_DIR . "/$feed.ico";
if ($favicon_url && !file_exists($icon_file)) {
- $contents = fetch_file_contents($favicon_url);
+ $contents = fetch_file_contents($favicon_url, "image");
- $fp = fopen($icon_file, "w");
+ if ($contents) {
+ $fp = fopen($icon_file, "w");
- if ($fp) {
- fwrite($fp, $contents);
- fclose($fp);
- chmod($icon_file, 0644);
+ if ($fp) {
+ fwrite($fp, $contents);
+ fclose($fp);
+ chmod($icon_file, 0644);
+ }
}
}
@@ -503,7 +506,28 @@
}
- function update_rss_feed($link, $feed_url, $feed, $ignore_daemon = false) {
+ function update_rss_feed($link, $feed, $ignore_daemon = false) {
+
+ global $memcache;
+
+ /* Update all feeds with the same URL to utilize memcache */
+
+ if ($memcache) {
+ $result = db_query($link, "SELECT f1.id
+ FROM ttrss_feeds AS f1, ttrss_feeds AS f2
+ WHERE f2.feed_url = f1.feed_url AND f2.id = '$feed'");
+
+ while ($line = db_fetch_assoc($result)) {
+ update_rss_feed_real($link, $line["id"], $ignore_daemon);
+ }
+ } else {
+ update_rss_feed_real($link, $feed, $ignore_daemon);
+ }
+ }
+
+ function update_rss_feed_real($link, $feed, $ignore_daemon = false) {
+
+ global $memcache;
if (!$_REQUEST["daemon"] && !$ignore_daemon) {
return false;
@@ -528,14 +552,14 @@
} else {
$result = db_query($link, "SELECT id,update_interval,auth_login,
- auth_pass,cache_images,update_method,last_updated
+ feed_url,auth_pass,cache_images,update_method,last_updated
FROM ttrss_feeds WHERE id = '$feed'");
}
if (db_num_rows($result) == 0) {
if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) {
- _debug("update_rss_feed: feed $feed [$feed_url] NOT FOUND/SKIPPED");
+ _debug("update_rss_feed: feed $feed NOT FOUND/SKIPPED");
}
return false;
}
@@ -549,14 +573,10 @@
$auth_login = db_fetch_result($result, 0, "auth_login");
$auth_pass = db_fetch_result($result, 0, "auth_pass");
- if (ALLOW_SELECT_UPDATE_METHOD) {
- if (ENABLE_SIMPLEPIE) {
- $use_simplepie = $update_method != 1;
- } else {
- $use_simplepie = $update_method == 2;
- }
+ if (DEFAULT_UPDATE_METHOD == "1") {
+ $use_simplepie = $update_method != 1;
} else {
- $use_simplepie = ENABLE_SIMPLEPIE;
+ $use_simplepie = $update_method == 2;
}
if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) {
@@ -570,13 +590,12 @@
$update_interval = db_fetch_result($result, 0, "update_interval");
$cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images"));
+ $fetch_url = db_fetch_result($result, 0, "feed_url");
if ($update_interval < 0) { return; }
$feed = db_escape_string($feed);
- $fetch_url = $feed_url;
-
if ($auth_login && $auth_pass) {
$url_parts = array();
preg_match("/(^[^:]*):\/\/(.*)/", $fetch_url, $url_parts);
@@ -595,38 +614,53 @@
error_reporting(0);
}
- if (!$use_simplepie) {
- $rss = fetch_rss($fetch_url);
- } else {
- if (!is_dir(SIMPLEPIE_CACHE_DIR)) {
- mkdir(SIMPLEPIE_CACHE_DIR);
- }
-
- $rss = new SimplePie();
- $rss->set_useragent(SIMPLEPIE_USERAGENT . MAGPIE_USER_AGENT_EXT);
-# $rss->set_timeout(10);
- $rss->set_feed_url($fetch_url);
- $rss->set_output_encoding('UTF-8');
-
- if (SIMPLEPIE_CACHE_IMAGES && $cache_images) {
- if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) {
- _debug("enabling image cache");
- }
+ $obj_id = md5("FDATA:$use_simplepie:$fetch_url");
- $rss->set_image_handler('./image.php', 'i');
- }
+ if ($memcache && $obj = $memcache->get($obj_id)) {
if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) {
- _debug("feed update interval (sec): " .
- get_feed_update_interval($link, $feed)*60);
+ _debug("update_rss_feed: data found in memcache.");
}
- if (is_dir(SIMPLEPIE_CACHE_DIR)) {
- $rss->set_cache_location(SIMPLEPIE_CACHE_DIR);
- $rss->set_cache_duration(get_feed_update_interval($link, $feed) * 60);
+ $rss = $obj;
+
+ } else {
+
+ if (!$use_simplepie) {
+ $rss = fetch_rss($fetch_url);
+ } else {
+ if (!is_dir(SIMPLEPIE_CACHE_DIR)) {
+ mkdir(SIMPLEPIE_CACHE_DIR);
+ }
+
+ $rss = new SimplePie();
+ $rss->set_useragent(SIMPLEPIE_USERAGENT . MAGPIE_USER_AGENT_EXT);
+ # $rss->set_timeout(10);
+ $rss->set_feed_url($fetch_url);
+ $rss->set_output_encoding('UTF-8');
+
+ if (SIMPLEPIE_CACHE_IMAGES && $cache_images) {
+ if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) {
+ _debug("enabling image cache");
+ }
+
+ $rss->set_image_handler('./image.php', 'i');
+ }
+
+ if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) {
+ _debug("feed update interval (sec): " .
+ get_feed_update_interval($link, $feed)*60);
+ }
+
+ if (is_dir(SIMPLEPIE_CACHE_DIR)) {
+ $rss->set_cache_location(SIMPLEPIE_CACHE_DIR);
+ $rss->set_cache_duration(get_feed_update_interval($link, $feed) * 60);
+ }
+
+ $rss->init();
}
- $rss->init();
+ if ($memcache && $rss) $memcache->add($obj_id, $rss, 0, 300);
}
// print_r($rss);
@@ -786,10 +820,11 @@
$rss_1_date = $item['dc']['date'];
$atom_date = $item['issued'];
if (!$atom_date) $atom_date = $item['updated'];
-
+
if ($atom_date != "") $entry_timestamp = parse_w3cdtf($atom_date);
if ($rss_1_date != "") $entry_timestamp = parse_w3cdtf($rss_1_date);
if ($rss_2_date != "") $entry_timestamp = strtotime($rss_2_date);
+
}
if ($entry_timestamp == "" || $entry_timestamp == -1 || !$entry_timestamp) {
@@ -1141,7 +1176,7 @@
// error_reporting(0);
$article_filters = get_article_filters($filters, $entry_title,
- $entry_content, $entry_link, $entry_timestamp);
+ $entry_content, $entry_link, $entry_timestamp, $entry_author);
if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) {
_debug("update_rss_feed: article filters: ");
@@ -1331,15 +1366,15 @@
# check for manual tags
- $tag_filter = find_article_filter($article_filters, "tag");
+ foreach ($article_filters as $f) {
+ if ($f[0] == "tag") {
- if ($tag_filter) {
+ $manual_tags = trim_array(split(",", $f[1]));
- $manual_tags = trim_array(split(",", $tag_filter[1]));
-
- foreach ($manual_tags as $tag) {
- if (tag_is_valid($tag)) {
- array_push($entry_tags, $tag);
+ foreach ($manual_tags as $tag) {
+ if (tag_is_valid($tag)) {
+ array_push($entry_tags, $tag);
+ }
}
}
}
@@ -1465,7 +1500,7 @@
print "";
}
- function get_article_filters($filters, $title, $content, $link, $timestamp) {
+ function get_article_filters($filters, $title, $content, $link, $timestamp, $author) {
$matches = array();
if ($filters["title"]) {
@@ -1550,6 +1585,18 @@
}
}
+ if ($filters["author"]) {
+ foreach ($filters["author"] as $filter) {
+ $reg_exp = $filter["reg_exp"];
+ $inverse = $filter["inverse"];
+ if ((!$inverse && preg_match("/$reg_exp/i", $author)) ||
+ ($inverse && !preg_match("/$reg_exp/i", $author))) {
+
+ array_push($matches, array($filter["action"], $filter["action_param"]));
+ }
+ }
+ }
+
return $matches;
}
@@ -1617,8 +1664,8 @@
$link_title = "Updated: $last_updated";
}
- $feed = "$feed_title";
+ $feed = "$feed_title";
/* if ($feed_id < -10) {
$bg_color = "#00ccff";
@@ -2007,7 +2054,7 @@
function get_user_theme($link) {
- if (get_schema_version($link) >= 63) {
+ if (get_schema_version($link) >= 63 && $_SESSION["uid"]) {
$theme_name = get_pref($link, "_THEME_ID");
if (is_dir("themes/$theme_name")) {
return $theme_name;
@@ -2022,7 +2069,7 @@
function get_user_theme_path($link) {
- if (get_schema_version($link) >= 63) {
+ if (get_schema_version($link) >= 63 && $_SESSION["uid"]) {
$theme_name = get_pref($link, "_THEME_ID");
if ($theme_name && is_dir("themes/$theme_name")) {
@@ -2195,7 +2242,10 @@
function make_lockfile($filename) {
$fp = fopen(LOCK_DIRECTORY . "/$filename", "w");
- if (flock($fp, LOCK_EX | LOCK_NB)) {
+ if (flock($fp, LOCK_EX | LOCK_NB)) {
+ if (function_exists('posix_getpid')) {
+ fwrite($fp, posix_getpid() . "\n");
+ }
return $fp;
} else {
return false;
@@ -2390,20 +2440,16 @@
$cat_qpart = "cat_id IS NULL";
}
- $tmp_result = db_query($link, "SELECT id,feed_url FROM ttrss_feeds
+ $tmp_result = db_query($link, "SELECT id FROM ttrss_feeds
WHERE $cat_qpart AND owner_uid = " . $_SESSION["uid"]);
while ($tmp_line = db_fetch_assoc($tmp_result)) {
- $feed_url = $tmp_line["feed_url"];
$feed_id = $tmp_line["id"];
- update_rss_feed($link, $feed_url, $feed_id, $force_update);
+ update_rss_feed($link, $feed_id, $force_update);
}
} else {
- $tmp_result = db_query($link, "SELECT feed_url FROM ttrss_feeds
- WHERE id = '$feed'");
- $feed_url = db_fetch_result($tmp_result, 0, "feed_url");
- update_rss_feed($link, $feed_url, $feed, $force_update);
+ update_rss_feed($link, $feed, $force_update);
}
}
@@ -2923,7 +2969,7 @@
$feed_id = db_fetch_result($result, 0, "id");
if ($feed_id) {
- update_rss_feed($link, $url, $feed_id, true);
+ update_rss_feed($link, $feed_id, true);
}
return 1;
@@ -3246,8 +3292,15 @@
if ($match_on == "both") {
foreach ($keywords as $k) {
- array_push($query_keywords, "(UPPER(ttrss_entries.title) LIKE UPPER('%$k%')
- OR UPPER(ttrss_entries.content) LIKE UPPER('%$k%'))");
+ if (strpos($k, "-") === 0) {
+ $k = substr($k, 1);
+ $not = "NOT";
+ } else {
+ $not = "";
+ }
+
+ array_push($query_keywords, "(UPPER(ttrss_entries.title) $not LIKE UPPER('%$k%')
+ OR UPPER(ttrss_entries.content) $not LIKE UPPER('%$k%'))");
}
$search_query_part = implode("AND", $query_keywords) . " AND ";
@@ -3255,7 +3308,14 @@
} else if ($match_on == "title") {
foreach ($keywords as $k) {
- array_push($query_keywords, "(UPPER(ttrss_entries.title) LIKE UPPER('%$k%'))");
+ if (strpos($k, "-") === 0) {
+ $k = substr($k, 1);
+ $not = "NOT";
+ } else {
+ $not = "";
+ }
+
+ array_push($query_keywords, "(UPPER(ttrss_entries.title) $not LIKE UPPER('%$k%'))");
}
$search_query_part = implode("AND", $query_keywords) . " AND ";
@@ -3263,7 +3323,14 @@
} else if ($match_on == "content") {
foreach ($keywords as $k) {
- array_push($query_keywords, "(UPPER(ttrss_entries.content) LIKE UPPER('%$k%'))");
+ if (strpos($k, "-") === 0) {
+ $k = substr($k, 1);
+ $not = "NOT";
+ } else {
+ $not = "";
+ }
+
+ array_push($query_keywords, "(UPPER(ttrss_entries.content) $not LIKE UPPER('%$k%'))");
}
}
@@ -3600,7 +3667,11 @@
$rfc822_date = date('r', strtotime($line["updated"]));
- print "