]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/Feed.php
Merge pull request #8631 from MrPetovan/task/remove-item-tag-field
[friendica.git] / src / Protocol / Feed.php
index cbd50a0976332b5c434740da3fc89b0b62367223..35e2cd5778487d8611de09b4f389da0e86d1898d 100644 (file)
@@ -29,6 +29,7 @@ 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;
@@ -220,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;
 
@@ -232,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);
@@ -376,16 +385,10 @@ class Feed {
                                $item["attach"] .= '[attach]href="' . $href . '" length="' . $length . '" type="' . $type . '"[/attach]';
                        }
 
-                       $tags = '';
+                       $taglist = [];
                        $categories = $xpath->query("category", $entry);
                        foreach ($categories AS $category) {
-                               $hashtag = $category->nodeValue;
-                               if ($tags != '') {
-                                       $tags .= ', ';
-                               }
-
-                               $taglink = "#[url=" . DI::baseUrl() . "/search?tag=" . $hashtag . "]" . $hashtag . "[/url]";
-                               $tags .= $taglink;
+                               $taglist[] = $category->nodeValue;
                        }
 
                        $body = trim(XML::getFirstNodeValue($xpath, 'atom:content/text()', $entry));
@@ -466,7 +469,7 @@ class Feed {
                                // We always strip the title since it will be added in the page information
                                $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 {
@@ -475,13 +478,12 @@ class Feed {
                                }
 
                                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"]);
+                                       if (empty($taglist)) {
+                                               $taglist = get_page_keywords($item["plink"], $preview, true, $contact["ffi_keyword_blacklist"]);
                                        }
-                                       $item["body"] .= "\n" . $item['tag'];
+                                       $item["body"] .= "\n" . self::tagToString($taglist);
+                               } else {
+                                       $taglist = [];
                                }
 
                                // Add the link to the original feed entry if not present in feed
@@ -509,15 +511,43 @@ class Feed {
                                        $notify = PRIORITY_MEDIUM;
                                }
 
-                               $id = Item::insert($item, false, $notify);
+                               $id = Item::insert($item, $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);
+                                       }                                       
+                               }
                        }
                }
 
                return ["header" => $author, "items" => $items];
        }
 
+       /**
+        * Convert a tag array to a tag string
+        *
+        * @param array $tags
+        * @return string tag string
+        */
+       private static function tagToString(array $tags)
+       {
+               $tagstr = '';
+
+               foreach ($tags as $tag) {
+                       if ($tagstr != "") {
+                               $tagstr .= ", ";
+                       }
+       
+                       $tagstr .= "#[url=" . DI::baseUrl() . "/search?tag=" . urlencode($tag) . "]" . $tag . "[/url]";
+               }
+
+               return $tagstr;
+       }
+
        private static function titleIsBody($title, $body)
        {
                $title = strip_tags($title);