Browse Source

implement fetching and exporting of shared feeds

Andrew Dolgov 13 years ago
parent
commit
ae5f7bb11a
7 changed files with 143 additions and 38 deletions
  1. 32 1
      backend.php
  2. 89 1
      functions.php
  3. 0 32
      modules/backend-rpc.php
  4. 2 0
      modules/popup-dialog.php
  5. 12 4
      modules/pref-instances.php
  6. 5 0
      update.php
  7. 3 0
      update_daemon2.php

+ 32 - 1
backend.php

@@ -60,7 +60,7 @@
 
 	if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds" &&
 			$op != "rss" && $op != "getUnread" && $op != "getProfiles" &&
-			$op != "logout" && $op != "pubsub") {
+			$op != "fbexport" && $op != "logout" && $op != "pubsub") {
 
 		header("Content-Type: text/plain");
 		print json_encode(array("error" => array("code" => 6)));
@@ -583,6 +583,37 @@
 			header("Location: tt-rss.php");
 		break; // logout
 
+		case "fbexport":
+
+			// TODO: change to _POST
+			$access_key = db_escape_string($_REQUEST["key"]);
+
+			// TODO: rate limit checking using last_connected
+			$result = db_query($link, "SELECT id FROM ttrss_linked_instances
+				WHERE access_key = '$access_key'");
+
+			if (db_num_rows($result) == 1) {
+
+				$instance_id = db_fetch_result($result, 0, "id");
+
+				$result = db_query($link, "SELECT feed_url, title, subscribers
+					FROM ttrss_feedbrowser_cache ORDER BY subscribers DESC LIMIT 100");
+
+				$feeds = array();
+
+				while ($line = db_fetch_assoc($result)) {
+					array_push($feeds, $line);
+				}
+
+				db_query($link, "UPDATE ttrss_linked_instances SET last_connected = NOW(),
+					last_status_in = 1 WHERE id = '$instance_id'");
+
+				print json_encode(array("feeds" => $feeds));
+			} else {
+				print json_encode(array("error" => array("code" => 6)));
+			}
+		break; // fbexport
+
 		default:
 			header("Content-Type: text/plain");
 			print json_encode(array("error" => array("code" => 7)));

+ 89 - 1
functions.php

@@ -358,7 +358,7 @@
 		}
 	}
 
-	function fetch_file_contents($url, $type = false, $login = false, $pass = false) {
+	function fetch_file_contents($url, $type = false, $login = false, $pass = false, $post_query = false) {
 		$login = urlencode($login);
 		$pass = urlencode($pass);
 
@@ -374,6 +374,11 @@
 			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 			curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
 
+			if ($post_query) {
+				curl_setopt($ch, CURLOPT_POST, true);
+				curl_setopt($ch, CURLOPT_POSTFIELDS, $post_query);
+			}
+
 			if ($login && $pass)
 				curl_setopt($ch, CURLOPT_USERPWD, "$login:$pass");
 
@@ -7351,4 +7356,87 @@
 
 		return $query;
 	}
+
+	// Status codes:
+	// -1  - never connected
+	// 0   - no data received
+	// 1   - data received successfully
+	// 2   - did not receive valid data
+	// >10 - server error, code + 10 (e.g. 16 means server error 6)
+
+	function get_linked_feeds($link, $instance_id = false) {
+		if ($instance_id)
+			$instance_qpart = "id = '$instance_id' AND ";
+		else
+			$instance_qpart = "";
+
+		if (DB_TYPE == "pgsql") {
+			$date_qpart = "last_connected < NOW() - INTERVAL '1 second'";
+		} else {
+			$date_qpart = "last_connected < DATE_SUB(NOW(), INTERVAL 6 HOUR";
+		}
+
+		$result = db_query($link, "SELECT id, access_key, access_url FROM ttrss_linked_instances
+			WHERE $instance_qpart $date_qpart ORDER BY last_connected");
+
+		while ($line = db_fetch_assoc($result)) {
+			$id = $line['id'];
+
+			_debug("Updating: " . $line['access_url'] . " ($id)");
+
+			$fetch_url = $line['access_url'] . '/backend.php?op=fbexport';
+			$post_query = 'key=' . $line['access_key'];
+
+			$feeds = fetch_file_contents($fetch_url, false, false, false, $post_query);
+
+			if ($feeds) {
+				$feeds = json_decode($feeds, true);
+
+				if ($feeds) {
+					if ($feeds['error']) {
+						$status = $feeds['error']['code'] + 10;
+					} else {
+						$status = 1;
+
+						if (count($feeds['feeds']) > 0) {
+
+							db_query($link, "DELETE FROM ttrss_linked_feeds
+								WHERE instance_id = '$id'");
+
+							foreach ($feeds['feeds'] as $feed) {
+								$feed_url = db_escape_string($feed['feed_url']);
+								$title = db_escape_string($feed['title']);
+								$subscribers = db_escape_string($feed['subscribers']);
+
+								db_query($link, "INSERT INTO ttrss_linked_feeds
+									(feed_url, title, subscribers, instance_id, created, updated)
+								VALUES
+									('$feed_url', '$title', '$subscribers', '$id', NOW(), NOW())");
+							}
+						} else {
+							// received 0 feeds, this might indicate that
+							// the instance on the other hand is rebuilding feedbrowser cache
+							// we will try again later
+
+							// TODO: maybe perform expiration based on updated here?
+						}
+
+						_debug("Processed " . count($feeds['feeds']) . " feeds.");
+					}
+				} else {
+					$status = 2;
+				}
+
+			} else {
+				$status = 0;
+			}
+
+			_debug("Status: $status");
+
+			db_query($link, "UPDATE ttrss_linked_instances SET
+				last_status_out = '$status', last_connected = NOW() WHERE id = '$id'");
+
+		}
+
+	}
 ?>

+ 0 - 32
modules/backend-rpc.php

@@ -834,38 +834,6 @@
 			return;
 		}
 
-		if ($subop == "fbExport") {
-
-			// TODO: change to _POST
-			$access_key = db_escape_string($_REQUEST["key"]);
-
-			// TODO: rate limit checking using last_connected
-			$result = db_query($link, "SELECT id FROM ttrss_linked_instances
-				WHERE access_key = '$access_key'");
-
-			if (db_num_rows($result) == 1) {
-
-				$instance_id = db_fetch_result($result, 0, "id");
-
-				$result = db_query($link, "SELECT feed_url, title, subscribers
-					FROM ttrss_feedbrowser_cache ORDER BY subscribers DESC LIMIT 100");
-
-				$feeds = array();
-
-				while ($line = db_fetch_assoc($result)) {
-					array_push($feeds, $line);
-				}
-
-				db_query($link, "UPDATE ttrss_linked_instances SET last_connected = NOW()
-					WHERE id = '$instance_id'");
-
-				print json_encode(array("feeds" => $feeds));
-			} else {
-				print json_encode(array("error" => array("code" => 6)));
-			}
-			return;
-		}
-
 		if ($subop == "genHash") {
 			$hash = sha1(uniqid(rand(), true));
 

+ 2 - 0
modules/popup-dialog.php

@@ -1023,6 +1023,8 @@
 				style=\"width: 20em\" name=\"access_key\" id=\"instance_add_key\"
 				value=\"$access_key\">";
 
+			print "<p class='insensitive'>" . __("Use one access key for both linked instances.");
+
 			print "</div>";
 
 			print "<div class=\"dlgButtons\">

+ 12 - 4
modules/pref-instances.php

@@ -24,8 +24,9 @@
 
 			if (db_num_rows($result) == 0) {
 				db_query($link, "INSERT INTO ttrss_linked_instances
-					(access_url, access_key, last_connected) VALUES
-					('$access_url', '$access_key', '1970-01-01')");
+					(access_url, access_key, last_connected, last_status_in, last_status_out)
+					VALUES
+					('$access_url', '$access_key', '1970-01-01', -1, -1)");
 
 			}
 
@@ -74,6 +75,8 @@
 				style=\"width: 20em\" name=\"access_key\" id=\"instance_edit_key\"
 				value=\"$access_key\">";
 
+			print "<p class='insensitive'>" . __("Use one access key for both linked instances.");
+
 			print "</div>";
 
 			print "<div class=\"dlgButtons\">
@@ -131,7 +134,10 @@
 
 		print "</div>"; #toolbar
 
-		$result = db_query($link, "SELECT * FROM ttrss_linked_instances
+		$result = db_query($link, "SELECT *,
+			(SELECT COUNT(*) FROM ttrss_linked_feeds
+				WHERE instance_id = ttrss_linked_instances.id) AS num_feeds
+			FROM ttrss_linked_instances
 			ORDER BY $sort");
 
 		print "<p class=\"insensitive\" style='margin-left : 1em;'>" . __("You can connect other instances of Tiny Tiny RSS to this one to share Popular feeds. Link to this instance of Tiny Tiny RSS by using this URL:");
@@ -144,7 +150,8 @@
 			<td align='center' width=\"5%\">&nbsp;</td>
 			<td width=''><a href=\"#\" onclick=\"updateInstanceList('access_url')\">".__('Instance URL')."</a></td>
 			<td width='20%'><a href=\"#\" onclick=\"updateInstanceList('access_key')\">".__('Access key')."</a></td>
-			<td width='20%'><a href=\"#\" onclick=\"updateUsersList('last_connected')\">".__('Last connected')."</a></td>
+			<td width='10%'><a href=\"#\" onclick=\"updateUsersList('last_connected')\">".__('Last connected')."</a></td>
+			<td width='10%'><a href=\"#\" onclick=\"updateUsersList('num_feeds')\">".__('Stored feeds')."</a></td>
 			</tr>";
 
 		$lnum = 0;
@@ -170,6 +177,7 @@
 			print "<td $onclick>" . htmlspecialchars($line['access_url']) . "</td>";
 			print "<td $onclick>" . htmlspecialchars($access_key) . "</td>";
 			print "<td $onclick>" . htmlspecialchars($line['last_connected']) . "</td>";
+			print "<td $onclick>" . htmlspecialchars($line['num_feeds']) . "</td>";
 
 			print "</tr>";
 

+ 5 - 0
update.php

@@ -22,6 +22,7 @@
 		print "  -feedbrowser   - update feedbrowser\n";
 		print "  -daemon        - start single-process update daemon\n";
 		print "  -cleanup-tags  - perform tags table maintenance\n";
+		print "  -get-feeds     - receive popular feeds from linked instances\n";
 		print "  -help          - show this help\n";
 		return;
 	}
@@ -110,6 +111,10 @@
 		print "$rc tags deleted.\n";
 	}
 
+	if ($op == "-get-feeds") {
+		get_linked_feeds($link);
+	}
+
 	db_close($link);
 
 	unlink(LOCK_DIRECTORY . "/$lock_filename");

+ 3 - 0
update_daemon2.php

@@ -219,6 +219,9 @@
 
 						_debug("Cleaned $rc cached tags.");
 
+						_debug("Updating linked feeds...");
+						get_linked_feeds($link);
+
 					}
 
 					_debug("Elapsed time: " . (time() - $start_timestamp) . " second(s)");