]> git.wh0rd.org - tt-rss.git/commitdiff
add basic rss support
authorAndrew Dolgov <fox@fakecake.org>
Wed, 1 May 2013 13:38:16 +0000 (17:38 +0400)
committerAndrew Dolgov <fox@fakecake.org>
Wed, 1 May 2013 13:38:16 +0000 (17:38 +0400)
classes/feeditem/atom.php
classes/feeditem/rss.php [new file with mode: 0644]
classes/feedparser.php
include/rssfuncs.php

index 560484edadcab62186d21f15db02eea560254c2f..0d888c4437f61ac261eda8fc4e8b0c753b3dbdc2 100644 (file)
@@ -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() {
diff --git a/classes/feeditem/rss.php b/classes/feeditem/rss.php
new file mode 100644 (file)
index 0000000..e7ea1df
--- /dev/null
@@ -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;
+
+               }
+       }
+}
+?>
index 274e871b9bef3f53df146d30585a1858df2bbe49..fb6344cc02b1bb815863cb45b3fd24a4c4a10410 100644 (file)
@@ -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;
                        }
                }
index 3b7f7d2cfbaf758817aeac9acc9780cef12489f8..ec0ca5a4f1d05307461a40032549e9e188350c9a 100644 (file)
 
                                $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();