diff --git a/core/modules/media/src/OEmbed/UrlResolver.php b/core/modules/media/src/OEmbed/UrlResolver.php index 5985e6874ad..c8c2d4ee48c 100644 --- a/core/modules/media/src/OEmbed/UrlResolver.php +++ b/core/modules/media/src/OEmbed/UrlResolver.php @@ -158,10 +158,8 @@ class UrlResolver implements UrlResolverInterface { } $provider = $this->getProviderByUrl($url); - $endpoints = $provider->getEndpoints(); - $endpoint = reset($endpoints); - $resource_url = $endpoint->buildResourceUrl($url); + $resource_url = $this->getEndpointMatchingUrl($url, $provider); $parsed_url = UrlHelper::parse($resource_url); if ($max_width) { $parsed_url['query']['maxwidth'] = $max_width; @@ -181,4 +179,27 @@ class UrlResolver implements UrlResolverInterface { return $resource_url; } + /** + * For the given media item URL find an endpoint with schemes that match. + * + * @param string $url + * The media URL used to lookup the matching endpoint. + * @param \Drupal\media\OEmbed\Provider $provider + * The oEmbed provider for the asset. + * + * @return string + * The resource url. + */ + protected function getEndpointMatchingUrl($url, Provider $provider) { + $endpoints = $provider->getEndpoints(); + $resource_url = reset($endpoints)->buildResourceUrl($url); + foreach ($endpoints as $endpoint) { + if ($endpoint->matchUrl($url)) { + $resource_url = $endpoint->buildResourceUrl($url); + break; + } + } + return $resource_url ?? reset($endpoints)->buildResourceUrl($url); + } + } diff --git a/core/modules/media/tests/fixtures/oembed/providers.json b/core/modules/media/tests/fixtures/oembed/providers.json index 3ff7de23c70..9791d7378dc 100644 --- a/core/modules/media/tests/fixtures/oembed/providers.json +++ b/core/modules/media/tests/fixtures/oembed/providers.json @@ -72,5 +72,35 @@ "discovery": true } ] + }, + { + "provider_name": "Facebook", + "provider_url": "https:\/\/www.facebook.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.facebook.com\/*\/posts\/*", + "https:\/\/www.facebook.com\/photos\/*", + "https:\/\/www.facebook.com\/*\/photos\/*", + "https:\/\/www.facebook.com\/photo.php*", + "https:\/\/www.facebook.com\/photo.php", + "https:\/\/www.facebook.com\/*\/activity\/*", + "https:\/\/www.facebook.com\/permalink.php", + "https:\/\/www.facebook.com\/media\/set?set=*", + "https:\/\/www.facebook.com\/questions\/*", + "https:\/\/www.facebook.com\/notes\/*\/*\/*" + ], + "url": "https:\/\/www.facebook.com\/plugins\/post\/oembed.json", + "discovery": true + }, + { + "schemes": [ + "https:\/\/www.facebook.com\/*\/videos\/*", + "https:\/\/www.facebook.com\/video.php" + ], + "url": "https:\/\/www.facebook.com\/plugins\/video\/oembed.json", + "discovery": true + } + ] } ] diff --git a/core/modules/media/tests/src/Functional/UrlResolverTest.php b/core/modules/media/tests/src/Functional/UrlResolverTest.php index ff826c24cb7..7668d69357d 100644 --- a/core/modules/media/tests/src/Functional/UrlResolverTest.php +++ b/core/modules/media/tests/src/Functional/UrlResolverTest.php @@ -50,6 +50,10 @@ class UrlResolverTest extends MediaFunctionalTestBase { 'http://www.collegehumor.com/video/40002870/lets-not-get-a-drink-sometime', 'http://www.collegehumor.com/oembed.json?url=http://www.collegehumor.com/video/40002870/lets-not-get-a-drink-sometime', ], + 'match by endpoint: Facebook' => [ + 'https://www.facebook.com/facebook/videos/10153231379946729/', + 'https://www.facebook.com/plugins/video/oembed.json?url=https://www.facebook.com/facebook/videos/10153231379946729/', + ], ]; }