From 51a3a75aaca6c876e16c57cc376f31753cc73ea9 Mon Sep 17 00:00:00 2001
From: logmanoriginal <logmanoriginal@users.noreply.github.com>
Date: Sun, 4 Sep 2016 12:32:56 +0200
Subject: [PATCH] [Bridge] Add RSS 1.0 and 2.0 parser

---
 lib/Bridge.php | 51 ++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 45 insertions(+), 6 deletions(-)

diff --git a/lib/Bridge.php b/lib/Bridge.php
index f2e65256..f96e0117 100644
--- a/lib/Bridge.php
+++ b/lib/Bridge.php
@@ -606,17 +606,33 @@ abstract class RssExpander extends HttpCachingBridgeAbstract {
         $rssContent = simplexml_load_string($content);
         $this->debugMessage('loaded RSS from ' . $url);
 
-        if(isset($rssContent->channel[0])){ // RSS format
-            // TODO insert RSS format detection
-            // For now we always assume RSS 2.0
-            $this->collect_RSS_2_0_data($rssContent);
-        } elseif(isset($rssContent->entry[0])){ // ATOM format
+        $this->debugMessage('Detecting feed format/version');
+        if(isset($rssContent->channel[0])){
+            $this->debugMessage('Detected RSS format');
+            if(isset($rssContent->item[0])){
+                $this->debugMessage('Detected RSS 1.0 format');
+                $this->collect_RSS_1_0_data($rssContent);
+            } else {
+                $this->debugMessage('Detected RSS 0.9x or 2.0 format');
+                $this->collect_RSS_2_0_data($rssContent);
+            }
+        } elseif(isset($rssContent->entry[0])){
+            $this->debugMessage('Detected ATOM format');
             $this->collect_ATOM_data($rssContent);
-        } else { // Unknown format
+        } else {
+            $this->debugMessage('Unknown feed format/version');
             $this->returnServerError('The feed format is unknown!');
         }
     }
 
+    protected function collect_RSS_1_0_data($rssContent){
+        $this->load_RSS_2_0_feed_data($rssContent->channel[0]);
+        foreach($rssContent->item as $item){
+            $this->debugMessage('parsing item ' . var_export($item, true));
+            $this->items[] = $this->parseRSSItem($item);
+        }
+    }
+
     protected function collect_RSS_2_0_data($rssContent){
         $rssContent = $rssContent->channel[0];
         $this->debugMessage('RSS content is ===========\n' . var_export($rssContent, true) . '===========');
@@ -688,6 +704,29 @@ abstract class RssExpander extends HttpCachingBridgeAbstract {
         return $item;
     }
 
+    protected function parseRSS_1_0_Item($feedItem){
+        // 1.0 adds optional elements around the 0.91 standard
+        return $this->parseRSS_0_9_1_Item($feedItem);
+    }
+
+    protected function parseRSS_2_0_Item($feedItem){
+        // Primary data is compatible to 0.91
+        $item = $this->parseRSS_0_9_1_Item($feedItem);
+        if(isset($feedItem->pubDate)) $item['timestamp'] = strtotime($feedItem->pubDate);
+        if(isset($feedItem->author)){
+            $item['author'] = $feedItem->author;
+        } else {
+            // Feed might use 'dc' namespace
+            $namespaces = $feedItem->getNamespaces(true);
+            if(isset($namespaces['dc'])){
+                $dc = $feedItem->children($namespaces['dc']);
+                if(isset($dc->creator))
+                    $item['author'] = $dc->creator;
+            }
+        }
+        return $item;
+    }
+
     /**
      * Method should return, from a source RSS item given by lastRSS, one of our Items objects
      * @param $item the input rss item