]> git.mxchange.org Git - friendica.git/commitdiff
Improvements for Youtube posta via API
authorMichael <heluecht@pirati.ca>
Tue, 1 Aug 2023 14:27:56 +0000 (14:27 +0000)
committerMichael <heluecht@pirati.ca>
Tue, 1 Aug 2023 14:27:56 +0000 (14:27 +0000)
src/Content/Text/BBCode.php
src/Module/Api/Mastodon/Statuses.php

index f40160c9de9138ecf015ba15038cac81f11386ca..ab7300da18b5c3e4f35b4bed9745374aee45bde5 100644 (file)
@@ -1158,6 +1158,40 @@ class BBCode
                return $match[1] . '[url=' . $data['url'] . ']' . $data['nick'] . '[/url]';
        }
 
+       /**
+        * Normalize links to Youtube and Vimeo to a unified format.
+        *
+        * @param string $text
+        * @return string
+        */
+       private static function normalizeVideoLinks(string $text): string
+       {
+               $text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
+               $text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
+               $text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/shorts\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
+               $text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
+
+               $text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism", '[vimeo]$1[/vimeo]', $text);
+               $text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism", '[vimeo]$1[/vimeo]', $text);
+
+               return $text;
+       }
+
+       /**
+        * Expand Youtube and Vimeo links to 
+        *
+        * @param string $text
+        * @return string
+        */
+       public static function expandVideoLinks(string $text): string
+       {
+               $text = self::normalizeVideoLinks($text);
+               $text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '[url=https://www.youtube.com/watch?v=$1]https://www.youtube.com/watch?v=$1[/url]', $text);
+               $text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '[url=https://vimeo.com/$1]https://vimeo.com/$1[/url]', $text);
+
+               return $text;
+       }
+
        /**
         * Converts a BBCode message for a given URI-ID to a HTML message
         *
@@ -1655,12 +1689,9 @@ class BBCode
                                // Backward compatibility, [iframe] support has been removed in version 2020.12
                                $text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1">$1</a>', $text);
 
-                               // Youtube extensions
-                               $text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
-                               $text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
-                               $text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/shorts\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
-                               $text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
+                               $text = self::normalizeVideoLinks($text);
 
+                               // Youtube extensions
                                if ($try_oembed) {
                                        $text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '<iframe width="' . $a->getThemeInfoValue('videowidth') . '" height="' . $a->getThemeInfoValue('videoheight') . '" src="https://www.youtube.com/embed/$1" frameborder="0" ></iframe>', $text);
                                } else {
@@ -1671,9 +1702,7 @@ class BBCode
                                        );
                                }
 
-                               $text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism", '[vimeo]$1[/vimeo]', $text);
-                               $text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism", '[vimeo]$1[/vimeo]', $text);
-
+                               // Vimeo extensions
                                if ($try_oembed) {
                                        $text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '<iframe width="' . $a->getThemeInfoValue('videowidth') . '" height="' . $a->getThemeInfoValue('videoheight') . '" src="https://player.vimeo.com/video/$1" frameborder="0" ></iframe>', $text);
                                } else {
index dad0451fc424ad00c16fb7ad5eaffac4cb64524b..a8f1dc1c66353bee2205465055d14ebafb198b35 100644 (file)
@@ -76,16 +76,9 @@ class Statuses extends BaseApi
                        throw new HTTPException\NotFoundException('Item with URI ID ' . $this->parameters['id'] . ' not found for user ' . $uid . '.');
                }
 
-               // The imput is defined as text. So we can use Markdown for some enhancements
-               $body = Markdown::toBBCode($request['status']);
-
-               if (DI::pConfig()->get($uid, 'system', 'api_auto_attach', false) && preg_match("/\[url=[^\[\]]*\](.*)\[\/url\]\z/ism", $body, $matches)) {
-                       $body = preg_replace("/\[url=[^\[\]]*\].*\[\/url\]\z/ism", PageInfo::getFooterFromUrl($matches[1]), $body);
-               }
-
                $item['title']      = '';
                $item['uid']        = $post['uid'];
-               $item['body']       = $body;
+               $item['body']       = $this->formatStatus($request['status'], $uid);
                $item['network']    = $post['network'];
                $item['gravity']    = $post['gravity'];
                $item['verb']       = $post['verb'];
@@ -190,13 +183,6 @@ class Statuses extends BaseApi
 
                $owner = User::getOwnerDataById($uid);
 
-               // The imput is defined as text. So we can use Markdown for some enhancements
-               $body = Markdown::toBBCode($request['status']);
-
-               if (DI::pConfig()->get($uid, 'system', 'api_auto_attach', false) && preg_match("/\[url=[^\[\]]*\](.*)\[\/url\]\z/ism", $body, $matches)) {
-                       $body = preg_replace("/\[url=[^\[\]]*\].*\[\/url\]\z/ism", PageInfo::getFooterFromUrl($matches[1]), $body);
-               }
-
                $item               = [];
                $item['network']    = Protocol::DFRN;
                $item['uid']        = $uid;
@@ -204,7 +190,7 @@ class Statuses extends BaseApi
                $item['contact-id'] = $owner['id'];
                $item['author-id']  = $item['owner-id'] = Contact::getPublicIdByUserId($uid);
                $item['title']      = '';
-               $item['body']       = $body;
+               $item['body']       = $this->formatStatus($request['status'], $uid);
                $item['app']        = $this->getApp();
 
                switch ($request['visibility']) {
@@ -415,4 +401,28 @@ class Statuses extends BaseApi
                }
                return $item;
        }
+
+       /**
+        * Format the status via Markdown and a link description if enabled for this user
+        *
+        * @param string $status
+        * @param integer $uid
+        * @return string
+        */
+       private function formatStatus(string $status, int $uid): string
+       {
+               // The input is defined as text. So we can use Markdown for some enhancements
+               $status = Markdown::toBBCode($status);
+
+               if (!DI::pConfig()->get($uid, 'system', 'api_auto_attach', false)) {
+                       return $status;
+               }
+
+               $status = BBCode::expandVideoLinks($status);
+               if (preg_match("/\[url=[^\[\]]*\](.*)\[\/url\]\z/ism", $status, $matches)) {
+                       $status = preg_replace("/\[url=[^\[\]]*\].*\[\/url\]\z/ism", PageInfo::getFooterFromUrl($matches[1]), $status);
+               }
+               
+               return $status;
+       }
 }