]> git.mxchange.org Git - friendica.git/commitdiff
Create event for oembed_fetch_url hook
authorArt4 <art4@wlabs.de>
Fri, 14 Feb 2025 12:11:17 +0000 (12:11 +0000)
committerArt4 <art4@wlabs.de>
Fri, 14 Feb 2025 12:11:17 +0000 (12:11 +0000)
src/Content/OEmbed.php
src/Core/Hooks/HookEventBridge.php
src/Event/ArrayFilterEvent.php
tests/Unit/Core/Hooks/HookEventBridgeTest.php
tests/Unit/Event/ArrayFilterEventTest.php

index 599d3dc8f77416678375bc8a0d49c0c9afaf0f04..217f42f0ebeb698e44b9259cf6af099b8e9b2461 100644 (file)
@@ -13,11 +13,11 @@ use DOMXPath;
 use Exception;
 use Friendica\Content\Text\BBCode;
 use Friendica\Core\Cache\Enum\Duration;
-use Friendica\Core\Hook;
 use Friendica\Core\Renderer;
 use Friendica\Database\Database;
 use Friendica\Database\DBA;
 use Friendica\DI;
+use Friendica\Event\ArrayFilterEvent;
 use Friendica\Network\HTTPClient\Client\HttpClientAccept;
 use Friendica\Network\HTTPClient\Client\HttpClientOptions;
 use Friendica\Network\HTTPClient\Client\HttpClientRequest;
@@ -180,9 +180,15 @@ class OEmbed
                        $oembed->thumbnail_height = $data['images'][0]['height'];
                }
 
-               Hook::callAll('oembed_fetch_url', $embedurl);
+               $eventDispatcher = DI::eventDispatcher();
 
-               return $oembed;
+               $oembed_data = ['url' => $embedurl];
+
+               $oembed_data = $eventDispatcher->dispatch(
+                       new ArrayFilterEvent(ArrayFilterEvent::OEMBED_FETCH_END, $oembed_data),
+               )->getArray();
+
+               return $oembed_data['url'] ?? $embedurl;
        }
 
        /**
index 1a517a712c944ccc8e47f0c53fc90fa0e41d9e1b..031b92834bb94776185a2f1ca3405dc9fc8ae5b7 100644 (file)
@@ -52,6 +52,7 @@ final class HookEventBridge
                ArrayFilterEvent::DISPLAY_ITEM       => 'display_item',
                ArrayFilterEvent::RENDER_LOCATION    => 'render_location',
                ArrayFilterEvent::ITEM_PHOTO_MENU    => 'item_photo_menu',
+               ArrayFilterEvent::OEMBED_FETCH_END   => 'oembed_fetch_url',
                HtmlFilterEvent::HEAD                => 'head',
                HtmlFilterEvent::FOOTER              => 'footer',
                HtmlFilterEvent::PAGE_HEADER         => 'page_header',
@@ -83,6 +84,7 @@ final class HookEventBridge
                        ArrayFilterEvent::DISPLAY_ITEM       => 'onArrayFilterEvent',
                        ArrayFilterEvent::RENDER_LOCATION    => 'onArrayFilterEvent',
                        ArrayFilterEvent::ITEM_PHOTO_MENU    => 'onArrayFilterEvent',
+                       ArrayFilterEvent::OEMBED_FETCH_END   => 'onOembedFetchEndEvent',
                        HtmlFilterEvent::HEAD                => 'onHtmlFilterEvent',
                        HtmlFilterEvent::FOOTER              => 'onHtmlFilterEvent',
                        HtmlFilterEvent::PAGE_HEADER         => 'onHtmlFilterEvent',
@@ -109,6 +111,20 @@ final class HookEventBridge
                );
        }
 
+       /**
+        * Map the OEMBED_FETCH_END event to `oembed_fetch_url` hook
+        */
+       public static function onOembedFetchEndEvent(ArrayFilterEvent $event): void
+       {
+               $data = $event->getArray();
+
+               $url = (string) $data['url'] ?? '';
+
+               $data['url'] = static::callHook($event->getName(), $url);
+
+               $event->setArray($data);
+       }
+
        public static function onArrayFilterEvent(ArrayFilterEvent $event): void
        {
                $event->setArray(
index 2c37cb8f27ac52496bf8bbe95e53ca17e54dc8ee..47beddc8661d7fd38c1e721cc14c8d7cf02ec7f2 100644 (file)
@@ -42,6 +42,8 @@ final class ArrayFilterEvent extends Event
 
        public const ITEM_PHOTO_MENU = 'friendica.data.item_photo_menu';
 
+       public const OEMBED_FETCH_END = 'friendica.data.oembed_fetch_end';
+
        private array $array;
 
        public function __construct(string $name, array $array)
index e65ebaa6c8b9aab43dad9a2bb05ff7f7a28f64c0..ea46230399d03ce100c6cb32df63398d13e89a33 100644 (file)
@@ -41,6 +41,7 @@ class HookEventBridgeTest extends TestCase
                        ArrayFilterEvent::DISPLAY_ITEM       => 'onArrayFilterEvent',
                        ArrayFilterEvent::RENDER_LOCATION    => 'onArrayFilterEvent',
                        ArrayFilterEvent::ITEM_PHOTO_MENU    => 'onArrayFilterEvent',
+                       ArrayFilterEvent::OEMBED_FETCH_END   => 'onOembedFetchEndEvent',
                        HtmlFilterEvent::HEAD                => 'onHtmlFilterEvent',
                        HtmlFilterEvent::FOOTER              => 'onHtmlFilterEvent',
                        HtmlFilterEvent::PAGE_HEADER         => 'onHtmlFilterEvent',
@@ -156,6 +157,28 @@ class HookEventBridgeTest extends TestCase
                HookEventBridge::onCollectRoutesEvent($event);
        }
 
+       public function testOnOembedFetchEndEventCallsHookWithCorrectValue(): void
+       {
+               $event = new ArrayFilterEvent(ArrayFilterEvent::OEMBED_FETCH_END, ['url' => 'original_url']);
+
+               $reflectionProperty = new \ReflectionProperty(HookEventBridge::class, 'mockedCallHook');
+               $reflectionProperty->setAccessible(true);
+
+               $reflectionProperty->setValue(null, function (string $name, $data): string  {
+                       $this->assertSame('oembed_fetch_url', $name);
+                       $this->assertSame('original_url', $data);
+
+                       return 'changed_url';
+               });
+
+               HookEventBridge::onOembedFetchEndEvent($event);
+
+               $this->assertSame(
+                       ['url' => 'changed_url'],
+                       $event->getArray(),
+               );
+       }
+
        public static function getArrayFilterEventData(): array
        {
                return [
index 4ed37337c7a9ac8fde44feff0082a01b9e7747c2..26ff604170e2d1f69f81a2fdee13a9c9434e4b90 100644 (file)
@@ -38,6 +38,7 @@ class ArrayFilterEventTest extends TestCase
                        [ArrayFilterEvent::DISPLAY_ITEM, 'friendica.data.display_item'],
                        [ArrayFilterEvent::RENDER_LOCATION, 'friendica.data.render_location'],
                        [ArrayFilterEvent::ITEM_PHOTO_MENU, 'friendica.data.item_photo_menu'],
+                       [ArrayFilterEvent::OEMBED_FETCH_END, 'friendica.data.oembed_fetch_end'],
                ];
        }