From 231fcb9ca9d501e153ae744e3802a9f40f525c7b Mon Sep 17 00:00:00 2001 From: Zankaria Date: Sun, 16 Mar 2025 23:26:45 +0100 Subject: [PATCH] OembedExtractor.php: add extractor --- inc/Services/Embed/OembedExtractor.php | 70 ++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 inc/Services/Embed/OembedExtractor.php diff --git a/inc/Services/Embed/OembedExtractor.php b/inc/Services/Embed/OembedExtractor.php new file mode 100644 index 00000000..e4706859 --- /dev/null +++ b/inc/Services/Embed/OembedExtractor.php @@ -0,0 +1,70 @@ +cache = $cache; + $this->http = $http; + $this->provider_timeout = $provider_timeout; + } + + /** + * Fetch the oembed data from the given provider with the given url. + * + * @param string $identifier Opaque identifier for caching, must be unique for each $url-$provider combination. + * @return OembedResponse The serialized remove response. May be cached. + */ + public function fetch(string $provider_url, string $url): OembedResponse { + $ret = $this->cache->get("oembed_embedder_$provider_url$url"); + if ($ret === null) { + $body = $this->http->requestGet( + $provider_url, + [ + 'url' => $url, + 'format' => 'json' + ], + [ + 'Content-Type: application/json' + ], + $this->provider_timeout + ); + $json = \json_decode($body, null, 512, \JSON_THROW_ON_ERROR); + + if (!isset($json['title'])) { + throw new \RuntimeException("Missing type in response from $provider_url"); + } + $ret = [ + 'type' => $json['type'], + 'title' => $json['title'], + 'cache_age' => $json['cache_age'], + 'thumbnail_url' => $json['thumbnail_url'], + 'thumbnail_width' => $json['thumbnail_width'], + 'thumbnail_height' => $json['thumbnail_heigh'] + ]; + + $cache_timeout = $ret['cache_age'] ?? self::DEFAULT_CACHE_TIMEOUT; + + $this->cache->set("oembed_embedder_$url$provider_url", $ret, $cache_timeout); + } + + $resp = new OembedResponse(); + $resp->type = $ret['title']; + $resp->title = $ret['title'] ?? null; + $resp->cache_age = $ret['cache_age'] ?? null; + $resp->thumbnail_url = $ret['thumbnail_url'] ?? null; + $resp->thumbnail_width = $ret['thumbnail_width'] ?? null; + $resp->thumbnail_height = $ret['thumbnail_height'] ?? null; + return $ret; + } +}