X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FFeed.php;h=0abd49c4627e7e234114f152066ee5f103086332;hb=ba4860b7879f0dc6ea7a2dd0d09e698a913a9129;hp=6428fca66277ed70150b0a63c8abaefe551e532b;hpb=e3aed8099c1605e1b15b70f74b94540f4512c829;p=friendica.git diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php index 6428fca662..0abd49c462 100644 --- a/src/Protocol/Feed.php +++ b/src/Protocol/Feed.php @@ -1,6 +1,6 @@ query('/rdf:RDF/rss:channel')->length > 0) { + $protocol = Conversation::PARCEL_RDF; $author['author-link'] = XML::getFirstNodeValue($xpath, '/rdf:RDF/rss:channel/rss:link/text()'); $author['author-name'] = XML::getFirstNodeValue($xpath, '/rdf:RDF/rss:channel/rss:title/text()'); @@ -112,6 +118,7 @@ class Feed // Is it Atom? if ($xpath->query('/atom:feed')->length > 0) { + $protocol = Conversation::PARCEL_ATOM; $alternate = XML::getFirstAttributes($xpath, "atom:link[@rel='alternate']"); if (is_object($alternate)) { foreach ($alternate as $attribute) { @@ -195,6 +202,7 @@ class Feed // Is it RSS? if ($xpath->query('/rss/channel')->length > 0) { + $protocol = Conversation::PARCEL_RSS; $author['author-link'] = XML::getFirstNodeValue($xpath, '/rss/channel/link/text()'); $author['author-name'] = XML::getFirstNodeValue($xpath, '/rss/channel/title/text()'); @@ -247,18 +255,21 @@ class Feed $author['owner-avatar'] = $contact['thumb']; } - $header = []; - $header['uid'] = $importer['uid'] ?? 0; - $header['network'] = Protocol::FEED; - $header['wall'] = 0; - $header['origin'] = 0; - $header['gravity'] = GRAVITY_PARENT; - $header['private'] = Item::PUBLIC; - $header['verb'] = Activity::POST; - $header['object-type'] = Activity\ObjectType::NOTE; - $header['post-type'] = Item::PT_ARTICLE; - - $header['contact-id'] = $contact['id'] ?? 0; + $header = [ + 'uid' => $importer['uid'] ?? 0, + 'network' => Protocol::FEED, + 'wall' => 0, + 'origin' => 0, + 'gravity' => Item::GRAVITY_PARENT, + 'private' => Item::PUBLIC, + 'verb' => Activity::POST, + 'object-type' => Activity\ObjectType::NOTE, + 'post-type' => Item::PT_ARTICLE, + 'contact-id' => $contact['id'] ?? 0, + ]; + + $datarray['protocol'] = $protocol; + $datarray['direction'] = Conversation::PULL; if (!is_object($entries)) { Logger::info("There are no entries in this feed."); @@ -313,7 +324,7 @@ class Feed $item['uri'] = $guid; // Don't use the GUID value directly but instead use it as a basis for the GUID - $item['guid'] = Item::guidFromUri($guid, parse_url($guid, PHP_URL_HOST) ?? parse_url($item['plink'], PHP_URL_HOST) ?? ''); + $item['guid'] = Item::guidFromUri($guid, parse_url($guid, PHP_URL_HOST) ?? parse_url($item['plink'], PHP_URL_HOST)); } if (empty($item['uri'])) { @@ -365,11 +376,11 @@ class Feed } if ($published != '') { - $item['created'] = $published; + $item['created'] = trim($published); } if ($updated != '') { - $item['edited'] = $updated; + $item['edited'] = trim($updated); } if (!$dryRun) { @@ -428,7 +439,7 @@ class Feed } if (!empty($href)) { - $attachment = ['type' => Post\Media::UNKNOWN, 'url' => $href, 'mimetype' => $type, 'size' => $length]; + $attachment = ['uri-id' => -1, 'type' => Post\Media::UNKNOWN, 'url' => $href, 'mimetype' => $type, 'size' => $length]; $attachment = Post\Media::fetchAdditionalData($attachment); @@ -613,17 +624,18 @@ class Feed Logger::info('Stored feed', ['item' => $item]); $notify = Item::isRemoteSelf($contact, $item); + $item['wall'] = (bool)$notify; - // Distributed items should have a well formatted URI. - // Additionally we have to avoid conflicts with identical URI between imported feeds and these items. + // Distributed items should have a well-formatted URI. + // Additionally, we have to avoid conflicts with identical URI between imported feeds and these items. if ($notify) { $item['guid'] = Item::guidFromUri($orig_plink, DI::baseUrl()->getHostname()); - $item['uri'] = Item::newURI($item['uid'], $item['guid']); + $item['uri'] = Item::newURI($item['guid']); unset($item['thr-parent']); unset($item['parent-uri']); // Set the delivery priority for "remote self" to "medium" - $notify = PRIORITY_MEDIUM; + $notify = Worker::PRIORITY_MEDIUM; } $condition = ['uid' => $item['uid'], 'uri' => $item['uri']]; @@ -905,28 +917,23 @@ class Feed * Updates the provided last_update parameter if the result comes from the * cache or it is empty * - * @param string $owner_nick Nickname of the feed owner + * @param array $owner owner-view record of the feed owner * @param string $last_update Date of the last update * @param integer $max_items Number of maximum items to fetch * @param string $filter Feed items filter (activity, posts or comments) * @param boolean $nocache Wether to bypass caching * * @return string Atom feed - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws HTTPException\InternalServerErrorException * @throws \ImagickException */ - public static function atom(string $owner_nick, string $last_update, int $max_items = 300, string $filter = 'activity', bool $nocache = false) + public static function atom(array $owner, string $last_update, int $max_items = 300, string $filter = 'activity', bool $nocache = false) { $stamp = microtime(true); - $owner = User::getOwnerDataByNick($owner_nick); - if (!$owner) { - return; - } - - $cachekey = 'feed:feed:' . $owner_nick . ':' . $filter . ':' . $last_update; + $cachekey = 'feed:feed:' . $owner['nickname'] . ':' . $filter . ':' . $last_update; - // Display events in the users's timezone + // Display events in the user's timezone if (strlen($owner['timezone'])) { DI::app()->setTimeZone($owner['timezone']); } @@ -937,7 +944,7 @@ class Feed if ((time() - strtotime($owner['last-item'])) < 15*60) { $result = DI::cache()->get($cachekey); if (!$nocache && !is_null($result)) { - Logger::info('Cached feed duration', ['seconds' => number_format(microtime(true) - $stamp, 3), 'nick' => $owner_nick, 'filter' => $filter, 'created' => $previous_created]); + Logger::info('Cached feed duration', ['seconds' => number_format(microtime(true) - $stamp, 3), 'nick' => $owner['nickname'], 'filter' => $filter, 'created' => $previous_created]); return $result['feed']; } } @@ -947,13 +954,13 @@ class Feed $condition = ["`uid` = ? AND `received` > ? AND NOT `deleted` AND `gravity` IN (?, ?) AND `private` != ? AND `visible` AND `wall` AND `parent-network` IN (?, ?, ?, ?)", - $owner['uid'], $check_date, GRAVITY_PARENT, GRAVITY_COMMENT, + $owner['uid'], $check_date, Item::GRAVITY_PARENT, Item::GRAVITY_COMMENT, Item::PRIVATE, Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DFRN, Protocol::DIASPORA]; if ($filter === 'comments') { $condition[0] .= " AND `gravity` = ? "; - $condition[] = GRAVITY_COMMENT; + $condition[] = Item::GRAVITY_COMMENT; } if ($owner['account-type'] != User::ACCOUNT_TYPE_COMMUNITY) { @@ -991,7 +998,7 @@ class Feed $msg = ['feed' => $feeddata, 'last_update' => $last_update]; DI::cache()->set($cachekey, $msg, Duration::QUARTER_HOUR); - Logger::info('Feed duration', ['seconds' => number_format(microtime(true) - $stamp, 3), 'nick' => $owner_nick, 'filter' => $filter, 'created' => $previous_created]); + Logger::info('Feed duration', ['seconds' => number_format(microtime(true) - $stamp, 3), 'nick' => $owner['nickname'], 'filter' => $filter, 'created' => $previous_created]); return $feeddata; } @@ -1027,8 +1034,8 @@ class Feed break; } - $attributes = ['uri' => 'https://friendi.ca', 'version' => FRIENDICA_VERSION . '-' . DB_UPDATE_VERSION]; - XML::addElement($doc, $root, 'generator', FRIENDICA_PLATFORM, $attributes); + $attributes = ['uri' => 'https://friendi.ca', 'version' => App::VERSION . '-' . DB_UPDATE_VERSION]; + XML::addElement($doc, $root, 'generator', App::PLATFORM, $attributes); XML::addElement($doc, $root, 'id', DI::baseUrl() . '/profile/' . $owner['nick']); XML::addElement($doc, $root, 'title', $title); XML::addElement($doc, $root, 'subtitle', sprintf("Updates from %s on %s", $owner['name'], DI::config()->get('config', 'sitename'))); @@ -1080,7 +1087,7 @@ class Feed */ private static function noteEntry(DOMDocument $doc, array $item, array $owner): DOMElement { - if (($item['gravity'] != GRAVITY_PARENT) && (Strings::normaliseLink($item['author-link']) != Strings::normaliseLink($owner['url']))) { + if (($item['gravity'] != Item::GRAVITY_PARENT) && (Strings::normaliseLink($item['author-link']) != Strings::normaliseLink($owner['url']))) { Logger::info('Feed entry author does not match feed owner', ['owner' => $owner['url'], 'author' => $item['author-link']]); } @@ -1115,7 +1122,7 @@ class Feed XML::addElement($doc, $entry, 'id', $item['uri']); XML::addElement($doc, $entry, 'title', html_entity_decode($title, ENT_QUOTES, 'UTF-8')); - $body = OStatus::formatPicturePost($item['body'], $item['uri-id']); + $body = Post\Media::addAttachmentsToBody($item['uri-id'], DI::contentItem()->addSharedPost($item)); $body = BBCode::convertForUriId($item['uri-id'], $body, BBCode::ACTIVITYPUB); @@ -1144,7 +1151,7 @@ class Feed { $mentioned = []; - if ($item['gravity'] != GRAVITY_PARENT) { + if ($item['gravity'] != Item::GRAVITY_PARENT) { $parent = Post::selectFirst(['guid', 'author-link', 'owner-link'], ['id' => $item['parent']]); $thrparent = Post::selectFirst(['guid', 'author-link', 'owner-link', 'plink'], ['uid' => $owner['uid'], 'uri' => $item['thr-parent']]);