Jelajahi Sumber

add basic rss support

Andrew Dolgov 11 tahun lalu
induk
melakukan
04d2f9c831
4 mengubah file dengan 138 tambahan dan 6 penghapusan
  1. 4 1
      classes/feeditem/atom.php
  2. 107 0
      classes/feeditem/rss.php
  3. 24 4
      classes/feedparser.php
  4. 3 1
      include/rssfuncs.php

+ 4 - 1
classes/feeditem/atom.php

@@ -17,8 +17,11 @@ class FeedItem_Atom {
 	}
 
 	function get_date() {
+		$updated = $this->elem->getElementsByTagName("updated")->item(0);
 
-
+		if ($updated) {
+			return strtotime($updated->nodeValue);
+		}
 	}
 
 	function get_link() {

+ 107 - 0
classes/feeditem/rss.php

@@ -0,0 +1,107 @@
+<?php
+class FeedItem_RSS {
+	private $elem;
+
+	function __construct($elem) {
+		$this->elem = $elem;
+	}
+
+	function get_id() {
+		return $this->get_link();
+	}
+
+	function get_date() {
+		$pubDate = $this->elem->getElementsByTagName("pubDate")->item(0);
+
+		if ($pubDate) {
+			return strtotime($pubDate->nodeValue);
+		}
+	}
+
+	function get_link() {
+		$link = $this->elem->getElementsByTagName("link")->item(0);
+
+		if ($link) {
+			return $link->nodeValue;
+		}
+	}
+
+	function get_title() {
+		$title = $this->elem->getElementsByTagName("title")->item(0);
+
+		if ($title) {
+			return $title->nodeValue;
+		}
+	}
+
+	function get_content() {
+		$content = $this->elem->getElementsByTagName("description")->item(0);
+
+		if ($content) {
+			return $content->nodeValue;
+		}
+	}
+
+	function get_description() {
+		$summary = $this->elem->getElementsByTagName("description")->item(0);
+
+		if ($summary) {
+			return $summary->nodeValue;
+		}
+	}
+
+	// todo
+	function get_comments_url() {
+
+	}
+
+	// todo
+	function get_comments_count() {
+
+	}
+
+	function get_categories() {
+		$categories = $this->elem->getElementsByTagName("category");
+		$cats = array();
+
+		foreach ($categories as $cat) {
+			array_push($cats, $cat->nodeValue);
+		}
+
+		return $cats;
+	}
+
+	function get_enclosures() {
+		$enclosures = $this->elem->getElementsByTagName("enclosure");
+
+		$encs = array();
+
+		foreach ($enclosures as $enclosure) {
+			$enc = new FeedEnclosure();
+
+			$enc->type = $enclosure->getAttribute("type");
+			$enc->link = $enclosure->getAttribute("url");
+			$enc->length = $enclosure->getAttribute("length");
+
+			array_push($encs, $enc);
+		}
+
+		return $encs;
+	}
+
+	function get_author() {
+		$author = $this->elem->getElementsByTagName("author")->item(0);
+
+		if ($author) {
+			$name = $author->getElementsByTagName("name")->item(0);
+
+			if ($name) return $name->nodeValue;
+
+			$email = $author->getElementsByTagName("email")->item(0);
+
+			if ($email) return $email->nodeValue;
+
+		}
+	}
+}
+?>

+ 24 - 4
classes/feedparser.php

@@ -24,10 +24,14 @@ class FeedParser {
 
 	function init() {
 		$root = $this->doc->firstChild;
+		$xpath = new DOMXPath($this->doc);
+		$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');
+
+		$root = $xpath->query("(//atom:feed|//channel)")->item(0);
 
 		if ($root) {
 			switch ($root->tagName) {
-			case "rss":
+			case "channel":
 				$this->type = $this::FEED_RSS;
 				break;
 			case "feed":
@@ -38,11 +42,8 @@ class FeedParser {
 				return;
 			}
 
-			$xpath = new DOMXPath($this->doc);
-
 			switch ($this->type) {
 			case $this::FEED_ATOM:
-				$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');
 
 				$title = $xpath->query("//atom:feed/atom:title")->item(0);
 
@@ -67,6 +68,25 @@ class FeedParser {
 
 				break;
 			case $this::FEED_RSS:
+
+				$title = $xpath->query("//channel/title")->item(0);
+
+				if ($title) {
+					$this->title = $title->nodeValue;
+				}
+
+				$link = $xpath->query("//channel/link")->item(0);
+
+				if ($link && $link->hasAttributes()) {
+					$this->link = $link->getAttribute("href");
+				}
+
+				$articles = $xpath->query("//channel/item");
+
+				foreach ($articles as $article) {
+					array_push($this->items, new FeedItem_RSS($article));
+				}
+
 				break;
 			}
 		}

+ 3 - 1
include/rssfuncs.php

@@ -549,7 +549,9 @@
 
 				$entry_timestamp = "";
 
-				$entry_timestamp = strtotime($item->get_date());
+				$entry_timestamp = $item->get_date();
+
+				_debug("orig date: " . $item->get_date(), $debug_enabled);
 
 				if ($entry_timestamp == -1 || !$entry_timestamp || $entry_timestamp > time()) {
 					$entry_timestamp = time();