]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/Feed.php
Code standards
[friendica.git] / src / Protocol / Feed.php
index 751a0f1e90a985ac9e257dd6d26556d6a7c3b5b9..14a3c28ab9b002dd1446841dd848a376c4715cdb 100644 (file)
@@ -1,9 +1,24 @@
 <?php
 /**
- * @file src/Protocol/Feed.php
- * @brief Imports RSS/RDF/Atom feeds
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  */
+
 namespace Friendica\Protocol;
 
 use DOMDocument;
@@ -14,17 +29,17 @@ use Friendica\Core\Protocol;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Item;
+use Friendica\Model\Tag;
 use Friendica\Util\Network;
 use Friendica\Util\ParseUrl;
 use Friendica\Util\XML;
 
 /**
- * @brief This class contain functions to import feeds
- *
+ * This class contain functions to import feeds (RSS/RDF/Atom)
  */
 class Feed {
        /**
-        * @brief Read a RSS/RDF/Atom feed and create an item entry for it
+        * Read a RSS/RDF/Atom feed and create an item entry for it
         *
         * @param string $xml      The feed data
         * @param array  $importer The user record of the importer
@@ -206,7 +221,7 @@ class Feed {
                $header["wall"] = 0;
                $header["origin"] = 0;
                $header["gravity"] = GRAVITY_PARENT;
-               $header["private"] = 2;
+               $header["private"] = Item::PUBLIC;
                $header["verb"] = Activity::POST;
                $header["object-type"] = Activity\ObjectType::NOTE;
 
@@ -218,8 +233,16 @@ class Feed {
                }
 
                $items = [];
+
+               // Limit the number of items that are about to be fetched
+               $total_items = ($entries->length - 1);
+               $max_items = DI::config()->get('system', 'max_feed_items');
+               if (($max_items > 0) && ($total_items > $max_items)) {
+                       $total_items = $max_items;
+               }
+
                // Importing older entries first
-               for ($i = $entries->length - 1; $i >= 0; --$i) {
+               for ($i = $total_items; $i >= 0; --$i) {
                        $entry = $entries->item($i);
 
                        $item = array_merge($header, $author);
@@ -363,6 +386,7 @@ class Feed {
                        }
 
                        $tags = '';
+                       $taglist = [];
                        $categories = $xpath->query("category", $entry);
                        foreach ($categories AS $category) {
                                $hashtag = $category->nodeValue;
@@ -372,6 +396,7 @@ class Feed {
 
                                $taglink = "#[url=" . DI::baseUrl() . "/search?tag=" . $hashtag . "]" . $hashtag . "[/url]";
                                $tags .= $taglink;
+                               $taglist[] = $hashtag;
                        }
 
                        $body = trim(XML::getFirstNodeValue($xpath, 'atom:content/text()', $entry));
@@ -453,6 +478,7 @@ class Feed {
                                $item["title"] = "";
                                $item["body"] = $item["body"] . add_page_info($item["plink"], false, $preview, ($contact["fetch_further_information"] == 2), $contact["ffi_keyword_blacklist"]);
                                $item["tag"] = add_page_keywords($item["plink"], $preview, ($contact["fetch_further_information"] == 2), $contact["ffi_keyword_blacklist"]);
+                               $taglist = get_page_keywords($item["plink"], $preview, ($contact["fetch_further_information"] == 2), $contact["ffi_keyword_blacklist"]);
                                $item["object-type"] = Activity\ObjectType::BOOKMARK;
                                unset($item["attach"]);
                        } else {
@@ -460,14 +486,17 @@ class Feed {
                                        $item["body"] = '[abstract]' . HTML::toBBCode($summary, $basepath) . "[/abstract]\n" . $item["body"];
                                }
 
-                               if ($contact["fetch_further_information"] == 3) {
+                               if (!empty($contact["fetch_further_information"]) && ($contact["fetch_further_information"] == 3)) {
                                        if (!empty($tags)) {
                                                $item["tag"] = $tags;
                                        } else {
                                                // @todo $preview is never set in this case, is it intended? - @MrPetovan 2018-02-13
                                                $item["tag"] = add_page_keywords($item["plink"], $preview, true, $contact["ffi_keyword_blacklist"]);
+                                               $taglist = get_page_keywords($item["plink"], $preview, true, $contact["ffi_keyword_blacklist"]);
                                        }
                                        $item["body"] .= "\n" . $item['tag'];
+                               } else {
+                                       $taglist = [];
                                }
 
                                // Add the link to the original feed entry if not present in feed
@@ -498,6 +527,13 @@ class Feed {
                                $id = Item::insert($item, false, $notify);
 
                                Logger::info("Feed for contact " . $contact["url"] . " stored under id " . $id);
+
+                               if (!empty($id) && !empty($taglist)) {
+                                       $feeditem = Item::selectFirst(['uri-id'], ['id' => $id]);
+                                       foreach ($taglist as $tag) {
+                                               Tag::store($feeditem['uri-id'], Tag::HASHTAG, $tag);
+                                       }                                       
+                               }
                        }
                }