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, true, 512, \JSON_THROW_ON_ERROR); $ret = [ 'title' => $json['title'] ?? null, 'thumbnail_url' => $json['thumbnail_url'] ?? null, ]; $cache_timeout = self::DEFAULT_CACHE_TIMEOUT; if (isset($json['cache_age'])) { $cache_age = \intval($json['cache_age']); if ($cache_age > 0) { $cache_age = \max($cache_age, self::MIN_CACHE_TIMEOUT); } } $this->cache->set("oembed_embedder_$provider_url$url", $ret, $cache_timeout); } $resp = new OembedResponse(); $resp->title = $ret['title']; $resp->thumbnail_url = $ret['thumbnail_url']; return $resp; } }