From 59b3c7507c2ce94fc9f5ecf4c5ee8e6de7978f9c Mon Sep 17 00:00:00 2001 From: Brian Moon Date: Tue, 27 Jun 2023 18:23:14 -0500 Subject: [PATCH 1/4] Load all JSON-LD data The LinkedData class was only grabbing the first application/ld+json script tag found in the DOM. It now finds them all and makes them all available via the getAll method. Additionally, it inspects the mainEntityOfPage property of the json nodes and if a match is found with the request URI, that node is assigned as the default node rather than the first node found. --- src/LinkedData.php | 57 +- src/functions.php | 22 + tests/PagesTest.php | 2 +- tests/PagesTestCase.php | 1 + ...es.ml.0bcc06470676961770c2d2357693454b.php | 56 ++ ...com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.ph | 50 ++ ...om.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php | 50 ++ ...38251239-taganay-park-by-daniel-kordan.php | 3 +- ...nimoto.com.play-gjsj1gu0wdrfr4pgw12xzq.php | 3 +- .../archive.org.details-dn2015-0220_vid.php | 17 + .../archive.org.details-librivoxaudio.php | 3 +- tests/fixtures/buff.ly.2usohds.php | 69 +- ...embed.95ba7bc228ac2f81591bfa9cd9d2da50.php | 3 +- .../cdn2.thecatapi.com.images-cjd.jpg.php | 3 +- tests/fixtures/chirb.it.7a9l9b.php | 3 +- .../fixtures/codepen.io.zhouzi-pen-jorazp.php | 3 +- ...-videos-bucket-sample-bigbuckbunny.mp4.php | 3 +- ...s.ml.0bcc06470676961770c2d2357693454b.php} | 3 +- ...m.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php} | 3 +- ...le-d-0b2rwn8wabvswbmfjdudnv2vsttg-view.php | 3 +- .../en.wikipedia.org.wiki-albert_einstein.php | 26 + .../gist.github.com.oscarotero-7749998.php | 3 +- ...c-wifi-social-blob-master-bars.geojson.php | 3 +- ...rotero-embed-blob-master-composer.json.php | 3 +- ...ret-bear-clip-blob-master-stl-clip.stl.php | 3 +- ...rather-ok.tumblr.com.post-165326273724.php | 11 + tests/fixtures/i.imgur.com.x6rkcc5.jpg.php | 3 +- tests/fixtures/ideone.com.whjntg.php | 3 +- tests/fixtures/imageshack.com.i-ip7wo0v7j.php | 3 +- ...m.7743c36a-f3ca-4465-9a80-a8abbd5d8dc4.php | 3 +- ...an.bandcamp.com.track-coquin-l-l-phant.php | 148 +++- tests/fixtures/jsfiddle.net.zhm5rjnz.php | 3 +- tests/fixtures/live.amcharts.com.cznjj.php | 3 +- ....html.c07885ac4c85b35f31f6dc858d4d64b0.php | 3 +- ...otify.com.album-7s66wu1xj2nsuuwm2nkiuv.php | 745 ++++++++++++++++++ tests/fixtures/output.jsbin.com.vonesu-10.php | 3 +- ...unka.deviantart.com.art-cope-145564099.php | 3 +- tests/fixtures/pastebin.com.d4biutrm.php | 3 +- ...denaser.com.audio-001rd010000004275766.php | 39 +- ...otify.com.album-7s66wu1xj2nsuuwm2nkiuv.php | 745 ++++++++++++++++++ tests/fixtures/polldaddy.com.poll-7012505.php | 3 +- ...smeister.com.gist-1122e441f0434ec6eb2a.php | 3 +- .../slides.com.alexwalker-responsive-svg.php | 3 +- ...4-better-html-5-basic-starter-template.php | 3 +- .../soundcloud.com.bruceneilmusic.php | 3 +- ...didthat-1-lowe-ct-cape-times-world-cup.php | 3 +- ...twin-shadow-lost-you-feat-dangelo-lacy.php | 3 +- ...om.pepephone-status-436461658601713664.php | 1 + tests/fixtures/vimeo.com.235352744.php | 55 ++ ...e-ross-optimize-image-files-like-a-pro.php | 34 + .../www.23hq.com.zzleeper-photo-16600737.php | 3 +- tests/fixtures/www.abanca.com.gl.php | 19 +- ...s-is-purrfect-595fe75985eb42109b69bedb.php | 3 +- .../www.bbc.co.uk.news-uk-54222286.php | 38 +- .../www.dailymotion.com.video-xy0wd.php | 3 +- ...www.deviantart.com.art-misty-510056679.php | 3 +- ...tos-desescribir-sets-72157650686499888.php | 102 ++- .../www.flickr.com.photos-desescribir.php | 64 ++ ...joe-baker-arrested-public-intoxication.php | 35 +- ...2363698-good-seed-craft-veggie-burgers.php | 3 +- ...etup.com.es-gpul-labs-events-248885422.php | 76 +- ...w.pinterest.com.pin-106890191127977979.php | 3 +- ...-george-w-bush-second-term-101314.html.php | 3 +- ...cyrptocurrencies_i_can_say_almost_with.php | 3 +- ...derstory-vegetation-in-dry-u-s-forests.php | 23 + ...com.examples-mp3-soundhelix-song-1.mp3.php | 3 +- ...angelclark-angel-clark-ice-cream-tocos.php | 3 +- ...world.07a0d4dfc7fba14d52025577270bbe9c.php | 3 +- ...m.a3noticias-video-6806030056956251397.php | 3 +- tests/fixtures/www.twitch.tv.twit.php | 3 +- .../www.twitch.tv.videos-106400740.php | 3 +- .../www.twitch.tv.videos-72749628.php | 3 +- ...nel-red-shoes-billiards-60803-camera-1.php | 3 +- tests/fixtures/www.viddler.com.v-bdce8c7.php | 3 +- ....com..1202600986b37d2c6a30336f82c671f8.php | 585 ++++++++++++++ ...ylist.13d1655ccf6cbdc1fc0162c6a02f822a.php | 3 +- ...watch.878f5352b6f0e632a763ebf05fb48b16.php | 3 +- tests/fixtures/youtu.be.eihxasgrtca.php | 3 +- 78 files changed, 3141 insertions(+), 85 deletions(-) create mode 100644 tests/cache/consent.google.es.ml.0bcc06470676961770c2d2357693454b.php create mode 100644 tests/cache/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.ph create mode 100644 tests/cache/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php rename tests/fixtures/{consent.google.es.https-consent.google.es-ml.20a3573a47b367de5e1ec943cfa5600f.php => consent.google.es.ml.0bcc06470676961770c2d2357693454b.php} (94%) rename tests/fixtures/{consent.youtube.com.https-consent.youtube.com-ml.1e8880920f82edebd2e133df8917d407.php => consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php} (94%) diff --git a/src/LinkedData.php b/src/LinkedData.php index 1e3962d6..c3ed89db 100644 --- a/src/LinkedData.php +++ b/src/LinkedData.php @@ -4,6 +4,7 @@ namespace Embed; use Exception; +use ML\JsonLD\JsonLD; use ML\JsonLD\Document as LdDocument; use ML\JsonLD\DocumentInterface; use ML\JsonLD\GraphInterface; @@ -16,7 +17,9 @@ class LinkedData private ?DocumentInterface $document; - private function get(string ...$keys) + private array $allData; + + public function get(string ...$keys) { $graph = $this->getGraph(); @@ -39,6 +42,15 @@ private function get(string ...$keys) return null; } + public function getAll() + { + if (!isset($this->allData)) { + $this->fetchData(); + } + + return $this->allData; + } + private function getGraph(string $name = null): ?GraphInterface { if (!isset($this->document)) { @@ -50,20 +62,55 @@ private function getGraph(string $name = null): ?GraphInterface } } - return $this->document->getGraph(); + return $this->document->getGraph($name); } protected function fetchData(): array { + $this->allData = []; + $document = $this->extractor->getDocument(); - $content = $document->select('.//script', ['type' => 'application/ld+json'])->str(); + $nodes = $document->select('.//script', ['type' => 'application/ld+json'])->strAll(); - if (empty($content)) { + if (empty($nodes)) { return []; } try { - return json_decode($content, true) ?: []; + $data = []; + $request_uri = (string)$this->extractor->getUri(); + foreach ($nodes as $node) { + $ldjson = json_decode($node, true); + if (!empty($ldjson)) { + + if (empty($data)) { + $data = $ldjson; + } elseif (isset($ldjson['mainEntityOfPage'])) { + $url = ''; + if (is_string($ldjson['mainEntityOfPage'])) { + $url = $ldjson['mainEntityOfPage']; + } elseif (isset($ldjson['mainEntityOfPage']['@id'])) { + $url = $ldjson['mainEntityOfPage']['@id']; + } + if (!empty($url) && $url == $request_uri) { + $data = $ldjson; + } + } + + // some pages with multiple ld+json blocks will put + // each block into an array (Flickr does this). Most + // appear to put an object in each ld+json block. To + // prevent them from stepping on one another, the ones + // that are not arrays will be put into an array. + if (!array_is_list($ldjson)) { + $ldjson = [$ldjson]; + } + + $this->allData = array_merge($this->allData, $ldjson); + } + } + + return $data; } catch (Exception $exception) { return []; } diff --git a/src/functions.php b/src/functions.php index 93c18edf..77712708 100644 --- a/src/functions.php +++ b/src/functions.php @@ -154,3 +154,25 @@ function isEmpty(mixed ...$values): bool return false; } + +if (!function_exists("array_is_list")) { + /** + * Polyfil for https://www.php.net/manual/en/function.array-is-list.php + * which is only available in PHP 8.1+ + * + * @param array $array The array + * + * @return bool + */ + function array_is_list(array $array): bool + { + $i = -1; + foreach ($array as $k => $v) { + ++$i; + if ($k !== $i) { + return false; + } + } + return true; + } +} diff --git a/tests/PagesTest.php b/tests/PagesTest.php index 1df17959..2161c4b8 100644 --- a/tests/PagesTest.php +++ b/tests/PagesTest.php @@ -188,8 +188,8 @@ public function testSoundCloud() public function testSpotify() { - $this->assertEmbed('https://play.spotify.com/album/7s66wU1XJ2NsUuWM2NKiUV'); $this->assertEmbed('https://open.spotify.com/album/7s66wU1XJ2NsUuWM2NKiUV'); + $this->assertEmbed('https://play.spotify.com/album/7s66wU1XJ2NsUuWM2NKiUV'); } public function testTwitch() diff --git a/tests/PagesTestCase.php b/tests/PagesTestCase.php index 56d90a01..7abdb0ff 100644 --- a/tests/PagesTestCase.php +++ b/tests/PagesTestCase.php @@ -107,6 +107,7 @@ private static function getData(Extractor $extractor): array if (method_exists($extractor, 'getApi')) { $data['api'] = $extractor->getApi()->all(); } + $data['allLinkedData'] = $extractor->getLinkedData()->getAll(); return $data; } diff --git a/tests/cache/consent.google.es.ml.0bcc06470676961770c2d2357693454b.php b/tests/cache/consent.google.es.ml.0bcc06470676961770c2d2357693454b.php new file mode 100644 index 00000000..237e70c7 --- /dev/null +++ b/tests/cache/consent.google.es.ml.0bcc06470676961770c2d2357693454b.php @@ -0,0 +1,56 @@ + [ + 'content-type' => [ + 'text/html; charset=utf-8' + ], + 'cache-control' => [ + 'no-cache, no-store, max-age=0, must-revalidate' + ], + 'pragma' => [ + 'no-cache' + ], + 'expires' => [ + 'Mon, 01 Jan 1990 00:00:00 GMT' + ], + 'date' => [ + 'Sun, 04 Apr 2021 15:20:47 GMT' + ], + 'p3p' => [ + 'CP="This is not a P3P policy! See g.co/p3phelp for more info."' + ], + 'content-security-policy' => [ + 'script-src \'nonce-g9/eaYJePAYsVh50Jyl0EQ\' \'unsafe-inline\';object-src \'none\';base-uri \'self\';report-uri /_/IdentityNotFoundHttp/cspreport;worker-src \'self\'', + 'script-src \'nonce-g9/eaYJePAYsVh50Jyl0EQ\' \'self\' https://apis.google.com https://ssl.gstatic.com https://www.google.com https://www.gstatic.com https://www.google-analytics.com;report-uri /_/IdentityNotFoundHttp/cspreport' + ], + 'content-encoding' => [ + 'gzip' + ], + 'server' => [ + 'ESF' + ], + 'x-xss-protection' => [ + '0' + ], + 'x-content-type-options' => [ + 'nosniff' + ], + 'set-cookie' => [ + 'NID=212=dAlC8GKROGQ6cWC5EeQ92vga0m4ReROz1kMl9BrboOg7GfaE3zvV7pmmgCmsXsJ7vya8tJGI4jioBfUTai-FbFjJPm264-_PY9-GEu66UJhCsRvBiDJVz3O5Ckjox4e0LsT9RZ2vuLADiJTrbw7nzwn4qwyWUF3duIq6_ZUnLhA; expires=Mon, 04-Oct-2021 15:20:47 GMT; path=/; domain=.google.es; Secure; HttpOnly; SameSite=none' + ], + 'alt-svc' => [ + 'h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"' + ], + 'Content-Location' => [ + 'https://consent.google.es/\'https:/consent.google.es/ml?continue=https://www.google.es/maps/place/Tordoia,%2BA%2BCoru%25C3%25B1a/@43.0871207,-8.5710004,12z/data%3D!3m1!4b1!4m2!3m1!1s0xd2ef4006f1ef489:0x404f58273ca55a0&gl=ES&hl=es&pc=m&src=1&rffu=true\'' + ], + 'X-Request-Time' => [ + '0.112 ms' + ] + ], + 'statusCode' => 404, + 'reasonPhrase' => 'Not Found', + 'body' => 'Error 404 (No se ha encontrado.)!!1

404. Se trata de un error.

No se ha encontrado la URL solicitada en este servidor. Esa es toda la información de la que disponemos.

' +]; diff --git a/tests/cache/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.ph b/tests/cache/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.ph new file mode 100644 index 00000000..20837910 --- /dev/null +++ b/tests/cache/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.ph @@ -0,0 +1,50 @@ + [ + 'content-type' => [ + 'text/html; charset=utf-8' + ], + 'cache-control' => [ + 'no-cache, no-store, max-age=0, must-revalidate' + ], + 'pragma' => [ + 'no-cache' + ], + 'expires' => [ + 'Mon, 01 Jan 1990 00:00:00 GMT' + ], + 'date' => [ + 'Sun, 04 Apr 2021 15:23:17 GMT' + ], + 'content-security-policy' => [ + 'script-src \'nonce-vsx63Xooae1XpA8j6kEGNA\' \'unsafe-inline\';object-src \'none\';base-uri \'self\';report-uri /_/IdentityNotFoundHttp/cspreport;worker-src \'self\'', + 'script-src \'nonce-vsx63Xooae1XpA8j6kEGNA\' \'self\' https://apis.google.com https://ssl.gstatic.com https://www.google.com https://www.gstatic.com https://www.google-analytics.com;report-uri /_/IdentityNotFoundHttp/cspreport' + ], + 'content-encoding' => [ + 'gzip' + ], + 'server' => [ + 'ESF' + ], + 'x-xss-protection' => [ + '0' + ], + 'x-content-type-options' => [ + 'nosniff' + ], + 'alt-svc' => [ + 'h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"' + ], + 'Content-Location' => [ + 'https://consent.youtube.com/\'https:/consent.youtube.com/ml?continue=https://www.youtube.com/channel/UCuZeHD5SGecQomz2pVDHGzg&gl=ES&hl=es&pc=yt&uxe=23983172&src=1&rffu=true\'' + ], + 'X-Request-Time' => [ + '0.127 ms' + ] + ], + 'statusCode' => 404, + 'reasonPhrase' => 'Not Found', + 'body' => 'Error 404 (No se ha encontrado.)!!1

404. Se trata de un error.

No se ha encontrado la URL solicitada en este servidor. Esa es toda la información de la que disponemos.

' +]; diff --git a/tests/cache/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php b/tests/cache/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php new file mode 100644 index 00000000..20837910 --- /dev/null +++ b/tests/cache/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php @@ -0,0 +1,50 @@ + [ + 'content-type' => [ + 'text/html; charset=utf-8' + ], + 'cache-control' => [ + 'no-cache, no-store, max-age=0, must-revalidate' + ], + 'pragma' => [ + 'no-cache' + ], + 'expires' => [ + 'Mon, 01 Jan 1990 00:00:00 GMT' + ], + 'date' => [ + 'Sun, 04 Apr 2021 15:23:17 GMT' + ], + 'content-security-policy' => [ + 'script-src \'nonce-vsx63Xooae1XpA8j6kEGNA\' \'unsafe-inline\';object-src \'none\';base-uri \'self\';report-uri /_/IdentityNotFoundHttp/cspreport;worker-src \'self\'', + 'script-src \'nonce-vsx63Xooae1XpA8j6kEGNA\' \'self\' https://apis.google.com https://ssl.gstatic.com https://www.google.com https://www.gstatic.com https://www.google-analytics.com;report-uri /_/IdentityNotFoundHttp/cspreport' + ], + 'content-encoding' => [ + 'gzip' + ], + 'server' => [ + 'ESF' + ], + 'x-xss-protection' => [ + '0' + ], + 'x-content-type-options' => [ + 'nosniff' + ], + 'alt-svc' => [ + 'h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"' + ], + 'Content-Location' => [ + 'https://consent.youtube.com/\'https:/consent.youtube.com/ml?continue=https://www.youtube.com/channel/UCuZeHD5SGecQomz2pVDHGzg&gl=ES&hl=es&pc=yt&uxe=23983172&src=1&rffu=true\'' + ], + 'X-Request-Time' => [ + '0.127 ms' + ] + ], + 'statusCode' => 404, + 'reasonPhrase' => 'Not Found', + 'body' => 'Error 404 (No se ha encontrado.)!!1

404. Se trata de un error.

No se ha encontrado la URL solicitada en este servidor. Esa es toda la información de la que disponemos.

' +]; diff --git a/tests/fixtures/500px.com.photo-138251239-taganay-park-by-daniel-kordan.php b/tests/fixtures/500px.com.photo-138251239-taganay-park-by-daniel-kordan.php index 35cd452d..126ffc88 100644 --- a/tests/fixtures/500px.com.photo-138251239-taganay-park-by-daniel-kordan.php +++ b/tests/fixtures/500px.com.photo-138251239-taganay-park-by-daniel-kordan.php @@ -22,5 +22,6 @@ 'title' => '500px', 'url' => 'https://500px.com/photo/138251239/taganay-park-by-daniel-kordan', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/animoto.com.play-gjsj1gu0wdrfr4pgw12xzq.php b/tests/fixtures/animoto.com.play-gjsj1gu0wdrfr4pgw12xzq.php index 4dd2acde..b508eb96 100644 --- a/tests/fixtures/animoto.com.play-gjsj1gu0wdrfr4pgw12xzq.php +++ b/tests/fixtures/animoto.com.play-gjsj1gu0wdrfr4pgw12xzq.php @@ -46,5 +46,6 @@ 'cache_age' => 604800, 'video_url' => 'https://d150hyw1dtprld.cloudfront.net/swf/w.swf?w=swf/production/vp1&e=1617549702&f=GjsJ1gu0WDRfr4pGw12xZQ&d=0&m=p&r=360p&i=m&asset_domain=s3-p.animoto.com&animoto_domain=animoto.com&options=start_hq', 'html' => '' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/archive.org.details-dn2015-0220_vid.php b/tests/fixtures/archive.org.details-dn2015-0220_vid.php index b04c64d7..2907079d 100644 --- a/tests/fixtures/archive.org.details-dn2015-0220_vid.php +++ b/tests/fixtures/archive.org.details-dn2015-0220_vid.php @@ -811,5 +811,22 @@ 'collection_files_count' => null, 'collection_size' => null ] + ], + 'allLinkedData' => [ + [ + '@context' => 'http://schema.org', + '@type' => 'BreadcrumbList', + 'itemListElement' => [ + [ + '@type' => 'ListItem', + 'position' => 1, + 'item' => [ + '@id' => 'https://archive.org/details/movies', + 'name' => 'Videos', + 'image' => 'https://archive.org/services/img/movies' + ] + ] + ] + ] ] ]; diff --git a/tests/fixtures/archive.org.details-librivoxaudio.php b/tests/fixtures/archive.org.details-librivoxaudio.php index d12443fb..0ee5c49b 100644 --- a/tests/fixtures/archive.org.details-librivoxaudio.php +++ b/tests/fixtures/archive.org.details-librivoxaudio.php @@ -30,5 +30,6 @@ 'url' => 'https://archive.org/details/librivoxaudio', 'linkedData' => [], 'oEmbed' => [], - 'api' => [] + 'api' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/buff.ly.2usohds.php b/tests/fixtures/buff.ly.2usohds.php index 1d2c3607..3c7b4460 100644 --- a/tests/fixtures/buff.ly.2usohds.php +++ b/tests/fixtures/buff.ly.2usohds.php @@ -31,5 +31,72 @@ '@context' => 'http://schema.org', '@type' => 'Organization' ], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [ + [ + 'url' => 'https://graffica.info', + 'name' => 'Gràffica', + '@id' => '#organization', + '@context' => 'http://schema.org', + '@type' => 'Organization' + ], + [ + 'isPartOf' => [ + '@id' => '#website', + '@context' => 'http://schema.org', + '@type' => 'WebSite' + ], + 'name' => '¿Sabes cuál es el origen del ampersand?', + '@id' => '#webpage', + '@context' => 'http://schema.org', + '@type' => 'WebPage' + ], + [ + 'potentialAction' => [ + 'target' => 'https://graffica.info?s={search_term_string}', + 'query-input' => 'required name=search_term_string', + '@context' => 'http://schema.org', + '@type' => 'SearchAction' + ], + 'url' => 'https://graffica.info', + 'name' => 'Gràffica', + 'description' => 'Revista de noticias del mundo del diseño, en especial del diseño gráfico, la creatividad y la cultura visual. Tipografía, ilustración, branding y mucho más.', + 'publisher' => [ + '@id' => '#organization', + '@context' => 'http://schema.org', + '@type' => 'Organization' + ], + '@id' => '#website', + '@context' => 'http://schema.org', + '@type' => 'WebSite' + ], + [ + 'dateModified' => '2020-11-16T11:54:05+01:00', + 'author' => [ + 'url' => 'https://graffica.info/author/anagamontessgmail-com/', + 'name' => 'Ana García Montes', + '@context' => 'http://schema.org', + '@type' => 'Person' + ], + 'mainEntityOfPage' => [ + '@id' => '#webpage', + '@context' => 'http://schema.org', + '@type' => 'WebPage' + ], + 'description' => 'El lenguaje, sea cual sea el idioma, siempre esconde entre los orígenes de sus palabras muchas curiosidades que resultan realmente fascinantes y que nos ayudan a entender el porqué de muchas formaciones lingüísticas. Este es el caso del origen del ampersand, el signo & —que en español su nombre es et y en inglés ampersand— […]', + 'datePublished' => '2020-02-20T10:30:00+01:00', + 'headline' => '¿Sabes cuál es el origen del ampersand?', + 'publisher' => [ + '@id' => '#organization', + '@context' => 'http://schema.org', + '@type' => 'Organization' + ], + 'image' => [ + 'https://graffica.info/wp-content/uploads/2020/02/el-origen-de-la-Ampersand-destacado.jpg', + 'https://please-enter-a-fallback-url.here' + ], + '@context' => 'http://schema.org', + '@type' => 'Article' + ] + ] ]; diff --git a/tests/fixtures/calendar.google.com.calendar-embed.95ba7bc228ac2f81591bfa9cd9d2da50.php b/tests/fixtures/calendar.google.com.calendar-embed.95ba7bc228ac2f81591bfa9cd9d2da50.php index e42b6ffe..5bb0a415 100644 --- a/tests/fixtures/calendar.google.com.calendar-embed.95ba7bc228ac2f81591bfa9cd9d2da50.php +++ b/tests/fixtures/calendar.google.com.calendar-embed.95ba7bc228ac2f81591bfa9cd9d2da50.php @@ -22,5 +22,6 @@ 'title' => 'Festivos en España', 'url' => 'https://calendar.google.com/calendar/embed?src=spain__es%40holiday.calendar.google.com&ctz=Europe/Madrid', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/cdn2.thecatapi.com.images-cjd.jpg.php b/tests/fixtures/cdn2.thecatapi.com.images-cjd.jpg.php index 1b255e39..97229788 100644 --- a/tests/fixtures/cdn2.thecatapi.com.images-cjd.jpg.php +++ b/tests/fixtures/cdn2.thecatapi.com.images-cjd.jpg.php @@ -27,5 +27,6 @@ 'title' => null, 'url' => 'https://cdn2.thecatapi.com/images/cjd.jpg', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/chirb.it.7a9l9b.php b/tests/fixtures/chirb.it.7a9l9b.php index aa370620..4ec76928 100644 --- a/tests/fixtures/chirb.it.7a9l9b.php +++ b/tests/fixtures/chirb.it.7a9l9b.php @@ -45,5 +45,6 @@ 'author_name' => 'nvanderklippe', 'author_url' => 'https://www.chirbit.com/nvanderklippe', 'html' => '' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/codepen.io.zhouzi-pen-jorazp.php b/tests/fixtures/codepen.io.zhouzi-pen-jorazp.php index 04553235..a6b16acf 100644 --- a/tests/fixtures/codepen.io.zhouzi-pen-jorazp.php +++ b/tests/fixtures/codepen.io.zhouzi-pen-jorazp.php @@ -42,5 +42,6 @@ 'thumbnail_height' => '225', 'thumbnail_url' => 'https://assets.codepen.io/99102/internal/screenshots/pens/JoRazP.default.png?fit=cover&format=auto&ha=true&height=360&quality=75&v=2&version=1467971314&width=640', 'html' => '' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/commondatastorage.googleapis.com.gtv-videos-bucket-sample-bigbuckbunny.mp4.php b/tests/fixtures/commondatastorage.googleapis.com.gtv-videos-bucket-sample-bigbuckbunny.mp4.php index d135bdfb..5ff0d4b6 100644 --- a/tests/fixtures/commondatastorage.googleapis.com.gtv-videos-bucket-sample-bigbuckbunny.mp4.php +++ b/tests/fixtures/commondatastorage.googleapis.com.gtv-videos-bucket-sample-bigbuckbunny.mp4.php @@ -27,5 +27,6 @@ 'title' => null, 'url' => 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/consent.google.es.https-consent.google.es-ml.20a3573a47b367de5e1ec943cfa5600f.php b/tests/fixtures/consent.google.es.ml.0bcc06470676961770c2d2357693454b.php similarity index 94% rename from tests/fixtures/consent.google.es.https-consent.google.es-ml.20a3573a47b367de5e1ec943cfa5600f.php rename to tests/fixtures/consent.google.es.ml.0bcc06470676961770c2d2357693454b.php index 401c6c72..4e658006 100644 --- a/tests/fixtures/consent.google.es.https-consent.google.es-ml.20a3573a47b367de5e1ec943cfa5600f.php +++ b/tests/fixtures/consent.google.es.ml.0bcc06470676961770c2d2357693454b.php @@ -22,5 +22,6 @@ 'title' => 'Error 404 (No se ha encontrado.)!!1', 'url' => 'https://consent.google.es/\'https:/consent.google.es/ml?continue=https://www.google.es/maps/place/Tordoia,%2BA%2BCoru%25C3%25B1a/@43.0871207,-8.5710004,12z/data%3D!3m1!4b1!4m2!3m1!1s0xd2ef4006f1ef489:0x404f58273ca55a0&gl=ES&hl=es&pc=m&src=1&rffu=true\'', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/consent.youtube.com.https-consent.youtube.com-ml.1e8880920f82edebd2e133df8917d407.php b/tests/fixtures/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php similarity index 94% rename from tests/fixtures/consent.youtube.com.https-consent.youtube.com-ml.1e8880920f82edebd2e133df8917d407.php rename to tests/fixtures/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php index 9819b875..3cb48429 100644 --- a/tests/fixtures/consent.youtube.com.https-consent.youtube.com-ml.1e8880920f82edebd2e133df8917d407.php +++ b/tests/fixtures/consent.youtube.com.ml.96e9b7b22bbf367fbeaa2ae77c21e90d.php @@ -22,5 +22,6 @@ 'title' => 'Error 404 (No se ha encontrado.)!!1', 'url' => 'https://consent.youtube.com/\'https:/consent.youtube.com/ml?continue=https://www.youtube.com/channel/UCuZeHD5SGecQomz2pVDHGzg&gl=ES&hl=es&pc=yt&uxe=23983172&src=1&rffu=true\'', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/drive.google.com.file-d-0b2rwn8wabvswbmfjdudnv2vsttg-view.php b/tests/fixtures/drive.google.com.file-d-0b2rwn8wabvswbmfjdudnv2vsttg-view.php index 5391a22d..fb451ee5 100644 --- a/tests/fixtures/drive.google.com.file-d-0b2rwn8wabvswbmfjdudnv2vsttg-view.php +++ b/tests/fixtures/drive.google.com.file-d-0b2rwn8wabvswbmfjdudnv2vsttg-view.php @@ -22,5 +22,6 @@ 'title' => 'Entrevista_Rianxo_RadioFusion_150724.mp3', 'url' => 'https://drive.google.com/file/d/0B2rwN8wAbVSWbmFJdUdnV2VSTTg/view', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/en.wikipedia.org.wiki-albert_einstein.php b/tests/fixtures/en.wikipedia.org.wiki-albert_einstein.php index a2212711..5311799e 100644 --- a/tests/fixtures/en.wikipedia.org.wiki-albert_einstein.php +++ b/tests/fixtures/en.wikipedia.org.wiki-albert_einstein.php @@ -57,5 +57,31 @@

Albert Einstein ( EYEN-styne; German: [ˈalbɛʁt ˈʔaɪnʃtaɪn] (listen); 14 March 1879 – 18 April 1955) was a German-born theoretical physicist, widely acknowledged to be one of the greatest physicists of all time. Einstein is known widely for developing the theory of relativity, but he also made important contributions to the development of the theory of quantum mechanics. Relativity and quantum mechanics are together the two pillars of modern physics. His mass–energy equivalence formula E = mc2, which arises from relativity theory, has been dubbed "the world\'s most famous equation". His work is also known for its influence on the philosophy of science. He received

...' + ], + 'allLinkedData' => [ + [ + '@context' => 'https://schema.org', + '@type' => 'Article', + 'name' => 'Albert Einstein', + 'url' => 'https://en.wikipedia.org/wiki/Albert_Einstein', + 'sameAs' => 'http://www.wikidata.org/entity/Q937', + 'mainEntity' => 'http://www.wikidata.org/entity/Q937', + 'author' => [ + '@type' => 'Organization', + 'name' => 'Contributors to Wikimedia projects' + ], + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'Wikimedia Foundation, Inc.', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wikimedia.org/static/images/wmf-hor-googpub.png' + ] + ], + 'datePublished' => '2001-11-05T18:26:16Z', + 'dateModified' => '2021-04-04T01:52:51Z', + 'image' => 'https://upload.wikimedia.org/wikipedia/commons/3/3e/Einstein_1921_by_F_Schmutzer_-_restoration.jpg', + 'headline' => 'German-born theoretical physicist; developer of the theory of relativity (1879–1955)' + ] ] ]; diff --git a/tests/fixtures/gist.github.com.oscarotero-7749998.php b/tests/fixtures/gist.github.com.oscarotero-7749998.php index 905dc89a..e82039c7 100644 --- a/tests/fixtures/gist.github.com.oscarotero-7749998.php +++ b/tests/fixtures/gist.github.com.oscarotero-7749998.php @@ -308,5 +308,6 @@ ', 'stylesheet' => 'https://github.githubassets.com/assets/gist-embed-33b98015caf26cfcbee6ce1a5d1fc768.css' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/github.com.benbalter-dc-wifi-social-blob-master-bars.geojson.php b/tests/fixtures/github.com.benbalter-dc-wifi-social-blob-master-bars.geojson.php index ab4be785..92119322 100644 --- a/tests/fixtures/github.com.benbalter-dc-wifi-social-blob-master-bars.geojson.php +++ b/tests/fixtures/github.com.benbalter-dc-wifi-social-blob-master-bars.geojson.php @@ -27,5 +27,6 @@ 'title' => 'benbalter/dc-wifi-social', 'url' => 'https://github.com/benbalter/dc-wifi-social/blob/master/bars.geojson', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/github.com.oscarotero-embed-blob-master-composer.json.php b/tests/fixtures/github.com.oscarotero-embed-blob-master-composer.json.php index baf715ff..7cbbbb4b 100644 --- a/tests/fixtures/github.com.oscarotero-embed-blob-master-composer.json.php +++ b/tests/fixtures/github.com.oscarotero-embed-blob-master-composer.json.php @@ -22,5 +22,6 @@ 'title' => 'oscarotero/Embed', 'url' => 'https://github.com/oscarotero/Embed/blob/master/composer.json', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/github.com.skalnik-secret-bear-clip-blob-master-stl-clip.stl.php b/tests/fixtures/github.com.skalnik-secret-bear-clip-blob-master-stl-clip.stl.php index 1efb8393..b76c9dac 100644 --- a/tests/fixtures/github.com.skalnik-secret-bear-clip-blob-master-stl-clip.stl.php +++ b/tests/fixtures/github.com.skalnik-secret-bear-clip-blob-master-stl-clip.stl.php @@ -27,5 +27,6 @@ 'title' => 'skalnik/secret-bear-clip', 'url' => 'https://github.com/skalnik/secret-bear-clip/blob/master/stl/clip.stl', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/he-who-photographs-rather-ok.tumblr.com.post-165326273724.php b/tests/fixtures/he-who-photographs-rather-ok.tumblr.com.post-165326273724.php index 8f5eeef5..2c9cf753 100644 --- a/tests/fixtures/he-who-photographs-rather-ok.tumblr.com.post-165326273724.php +++ b/tests/fixtures/he-who-photographs-rather-ok.tumblr.com.post-165326273724.php @@ -55,5 +55,16 @@ 'html' => '
https://he-who-photographs-rather-ok.tumblr.com/post/165326273724
', 'height' => null, 'width' => 540 + ], + 'allLinkedData' => [ + [ + '@type' => 'SocialMediaPosting', + 'url' => 'https://he-who-photographs-rather-ok.tumblr.com/post/165326273724', + 'mainEntityOfPage' => true, + 'datePublished' => '2017-09-14T10:20:35-04:00', + 'author' => 'he-who-photographs-rather-ok', + 'image' => 'https://64.media.tumblr.com/0a0fac1ef8faa0c466d9224567af06aa/tumblr_ow8r0nMybA1spmyulo1_1280.jpg', + '@context' => 'http://schema.org' + ] ] ]; diff --git a/tests/fixtures/i.imgur.com.x6rkcc5.jpg.php b/tests/fixtures/i.imgur.com.x6rkcc5.jpg.php index 7f542388..dd477e85 100644 --- a/tests/fixtures/i.imgur.com.x6rkcc5.jpg.php +++ b/tests/fixtures/i.imgur.com.x6rkcc5.jpg.php @@ -35,5 +35,6 @@ 'width' => 540, 'height' => 500, 'html' => '
Picture of a Mountain Gorilla right before he punched the photographer
' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/ideone.com.whjntg.php b/tests/fixtures/ideone.com.whjntg.php index 4d2ac785..ea481374 100644 --- a/tests/fixtures/ideone.com.whjntg.php +++ b/tests/fixtures/ideone.com.whjntg.php @@ -44,5 +44,6 @@ 'title' => 'Ideone.com', 'url' => 'https://ideone.com/Whjntg', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/imageshack.com.i-ip7wo0v7j.php b/tests/fixtures/imageshack.com.i-ip7wo0v7j.php index 25fa7c59..9adef1df 100644 --- a/tests/fixtures/imageshack.com.i-ip7wo0v7j.php +++ b/tests/fixtures/imageshack.com.i-ip7wo0v7j.php @@ -72,5 +72,6 @@ ], 'next_images' => [], 'prev_images' => [] - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/infogr.am.7743c36a-f3ca-4465-9a80-a8abbd5d8dc4.php b/tests/fixtures/infogr.am.7743c36a-f3ca-4465-9a80-a8abbd5d8dc4.php index 65805016..086d148c 100644 --- a/tests/fixtures/infogr.am.7743c36a-f3ca-4465-9a80-a8abbd5d8dc4.php +++ b/tests/fixtures/infogr.am.7743c36a-f3ca-4465-9a80-a8abbd5d8dc4.php @@ -41,5 +41,6 @@ 'height' => 600, 'author_url' => 'https://infogram.com/sabjnewsroom01', 'author_name' => 'Tony Quesada' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/jeanjean.bandcamp.com.track-coquin-l-l-phant.php b/tests/fixtures/jeanjean.bandcamp.com.track-coquin-l-l-phant.php index 606fc73b..7576c24a 100644 --- a/tests/fixtures/jeanjean.bandcamp.com.track-coquin-l-l-phant.php +++ b/tests/fixtures/jeanjean.bandcamp.com.track-coquin-l-l-phant.php @@ -177,5 +177,151 @@ ] ] ], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [ + [ + 'copyrightNotice' => 'All Rights Reserved', + '@id' => 'https://jeanjean.bandcamp.com/track/coquin-l-l-phant', + 'inAlbum' => [ + '@id' => 'https://jeanjean.bandcamp.com/album/symmetry', + '@type' => 'MusicAlbum', + 'name' => 'Symmetry' + ], + '@type' => [ + 'MusicRecording', + 'Product' + ], + 'byArtist' => [ + 'subjectOf' => [ + [ + '@type' => 'WebSite', + 'url' => 'https://jeanjean.bandcamp.com/music', + 'name' => 'music' + ], + [ + '@type' => 'WebSite', + 'url' => 'https://jeanjean.bandcamp.com/merch', + 'name' => 'merch' + ], + [ + '@type' => 'WebSite', + 'url' => 'https://jeanjean.bandcamp.com/community', + 'name' => 'community' + ] + ], + '@id' => 'https://jeanjean.bandcamp.com', + 'genre' => 'https://bandcamp.com/tag/rock', + '@type' => 'MusicGroup', + 'image' => 'https://f4.bcbits.com/img/0012283751_10.jpg', + 'additionalProperty' => [ + [ + 'value' => 1235691216, + '@type' => 'PropertyValue', + 'name' => 'band_id' + ], + [ + 'value' => 'EUR', + '@type' => 'PropertyValue', + 'name' => 'currency' + ] + ], + 'sameAs' => [ + 'http://www.facebook.com/jeanjeanmusic', + 'https://www.instagram.com/wearejeanjean/', + 'http://www.youtube.com/channel/UCOsMtEsuiqbqkFQ9oyqJhHg', + 'http://jeanjeanband.com/', + 'https://twitter.com/jeanjeanband' + ], + 'name' => 'Jean Jean' + ], + '@context' => 'https://schema.org', + 'duration' => 'P00H03M46S', + 'offers' => [ + 'priceSpecification' => [ + 'minPrice' => 1.0 + ], + 'priceCurrency' => 'EUR', + '@type' => 'Offer', + 'additionalProperty' => [ + [ + 'value' => 2, + '@type' => 'PropertyValue', + 'name' => 'download_pref' + ], + [ + 'value' => 1000.0, + '@type' => 'PropertyValue', + 'name' => 'max_price' + ], + [ + 'value' => 1.0, + '@type' => 'PropertyValue', + 'name' => 'min_price' + ] + ], + 'url' => 'https://jeanjean.bandcamp.com/track/coquin-l-l-phant#buy', + 'price' => 1.0, + 'availability' => 'OnlineOnly' + ], + 'additionalProperty' => [ + [ + 'value' => 2592086951, + '@type' => 'PropertyValue', + 'name' => 'track_id' + ], + [ + 'value' => 226.251, + '@type' => 'PropertyValue', + 'name' => 'duration_secs' + ], + [ + 'value' => 'https://t4.bcbits.com/stream/3a7928de52d6fa132b127481f7d9a0ea/mp3-128/2592086951?p=0&ts=1617636205&t=bec14e3e148c574bf56676ba4812a85d61d12561&token=1617636205_d1a065da6309e56a0174b61186b74b9e383f81d3', + '@type' => 'PropertyValue', + 'name' => 'file_mp3-128' + ], + [ + 'value' => 'all_rights_reserved', + '@type' => 'PropertyValue', + 'name' => 'license_name' + ], + [ + 'value' => true, + '@type' => 'PropertyValue', + 'name' => 'streaming' + ] + ], + 'dateModified' => '13 Sep 2013 18:03:29 GMT', + 'image' => 'https://f4.bcbits.com/img/a3289609405_10.jpg', + 'name' => 'Coquin L\'éléphant', + 'datePublished' => '15 Sep 2013 08:45:29 GMT', + 'keywords' => [ + 'Rock', + 'ambient', + 'electro-rock', + 'instrumental', + 'interstellar', + 'Sept Sorts' + ], + 'sponsor' => [ + [ + '@type' => 'Person', + 'url' => 'https://bandcamp.com/jaredremillard', + 'image' => 'https://f4.bcbits.com/img/0001850798_10.jpg', + 'name' => 'Jared ReMillard' + ], + [ + '@type' => 'Person', + 'url' => 'https://bandcamp.com/sheebypanda', + 'image' => 'https://f4.bcbits.com/img/0004764347_10.jpg', + 'name' => 'SheebyPanda' + ], + [ + '@type' => 'Person', + 'url' => 'https://bandcamp.com/tylerthornhill', + 'image' => 'https://f4.bcbits.com/img/0001705921_10.jpg', + 'name' => 'Tyler Thornhill' + ] + ] + ] + ] ]; diff --git a/tests/fixtures/jsfiddle.net.zhm5rjnz.php b/tests/fixtures/jsfiddle.net.zhm5rjnz.php index 70e32d57..8c016ab3 100644 --- a/tests/fixtures/jsfiddle.net.zhm5rjnz.php +++ b/tests/fixtures/jsfiddle.net.zhm5rjnz.php @@ -31,5 +31,6 @@ 'title' => 'Edit fiddle - JSFiddle - Code Playground', 'url' => 'http://jsfiddle.net/zhm5rjnz/', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/live.amcharts.com.cznjj.php b/tests/fixtures/live.amcharts.com.cznjj.php index 65f24974..b52b3557 100644 --- a/tests/fixtures/live.amcharts.com.cznjj.php +++ b/tests/fixtures/live.amcharts.com.cznjj.php @@ -42,5 +42,6 @@ 'thumbnail_url' => 'http://generated.amcharts.com/cz/czNjJ-full.png', 'thumbnail_width' => 404, 'thumbnail_height' => 300 - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/media.photobucket.com.user-ignwar-media-album-20deserts-moonrisemonumentvalleyutah.jpg.html.c07885ac4c85b35f31f6dc858d4d64b0.php b/tests/fixtures/media.photobucket.com.user-ignwar-media-album-20deserts-moonrisemonumentvalleyutah.jpg.html.c07885ac4c85b35f31f6dc858d4d64b0.php index 064be3df..105e4a5b 100644 --- a/tests/fixtures/media.photobucket.com.user-ignwar-media-album-20deserts-moonrisemonumentvalleyutah.jpg.html.c07885ac4c85b35f31f6dc858d4d64b0.php +++ b/tests/fixtures/media.photobucket.com.user-ignwar-media-album-20deserts-moonrisemonumentvalleyutah.jpg.html.c07885ac4c85b35f31f6dc858d4d64b0.php @@ -22,5 +22,6 @@ 'title' => 'My Library', 'url' => 'https://app.photobucket.com/u/Ignwar?filters%5Bterm%5D=sunsets&filters%5Bprimary%5D=images', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/open.spotify.com.album-7s66wu1xj2nsuuwm2nkiuv.php b/tests/fixtures/open.spotify.com.album-7s66wu1xj2nsuuwm2nkiuv.php index 9e67f45b..29f18cc1 100644 --- a/tests/fixtures/open.spotify.com.album-7s66wu1xj2nsuuwm2nkiuv.php +++ b/tests/fixtures/open.spotify.com.album-7s66wu1xj2nsuuwm2nkiuv.php @@ -781,5 +781,750 @@ 'thumbnail_url' => 'https://i.scdn.co/image/ab67616d00001e02022aca057f08a1d40c1f0733', 'thumbnail_width' => 300, 'thumbnail_height' => 300 + ], + 'allLinkedData' => [ + [ + '@context' => 'http://schema.googleapis.com/', + '@type' => 'MusicAlbum', + '@id' => 'https://open.spotify.com/album/7s66wU1XJ2NsUuWM2NKiUV', + 'url' => 'https://open.spotify.com/album/7s66wU1XJ2NsUuWM2NKiUV', + 'name' => 'A Cantar con Xabarin (Vol. I & II)', + 'description' => 'Listen to A Cantar con Xabarin (Vol. I & II) on Spotify. Various Artists · Compilation · 1996 · 44 songs.', + 'datePublished' => '1996-03-05', + 'potentialAction' => [ + '@type' => 'ListenAction', + 'target' => [ + [ + '@type' => 'EntryPoint', + 'urlTemplate' => 'https://open.spotify.com/album/7s66wU1XJ2NsUuWM2NKiUV?autoplay=true', + 'actionPlatform' => [ + 'http://schema.org/DesktopWebPlatform', + 'http://schema.org/IOSPlatform', + 'http://schema.googleapis.com/GoogleAudioCast', + 'http://schema.googleapis.com/GoogleVideoCast' + ] + ], + 'android-app://com.spotify.music/spotify/album/7s66wU1XJ2NsUuWM2NKiUV/play' + ], + 'expectsAcceptanceOf' => [ + '@type' => 'Offer', + 'category' => 'free', + 'eligibleRegion' => [ + [ + '@type' => 'Country', + 'name' => 'AD' + ], + [ + '@type' => 'Country', + 'name' => 'AE' + ], + [ + '@type' => 'Country', + 'name' => 'AG' + ], + [ + '@type' => 'Country', + 'name' => 'AL' + ], + [ + '@type' => 'Country', + 'name' => 'AM' + ], + [ + '@type' => 'Country', + 'name' => 'AO' + ], + [ + '@type' => 'Country', + 'name' => 'AR' + ], + [ + '@type' => 'Country', + 'name' => 'AT' + ], + [ + '@type' => 'Country', + 'name' => 'AU' + ], + [ + '@type' => 'Country', + 'name' => 'AZ' + ], + [ + '@type' => 'Country', + 'name' => 'BA' + ], + [ + '@type' => 'Country', + 'name' => 'BB' + ], + [ + '@type' => 'Country', + 'name' => 'BD' + ], + [ + '@type' => 'Country', + 'name' => 'BE' + ], + [ + '@type' => 'Country', + 'name' => 'BF' + ], + [ + '@type' => 'Country', + 'name' => 'BG' + ], + [ + '@type' => 'Country', + 'name' => 'BH' + ], + [ + '@type' => 'Country', + 'name' => 'BI' + ], + [ + '@type' => 'Country', + 'name' => 'BJ' + ], + [ + '@type' => 'Country', + 'name' => 'BN' + ], + [ + '@type' => 'Country', + 'name' => 'BO' + ], + [ + '@type' => 'Country', + 'name' => 'BR' + ], + [ + '@type' => 'Country', + 'name' => 'BS' + ], + [ + '@type' => 'Country', + 'name' => 'BT' + ], + [ + '@type' => 'Country', + 'name' => 'BW' + ], + [ + '@type' => 'Country', + 'name' => 'BY' + ], + [ + '@type' => 'Country', + 'name' => 'BZ' + ], + [ + '@type' => 'Country', + 'name' => 'CA' + ], + [ + '@type' => 'Country', + 'name' => 'CH' + ], + [ + '@type' => 'Country', + 'name' => 'CI' + ], + [ + '@type' => 'Country', + 'name' => 'CL' + ], + [ + '@type' => 'Country', + 'name' => 'CM' + ], + [ + '@type' => 'Country', + 'name' => 'CO' + ], + [ + '@type' => 'Country', + 'name' => 'CR' + ], + [ + '@type' => 'Country', + 'name' => 'CV' + ], + [ + '@type' => 'Country', + 'name' => 'CW' + ], + [ + '@type' => 'Country', + 'name' => 'CY' + ], + [ + '@type' => 'Country', + 'name' => 'CZ' + ], + [ + '@type' => 'Country', + 'name' => 'DE' + ], + [ + '@type' => 'Country', + 'name' => 'DJ' + ], + [ + '@type' => 'Country', + 'name' => 'DK' + ], + [ + '@type' => 'Country', + 'name' => 'DM' + ], + [ + '@type' => 'Country', + 'name' => 'DO' + ], + [ + '@type' => 'Country', + 'name' => 'DZ' + ], + [ + '@type' => 'Country', + 'name' => 'EC' + ], + [ + '@type' => 'Country', + 'name' => 'EE' + ], + [ + '@type' => 'Country', + 'name' => 'EG' + ], + [ + '@type' => 'Country', + 'name' => 'ES' + ], + [ + '@type' => 'Country', + 'name' => 'FI' + ], + [ + '@type' => 'Country', + 'name' => 'FJ' + ], + [ + '@type' => 'Country', + 'name' => 'FM' + ], + [ + '@type' => 'Country', + 'name' => 'FR' + ], + [ + '@type' => 'Country', + 'name' => 'GA' + ], + [ + '@type' => 'Country', + 'name' => 'GB' + ], + [ + '@type' => 'Country', + 'name' => 'GD' + ], + [ + '@type' => 'Country', + 'name' => 'GE' + ], + [ + '@type' => 'Country', + 'name' => 'GH' + ], + [ + '@type' => 'Country', + 'name' => 'GM' + ], + [ + '@type' => 'Country', + 'name' => 'GN' + ], + [ + '@type' => 'Country', + 'name' => 'GQ' + ], + [ + '@type' => 'Country', + 'name' => 'GR' + ], + [ + '@type' => 'Country', + 'name' => 'GT' + ], + [ + '@type' => 'Country', + 'name' => 'GW' + ], + [ + '@type' => 'Country', + 'name' => 'GY' + ], + [ + '@type' => 'Country', + 'name' => 'HK' + ], + [ + '@type' => 'Country', + 'name' => 'HN' + ], + [ + '@type' => 'Country', + 'name' => 'HR' + ], + [ + '@type' => 'Country', + 'name' => 'HT' + ], + [ + '@type' => 'Country', + 'name' => 'HU' + ], + [ + '@type' => 'Country', + 'name' => 'ID' + ], + [ + '@type' => 'Country', + 'name' => 'IE' + ], + [ + '@type' => 'Country', + 'name' => 'IL' + ], + [ + '@type' => 'Country', + 'name' => 'IN' + ], + [ + '@type' => 'Country', + 'name' => 'IS' + ], + [ + '@type' => 'Country', + 'name' => 'IT' + ], + [ + '@type' => 'Country', + 'name' => 'JM' + ], + [ + '@type' => 'Country', + 'name' => 'JO' + ], + [ + '@type' => 'Country', + 'name' => 'JP' + ], + [ + '@type' => 'Country', + 'name' => 'KE' + ], + [ + '@type' => 'Country', + 'name' => 'KG' + ], + [ + '@type' => 'Country', + 'name' => 'KH' + ], + [ + '@type' => 'Country', + 'name' => 'KI' + ], + [ + '@type' => 'Country', + 'name' => 'KM' + ], + [ + '@type' => 'Country', + 'name' => 'KN' + ], + [ + '@type' => 'Country', + 'name' => 'KR' + ], + [ + '@type' => 'Country', + 'name' => 'KW' + ], + [ + '@type' => 'Country', + 'name' => 'KZ' + ], + [ + '@type' => 'Country', + 'name' => 'LA' + ], + [ + '@type' => 'Country', + 'name' => 'LB' + ], + [ + '@type' => 'Country', + 'name' => 'LC' + ], + [ + '@type' => 'Country', + 'name' => 'LI' + ], + [ + '@type' => 'Country', + 'name' => 'LK' + ], + [ + '@type' => 'Country', + 'name' => 'LR' + ], + [ + '@type' => 'Country', + 'name' => 'LS' + ], + [ + '@type' => 'Country', + 'name' => 'LT' + ], + [ + '@type' => 'Country', + 'name' => 'LU' + ], + [ + '@type' => 'Country', + 'name' => 'LV' + ], + [ + '@type' => 'Country', + 'name' => 'MA' + ], + [ + '@type' => 'Country', + 'name' => 'MC' + ], + [ + '@type' => 'Country', + 'name' => 'MD' + ], + [ + '@type' => 'Country', + 'name' => 'ME' + ], + [ + '@type' => 'Country', + 'name' => 'MG' + ], + [ + '@type' => 'Country', + 'name' => 'MH' + ], + [ + '@type' => 'Country', + 'name' => 'MK' + ], + [ + '@type' => 'Country', + 'name' => 'ML' + ], + [ + '@type' => 'Country', + 'name' => 'MN' + ], + [ + '@type' => 'Country', + 'name' => 'MO' + ], + [ + '@type' => 'Country', + 'name' => 'MR' + ], + [ + '@type' => 'Country', + 'name' => 'MT' + ], + [ + '@type' => 'Country', + 'name' => 'MU' + ], + [ + '@type' => 'Country', + 'name' => 'MV' + ], + [ + '@type' => 'Country', + 'name' => 'MW' + ], + [ + '@type' => 'Country', + 'name' => 'MX' + ], + [ + '@type' => 'Country', + 'name' => 'MY' + ], + [ + '@type' => 'Country', + 'name' => 'MZ' + ], + [ + '@type' => 'Country', + 'name' => 'NA' + ], + [ + '@type' => 'Country', + 'name' => 'NE' + ], + [ + '@type' => 'Country', + 'name' => 'NG' + ], + [ + '@type' => 'Country', + 'name' => 'NI' + ], + [ + '@type' => 'Country', + 'name' => 'NL' + ], + [ + '@type' => 'Country', + 'name' => 'NO' + ], + [ + '@type' => 'Country', + 'name' => 'NP' + ], + [ + '@type' => 'Country', + 'name' => 'NR' + ], + [ + '@type' => 'Country', + 'name' => 'NZ' + ], + [ + '@type' => 'Country', + 'name' => 'OM' + ], + [ + '@type' => 'Country', + 'name' => 'PA' + ], + [ + '@type' => 'Country', + 'name' => 'PE' + ], + [ + '@type' => 'Country', + 'name' => 'PG' + ], + [ + '@type' => 'Country', + 'name' => 'PH' + ], + [ + '@type' => 'Country', + 'name' => 'PK' + ], + [ + '@type' => 'Country', + 'name' => 'PL' + ], + [ + '@type' => 'Country', + 'name' => 'PS' + ], + [ + '@type' => 'Country', + 'name' => 'PT' + ], + [ + '@type' => 'Country', + 'name' => 'PW' + ], + [ + '@type' => 'Country', + 'name' => 'PY' + ], + [ + '@type' => 'Country', + 'name' => 'QA' + ], + [ + '@type' => 'Country', + 'name' => 'RO' + ], + [ + '@type' => 'Country', + 'name' => 'RS' + ], + [ + '@type' => 'Country', + 'name' => 'RU' + ], + [ + '@type' => 'Country', + 'name' => 'RW' + ], + [ + '@type' => 'Country', + 'name' => 'SA' + ], + [ + '@type' => 'Country', + 'name' => 'SB' + ], + [ + '@type' => 'Country', + 'name' => 'SC' + ], + [ + '@type' => 'Country', + 'name' => 'SE' + ], + [ + '@type' => 'Country', + 'name' => 'SG' + ], + [ + '@type' => 'Country', + 'name' => 'SI' + ], + [ + '@type' => 'Country', + 'name' => 'SK' + ], + [ + '@type' => 'Country', + 'name' => 'SL' + ], + [ + '@type' => 'Country', + 'name' => 'SM' + ], + [ + '@type' => 'Country', + 'name' => 'SN' + ], + [ + '@type' => 'Country', + 'name' => 'SR' + ], + [ + '@type' => 'Country', + 'name' => 'ST' + ], + [ + '@type' => 'Country', + 'name' => 'SV' + ], + [ + '@type' => 'Country', + 'name' => 'SZ' + ], + [ + '@type' => 'Country', + 'name' => 'TD' + ], + [ + '@type' => 'Country', + 'name' => 'TG' + ], + [ + '@type' => 'Country', + 'name' => 'TH' + ], + [ + '@type' => 'Country', + 'name' => 'TL' + ], + [ + '@type' => 'Country', + 'name' => 'TN' + ], + [ + '@type' => 'Country', + 'name' => 'TO' + ], + [ + '@type' => 'Country', + 'name' => 'TR' + ], + [ + '@type' => 'Country', + 'name' => 'TT' + ], + [ + '@type' => 'Country', + 'name' => 'TV' + ], + [ + '@type' => 'Country', + 'name' => 'TW' + ], + [ + '@type' => 'Country', + 'name' => 'TZ' + ], + [ + '@type' => 'Country', + 'name' => 'UA' + ], + [ + '@type' => 'Country', + 'name' => 'UG' + ], + [ + '@type' => 'Country', + 'name' => 'US' + ], + [ + '@type' => 'Country', + 'name' => 'UY' + ], + [ + '@type' => 'Country', + 'name' => 'UZ' + ], + [ + '@type' => 'Country', + 'name' => 'VC' + ], + [ + '@type' => 'Country', + 'name' => 'VN' + ], + [ + '@type' => 'Country', + 'name' => 'VU' + ], + [ + '@type' => 'Country', + 'name' => 'WS' + ], + [ + '@type' => 'Country', + 'name' => 'XK' + ], + [ + '@type' => 'Country', + 'name' => 'ZA' + ], + [ + '@type' => 'Country', + 'name' => 'ZM' + ], + [ + '@type' => 'Country', + 'name' => 'ZW' + ] + ] + ] + ] + ] ] ]; diff --git a/tests/fixtures/output.jsbin.com.vonesu-10.php b/tests/fixtures/output.jsbin.com.vonesu-10.php index a8302873..702d3767 100644 --- a/tests/fixtures/output.jsbin.com.vonesu-10.php +++ b/tests/fixtures/output.jsbin.com.vonesu-10.php @@ -35,5 +35,6 @@ 'width' => 320, 'height' => 240, 'html' => '' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/pachunka.deviantart.com.art-cope-145564099.php b/tests/fixtures/pachunka.deviantart.com.art-cope-145564099.php index d51c424f..6c589650 100644 --- a/tests/fixtures/pachunka.deviantart.com.art-cope-145564099.php +++ b/tests/fixtures/pachunka.deviantart.com.art-cope-145564099.php @@ -22,5 +22,6 @@ 'title' => 'Cope by pachunka on DeviantArt', 'url' => 'https://www.deviantart.com/pachunka/art/Cope-145564099', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/pastebin.com.d4biutrm.php b/tests/fixtures/pastebin.com.d4biutrm.php index f114a1be..3489ba95 100644 --- a/tests/fixtures/pastebin.com.d4biutrm.php +++ b/tests/fixtures/pastebin.com.d4biutrm.php @@ -22,5 +22,6 @@ 'title' => 'Pushing new git submodule to Heroku - Pastebin.com', 'url' => 'https://pastebin.com/d4biUtRm', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/play.cadenaser.com.audio-001rd010000004275766.php b/tests/fixtures/play.cadenaser.com.audio-001rd010000004275766.php index 4960916d..cef0c0bb 100644 --- a/tests/fixtures/play.cadenaser.com.audio-001rd010000004275766.php +++ b/tests/fixtures/play.cadenaser.com.audio-001rd010000004275766.php @@ -48,5 +48,42 @@ ] ] ], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [ + [ + '@context' => 'https://schema.org', + '@type' => 'BreadcrumbList', + 'itemListElement' => [ + [ + '@type' => 'ListItem', + 'position' => 1, + 'item' => [ + '@id' => 'https://play.cadenaser.com/', + 'name' => 'PlaySER' + ] + ], + [ + '@type' => 'ListItem', + 'position' => 2, + 'item' => [ + '@id' => 'https://play.cadenaser.com/programa/hoy_por_hoy/', + 'name' => 'Hoy por Hoy' + ] + ] + ] + ], + [ + '@context' => 'https://schema.org', + '@type' => 'Corporation', + 'name' => 'cadenaser.com', + 'url' => 'https://cadenaser.com', + 'logo' => 'https://play.cadenaser.com/bundles/playserweb/img/logo_playser.svg', + 'sameAs' => [ + 'https://www.facebook.com/cadenaser', + 'https://twitter.com/La_SER', + 'https://plus.google.com/+cadenaser/', + 'https://www.youtube.com/user/cadenaser' + ] + ] + ] ]; diff --git a/tests/fixtures/play.spotify.com.album-7s66wu1xj2nsuuwm2nkiuv.php b/tests/fixtures/play.spotify.com.album-7s66wu1xj2nsuuwm2nkiuv.php index 9e67f45b..29f18cc1 100644 --- a/tests/fixtures/play.spotify.com.album-7s66wu1xj2nsuuwm2nkiuv.php +++ b/tests/fixtures/play.spotify.com.album-7s66wu1xj2nsuuwm2nkiuv.php @@ -781,5 +781,750 @@ 'thumbnail_url' => 'https://i.scdn.co/image/ab67616d00001e02022aca057f08a1d40c1f0733', 'thumbnail_width' => 300, 'thumbnail_height' => 300 + ], + 'allLinkedData' => [ + [ + '@context' => 'http://schema.googleapis.com/', + '@type' => 'MusicAlbum', + '@id' => 'https://open.spotify.com/album/7s66wU1XJ2NsUuWM2NKiUV', + 'url' => 'https://open.spotify.com/album/7s66wU1XJ2NsUuWM2NKiUV', + 'name' => 'A Cantar con Xabarin (Vol. I & II)', + 'description' => 'Listen to A Cantar con Xabarin (Vol. I & II) on Spotify. Various Artists · Compilation · 1996 · 44 songs.', + 'datePublished' => '1996-03-05', + 'potentialAction' => [ + '@type' => 'ListenAction', + 'target' => [ + [ + '@type' => 'EntryPoint', + 'urlTemplate' => 'https://open.spotify.com/album/7s66wU1XJ2NsUuWM2NKiUV?autoplay=true', + 'actionPlatform' => [ + 'http://schema.org/DesktopWebPlatform', + 'http://schema.org/IOSPlatform', + 'http://schema.googleapis.com/GoogleAudioCast', + 'http://schema.googleapis.com/GoogleVideoCast' + ] + ], + 'android-app://com.spotify.music/spotify/album/7s66wU1XJ2NsUuWM2NKiUV/play' + ], + 'expectsAcceptanceOf' => [ + '@type' => 'Offer', + 'category' => 'free', + 'eligibleRegion' => [ + [ + '@type' => 'Country', + 'name' => 'AD' + ], + [ + '@type' => 'Country', + 'name' => 'AE' + ], + [ + '@type' => 'Country', + 'name' => 'AG' + ], + [ + '@type' => 'Country', + 'name' => 'AL' + ], + [ + '@type' => 'Country', + 'name' => 'AM' + ], + [ + '@type' => 'Country', + 'name' => 'AO' + ], + [ + '@type' => 'Country', + 'name' => 'AR' + ], + [ + '@type' => 'Country', + 'name' => 'AT' + ], + [ + '@type' => 'Country', + 'name' => 'AU' + ], + [ + '@type' => 'Country', + 'name' => 'AZ' + ], + [ + '@type' => 'Country', + 'name' => 'BA' + ], + [ + '@type' => 'Country', + 'name' => 'BB' + ], + [ + '@type' => 'Country', + 'name' => 'BD' + ], + [ + '@type' => 'Country', + 'name' => 'BE' + ], + [ + '@type' => 'Country', + 'name' => 'BF' + ], + [ + '@type' => 'Country', + 'name' => 'BG' + ], + [ + '@type' => 'Country', + 'name' => 'BH' + ], + [ + '@type' => 'Country', + 'name' => 'BI' + ], + [ + '@type' => 'Country', + 'name' => 'BJ' + ], + [ + '@type' => 'Country', + 'name' => 'BN' + ], + [ + '@type' => 'Country', + 'name' => 'BO' + ], + [ + '@type' => 'Country', + 'name' => 'BR' + ], + [ + '@type' => 'Country', + 'name' => 'BS' + ], + [ + '@type' => 'Country', + 'name' => 'BT' + ], + [ + '@type' => 'Country', + 'name' => 'BW' + ], + [ + '@type' => 'Country', + 'name' => 'BY' + ], + [ + '@type' => 'Country', + 'name' => 'BZ' + ], + [ + '@type' => 'Country', + 'name' => 'CA' + ], + [ + '@type' => 'Country', + 'name' => 'CH' + ], + [ + '@type' => 'Country', + 'name' => 'CI' + ], + [ + '@type' => 'Country', + 'name' => 'CL' + ], + [ + '@type' => 'Country', + 'name' => 'CM' + ], + [ + '@type' => 'Country', + 'name' => 'CO' + ], + [ + '@type' => 'Country', + 'name' => 'CR' + ], + [ + '@type' => 'Country', + 'name' => 'CV' + ], + [ + '@type' => 'Country', + 'name' => 'CW' + ], + [ + '@type' => 'Country', + 'name' => 'CY' + ], + [ + '@type' => 'Country', + 'name' => 'CZ' + ], + [ + '@type' => 'Country', + 'name' => 'DE' + ], + [ + '@type' => 'Country', + 'name' => 'DJ' + ], + [ + '@type' => 'Country', + 'name' => 'DK' + ], + [ + '@type' => 'Country', + 'name' => 'DM' + ], + [ + '@type' => 'Country', + 'name' => 'DO' + ], + [ + '@type' => 'Country', + 'name' => 'DZ' + ], + [ + '@type' => 'Country', + 'name' => 'EC' + ], + [ + '@type' => 'Country', + 'name' => 'EE' + ], + [ + '@type' => 'Country', + 'name' => 'EG' + ], + [ + '@type' => 'Country', + 'name' => 'ES' + ], + [ + '@type' => 'Country', + 'name' => 'FI' + ], + [ + '@type' => 'Country', + 'name' => 'FJ' + ], + [ + '@type' => 'Country', + 'name' => 'FM' + ], + [ + '@type' => 'Country', + 'name' => 'FR' + ], + [ + '@type' => 'Country', + 'name' => 'GA' + ], + [ + '@type' => 'Country', + 'name' => 'GB' + ], + [ + '@type' => 'Country', + 'name' => 'GD' + ], + [ + '@type' => 'Country', + 'name' => 'GE' + ], + [ + '@type' => 'Country', + 'name' => 'GH' + ], + [ + '@type' => 'Country', + 'name' => 'GM' + ], + [ + '@type' => 'Country', + 'name' => 'GN' + ], + [ + '@type' => 'Country', + 'name' => 'GQ' + ], + [ + '@type' => 'Country', + 'name' => 'GR' + ], + [ + '@type' => 'Country', + 'name' => 'GT' + ], + [ + '@type' => 'Country', + 'name' => 'GW' + ], + [ + '@type' => 'Country', + 'name' => 'GY' + ], + [ + '@type' => 'Country', + 'name' => 'HK' + ], + [ + '@type' => 'Country', + 'name' => 'HN' + ], + [ + '@type' => 'Country', + 'name' => 'HR' + ], + [ + '@type' => 'Country', + 'name' => 'HT' + ], + [ + '@type' => 'Country', + 'name' => 'HU' + ], + [ + '@type' => 'Country', + 'name' => 'ID' + ], + [ + '@type' => 'Country', + 'name' => 'IE' + ], + [ + '@type' => 'Country', + 'name' => 'IL' + ], + [ + '@type' => 'Country', + 'name' => 'IN' + ], + [ + '@type' => 'Country', + 'name' => 'IS' + ], + [ + '@type' => 'Country', + 'name' => 'IT' + ], + [ + '@type' => 'Country', + 'name' => 'JM' + ], + [ + '@type' => 'Country', + 'name' => 'JO' + ], + [ + '@type' => 'Country', + 'name' => 'JP' + ], + [ + '@type' => 'Country', + 'name' => 'KE' + ], + [ + '@type' => 'Country', + 'name' => 'KG' + ], + [ + '@type' => 'Country', + 'name' => 'KH' + ], + [ + '@type' => 'Country', + 'name' => 'KI' + ], + [ + '@type' => 'Country', + 'name' => 'KM' + ], + [ + '@type' => 'Country', + 'name' => 'KN' + ], + [ + '@type' => 'Country', + 'name' => 'KR' + ], + [ + '@type' => 'Country', + 'name' => 'KW' + ], + [ + '@type' => 'Country', + 'name' => 'KZ' + ], + [ + '@type' => 'Country', + 'name' => 'LA' + ], + [ + '@type' => 'Country', + 'name' => 'LB' + ], + [ + '@type' => 'Country', + 'name' => 'LC' + ], + [ + '@type' => 'Country', + 'name' => 'LI' + ], + [ + '@type' => 'Country', + 'name' => 'LK' + ], + [ + '@type' => 'Country', + 'name' => 'LR' + ], + [ + '@type' => 'Country', + 'name' => 'LS' + ], + [ + '@type' => 'Country', + 'name' => 'LT' + ], + [ + '@type' => 'Country', + 'name' => 'LU' + ], + [ + '@type' => 'Country', + 'name' => 'LV' + ], + [ + '@type' => 'Country', + 'name' => 'MA' + ], + [ + '@type' => 'Country', + 'name' => 'MC' + ], + [ + '@type' => 'Country', + 'name' => 'MD' + ], + [ + '@type' => 'Country', + 'name' => 'ME' + ], + [ + '@type' => 'Country', + 'name' => 'MG' + ], + [ + '@type' => 'Country', + 'name' => 'MH' + ], + [ + '@type' => 'Country', + 'name' => 'MK' + ], + [ + '@type' => 'Country', + 'name' => 'ML' + ], + [ + '@type' => 'Country', + 'name' => 'MN' + ], + [ + '@type' => 'Country', + 'name' => 'MO' + ], + [ + '@type' => 'Country', + 'name' => 'MR' + ], + [ + '@type' => 'Country', + 'name' => 'MT' + ], + [ + '@type' => 'Country', + 'name' => 'MU' + ], + [ + '@type' => 'Country', + 'name' => 'MV' + ], + [ + '@type' => 'Country', + 'name' => 'MW' + ], + [ + '@type' => 'Country', + 'name' => 'MX' + ], + [ + '@type' => 'Country', + 'name' => 'MY' + ], + [ + '@type' => 'Country', + 'name' => 'MZ' + ], + [ + '@type' => 'Country', + 'name' => 'NA' + ], + [ + '@type' => 'Country', + 'name' => 'NE' + ], + [ + '@type' => 'Country', + 'name' => 'NG' + ], + [ + '@type' => 'Country', + 'name' => 'NI' + ], + [ + '@type' => 'Country', + 'name' => 'NL' + ], + [ + '@type' => 'Country', + 'name' => 'NO' + ], + [ + '@type' => 'Country', + 'name' => 'NP' + ], + [ + '@type' => 'Country', + 'name' => 'NR' + ], + [ + '@type' => 'Country', + 'name' => 'NZ' + ], + [ + '@type' => 'Country', + 'name' => 'OM' + ], + [ + '@type' => 'Country', + 'name' => 'PA' + ], + [ + '@type' => 'Country', + 'name' => 'PE' + ], + [ + '@type' => 'Country', + 'name' => 'PG' + ], + [ + '@type' => 'Country', + 'name' => 'PH' + ], + [ + '@type' => 'Country', + 'name' => 'PK' + ], + [ + '@type' => 'Country', + 'name' => 'PL' + ], + [ + '@type' => 'Country', + 'name' => 'PS' + ], + [ + '@type' => 'Country', + 'name' => 'PT' + ], + [ + '@type' => 'Country', + 'name' => 'PW' + ], + [ + '@type' => 'Country', + 'name' => 'PY' + ], + [ + '@type' => 'Country', + 'name' => 'QA' + ], + [ + '@type' => 'Country', + 'name' => 'RO' + ], + [ + '@type' => 'Country', + 'name' => 'RS' + ], + [ + '@type' => 'Country', + 'name' => 'RU' + ], + [ + '@type' => 'Country', + 'name' => 'RW' + ], + [ + '@type' => 'Country', + 'name' => 'SA' + ], + [ + '@type' => 'Country', + 'name' => 'SB' + ], + [ + '@type' => 'Country', + 'name' => 'SC' + ], + [ + '@type' => 'Country', + 'name' => 'SE' + ], + [ + '@type' => 'Country', + 'name' => 'SG' + ], + [ + '@type' => 'Country', + 'name' => 'SI' + ], + [ + '@type' => 'Country', + 'name' => 'SK' + ], + [ + '@type' => 'Country', + 'name' => 'SL' + ], + [ + '@type' => 'Country', + 'name' => 'SM' + ], + [ + '@type' => 'Country', + 'name' => 'SN' + ], + [ + '@type' => 'Country', + 'name' => 'SR' + ], + [ + '@type' => 'Country', + 'name' => 'ST' + ], + [ + '@type' => 'Country', + 'name' => 'SV' + ], + [ + '@type' => 'Country', + 'name' => 'SZ' + ], + [ + '@type' => 'Country', + 'name' => 'TD' + ], + [ + '@type' => 'Country', + 'name' => 'TG' + ], + [ + '@type' => 'Country', + 'name' => 'TH' + ], + [ + '@type' => 'Country', + 'name' => 'TL' + ], + [ + '@type' => 'Country', + 'name' => 'TN' + ], + [ + '@type' => 'Country', + 'name' => 'TO' + ], + [ + '@type' => 'Country', + 'name' => 'TR' + ], + [ + '@type' => 'Country', + 'name' => 'TT' + ], + [ + '@type' => 'Country', + 'name' => 'TV' + ], + [ + '@type' => 'Country', + 'name' => 'TW' + ], + [ + '@type' => 'Country', + 'name' => 'TZ' + ], + [ + '@type' => 'Country', + 'name' => 'UA' + ], + [ + '@type' => 'Country', + 'name' => 'UG' + ], + [ + '@type' => 'Country', + 'name' => 'US' + ], + [ + '@type' => 'Country', + 'name' => 'UY' + ], + [ + '@type' => 'Country', + 'name' => 'UZ' + ], + [ + '@type' => 'Country', + 'name' => 'VC' + ], + [ + '@type' => 'Country', + 'name' => 'VN' + ], + [ + '@type' => 'Country', + 'name' => 'VU' + ], + [ + '@type' => 'Country', + 'name' => 'WS' + ], + [ + '@type' => 'Country', + 'name' => 'XK' + ], + [ + '@type' => 'Country', + 'name' => 'ZA' + ], + [ + '@type' => 'Country', + 'name' => 'ZM' + ], + [ + '@type' => 'Country', + 'name' => 'ZW' + ] + ] + ] + ] + ] ] ]; diff --git a/tests/fixtures/polldaddy.com.poll-7012505.php b/tests/fixtures/polldaddy.com.poll-7012505.php index c6e41898..cb98357e 100644 --- a/tests/fixtures/polldaddy.com.poll-7012505.php +++ b/tests/fixtures/polldaddy.com.poll-7012505.php @@ -36,5 +36,6 @@ 'provider_url' => 'https://crowdsignal.com', 'title' => 'Which design do you prefer?', 'html' => '' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/sassmeister.com.gist-1122e441f0434ec6eb2a.php b/tests/fixtures/sassmeister.com.gist-1122e441f0434ec6eb2a.php index ab14442b..88059153 100644 --- a/tests/fixtures/sassmeister.com.gist-1122e441f0434ec6eb2a.php +++ b/tests/fixtures/sassmeister.com.gist-1122e441f0434ec6eb2a.php @@ -27,5 +27,6 @@ 'title' => 'SassMeister | The Sass Playground!', 'url' => 'https://www.sassmeister.com/gist/1122e441f0434ec6eb2a', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/slides.com.alexwalker-responsive-svg.php b/tests/fixtures/slides.com.alexwalker-responsive-svg.php index a41ae245..0b3bb06f 100644 --- a/tests/fixtures/slides.com.alexwalker-responsive-svg.php +++ b/tests/fixtures/slides.com.alexwalker-responsive-svg.php @@ -27,5 +27,6 @@ 'title' => 'responsive-svg', 'url' => 'http://slides.com/alexwalker/responsive-svg/', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/snipplr.com.view-72914-better-html-5-basic-starter-template.php b/tests/fixtures/snipplr.com.view-72914-better-html-5-basic-starter-template.php index 23e37f8a..14d694e6 100644 --- a/tests/fixtures/snipplr.com.view-72914-better-html-5-basic-starter-template.php +++ b/tests/fixtures/snipplr.com.view-72914-better-html-5-basic-starter-template.php @@ -27,5 +27,6 @@ 'title' => 'Better HTML 5 basic starter template - HTML Snipplr Social Repository', 'url' => 'https://snipplr.com/view/72914/better-html-5-basic-starter-template', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/soundcloud.com.bruceneilmusic.php b/tests/fixtures/soundcloud.com.bruceneilmusic.php index 601b35e1..5d635f55 100644 --- a/tests/fixtures/soundcloud.com.bruceneilmusic.php +++ b/tests/fixtures/soundcloud.com.bruceneilmusic.php @@ -49,5 +49,6 @@ 'html' => '', 'author_name' => 'Bruce Neil', 'author_url' => 'https://soundcloud.com/bruceneilmusic' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/soundcloud.com.ididthat-1-lowe-ct-cape-times-world-cup.php b/tests/fixtures/soundcloud.com.ididthat-1-lowe-ct-cape-times-world-cup.php index 3932a8da..1b284744 100644 --- a/tests/fixtures/soundcloud.com.ididthat-1-lowe-ct-cape-times-world-cup.php +++ b/tests/fixtures/soundcloud.com.ididthat-1-lowe-ct-cape-times-world-cup.php @@ -49,5 +49,6 @@ 'html' => '', 'author_name' => 'IDIDTHAT.co', 'author_url' => 'https://soundcloud.com/ididthat-1' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/soundcloud.com.zedsdead-zeds-dead-twin-shadow-lost-you-feat-dangelo-lacy.php b/tests/fixtures/soundcloud.com.zedsdead-zeds-dead-twin-shadow-lost-you-feat-dangelo-lacy.php index 39cf2fa9..cdae2051 100644 --- a/tests/fixtures/soundcloud.com.zedsdead-zeds-dead-twin-shadow-lost-you-feat-dangelo-lacy.php +++ b/tests/fixtures/soundcloud.com.zedsdead-zeds-dead-twin-shadow-lost-you-feat-dangelo-lacy.php @@ -61,5 +61,6 @@ 'html' => '', 'author_name' => 'Zeds Dead', 'author_url' => 'https://soundcloud.com/zedsdead' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/twitter.com.pepephone-status-436461658601713664.php b/tests/fixtures/twitter.com.pepephone-status-436461658601713664.php index b65251c7..cc7b20e5 100644 --- a/tests/fixtures/twitter.com.pepephone-status-436461658601713664.php +++ b/tests/fixtures/twitter.com.pepephone-status-436461658601713664.php @@ -95,4 +95,5 @@ 'version' => '1.0' ], 'api' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/vimeo.com.235352744.php b/tests/fixtures/vimeo.com.235352744.php index d434b09d..3ec40e68 100644 --- a/tests/fixtures/vimeo.com.235352744.php +++ b/tests/fixtures/vimeo.com.235352744.php @@ -105,5 +105,60 @@ 'upload_date' => '2017-09-25 10:36:56', 'video_id' => 235352744, 'uri' => '/videos/235352744' + ], + 'allLinkedData' => [ + [ + 'url' => 'https://vimeo.com/235352744', + 'thumbnailUrl' => 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F657162424_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png', + 'embedUrl' => 'https://player.vimeo.com/video/235352744', + 'name' => 'Vimeo Live is here', + 'description' => 'Professional live streaming is here. Learn more at vimeo.com/live', + 'height' => 1080, + 'width' => 1920, + 'playerType' => 'HTML5 Flash', + 'videoQuality' => 'HD', + 'duration' => 'PT00H01M15S', + 'uploadDate' => '2017-09-25T10:36:56-04:00', + 'dateModified' => '2021-04-04T08:57:58-04:00', + 'thumbnail' => [ + '@type' => 'ImageObject', + 'url' => 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F657162424_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png', + 'width' => 1280, + 'height' => 720 + ], + 'author' => [ + '@type' => 'Person', + 'name' => 'Vimeo', + 'url' => 'https://vimeo.com/vimeomarketing' + ], + 'potentialAction' => [ + '@type' => 'ViewAction', + 'target' => 'vimeo://app.vimeo.com/videos/235352744' + ], + '@type' => 'VideoObject', + '@context' => 'http://schema.org' + ], + [ + 'itemListElement' => [ + [ + '@type' => 'ListItem', + 'position' => 1, + 'item' => [ + '@id' => 'https://vimeo.com/vimeomarketing', + 'name' => 'Vimeo' + ] + ], + [ + '@type' => 'ListItem', + 'position' => 2, + 'item' => [ + '@id' => 'https://vimeo.com/vimeomarketing/videos', + 'name' => 'Videos' + ] + ] + ], + '@type' => 'BreadcrumbList', + '@context' => 'http://schema.org' + ] ] ]; diff --git a/tests/fixtures/wordpress.tv.2013-09-06-dave-ross-optimize-image-files-like-a-pro.php b/tests/fixtures/wordpress.tv.2013-09-06-dave-ross-optimize-image-files-like-a-pro.php index 52cb2ed0..6be3713b 100644 --- a/tests/fixtures/wordpress.tv.2013-09-06-dave-ross-optimize-image-files-like-a-pro.php +++ b/tests/fixtures/wordpress.tv.2013-09-06-dave-ross-optimize-image-files-like-a-pro.php @@ -71,5 +71,39 @@ 'html' => 'Images, even small ones, can be the biggest files that make up your site. Learn the tools, plugins, and theming techniques you’ll want to start using to shrink your page load times and save your mobile users a few bucks without sacrificing image quality. Presentation Slides »' + ], + 'allLinkedData' => [ + [ + '@context' => 'https://schema.org', + '@graph' => [ + [ + '@type' => 'VideoObject', + 'actor' => [ + [ + '@type' => 'Person', + 'name' => 'Dave Ross', + 'url' => 'https://wordpress.tv/speakers/dave-ross/' + ] + ], + 'name' => 'Dave Ross: Optimize Image Files Like a Pro', + 'url' => 'https://wordpress.tv/2013/09/06/dave-ross-optimize-image-files-like-a-pro/', + 'contentUrl' => [ + 'https://videos.files.wordpress.com/TqDCJmoq/optimize-image-files_hd.mp4', + 'https://videos.files.wordpress.com/TqDCJmoq/optimize-image-files_dvd.mp4', + 'https://videos.files.wordpress.com/TqDCJmoq/optimize-image-files_std.mp4' + ], + 'description' => 'Images, even small ones, can be the biggest files that make up your site. Learn the tools, plugins, and theming techniques you’ll want to start using to shrink your page load times and save your mobile users a few bucks without sacrificing image quality. + +Presentation Slides »', + 'duration' => 'P0DT00H29M20S', + 'height' => '1080', + 'inLanguage' => 'en', + 'isFamilyFriendly' => true, + 'thumbnailUrl' => 'https://videos.files.wordpress.com/TqDCJmoq/optimize-image-files_scruberthumbnail_0.jpg', + 'uploadDate' => '2013-09-06', + 'width' => '1920' + ] + ] + ] ] ]; diff --git a/tests/fixtures/www.23hq.com.zzleeper-photo-16600737.php b/tests/fixtures/www.23hq.com.zzleeper-photo-16600737.php index e7e10bac..5033b553 100644 --- a/tests/fixtures/www.23hq.com.zzleeper-photo-16600737.php +++ b/tests/fixtures/www.23hq.com.zzleeper-photo-16600737.php @@ -63,5 +63,6 @@ 'thumbnail_width' => 756, 'thumbnail_height' => 567, 'thumbnail_url' => 'http://www.23hq.com/16171062/16600737_ac392e8a4d667e4726fbafc8a21728d5_large.jpg' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.abanca.com.gl.php b/tests/fixtures/www.abanca.com.gl.php index aadf40d6..daeea813 100644 --- a/tests/fixtures/www.abanca.com.gl.php +++ b/tests/fixtures/www.abanca.com.gl.php @@ -48,5 +48,22 @@ ] ] ], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [ + [ + '@context' => 'http://schema.org', + '@type' => 'Organization', + 'name' => '', + 'url' => '//www.abanca.com', + 'logo' => '//www.abanca.com/img/logo-social.jpg', + 'sameAs' => [], + 'contactPoint' => [ + [ + '@type' => 'ContactPoint', + 'telephone' => '-', + 'contactType' => 'customer service' + ] + ] + ] + ] ]; diff --git a/tests/fixtures/www.aol.com.video-view-pile-of-recovering-foster-kittens-is-purrfect-595fe75985eb42109b69bedb.php b/tests/fixtures/www.aol.com.video-view-pile-of-recovering-foster-kittens-is-purrfect-595fe75985eb42109b69bedb.php index 4a429b48..a1895839 100644 --- a/tests/fixtures/www.aol.com.video-view-pile-of-recovering-foster-kittens-is-purrfect-595fe75985eb42109b69bedb.php +++ b/tests/fixtures/www.aol.com.video-view-pile-of-recovering-foster-kittens-is-purrfect-595fe75985eb42109b69bedb.php @@ -22,5 +22,6 @@ 'title' => 'AOL Video - Serving the best video content from AOL and around the web', 'url' => 'https://www.aol.com/video/view/pile-of-recovering-foster-kittens-is-purrfect/595fe75985eb42109b69bedb/', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.bbc.co.uk.news-uk-54222286.php b/tests/fixtures/www.bbc.co.uk.news-uk-54222286.php index 728bedd4..0a79fb0b 100644 --- a/tests/fixtures/www.bbc.co.uk.news-uk-54222286.php +++ b/tests/fixtures/www.bbc.co.uk.news-uk-54222286.php @@ -58,5 +58,41 @@ ] ] ], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [ + [ + '@context' => 'http://schema.org', + '@type' => 'ReportageNewsArticle', + 'url' => 'https://www.bbc.co.uk/news/uk-54222286', + 'publisher' => [ + '@type' => 'NewsMediaOrganization', + 'name' => 'BBC News', + 'publishingPrinciples' => 'http://www.bbc.co.uk/news/help-41670342', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.bbc.co.uk/news/special/2015/newsspec_10857/bbc_news_logo.png?cb=1' + ] + ], + 'datePublished' => '2020-09-20T06:33:33.000Z', + 'dateModified' => '2020-09-20T06:33:33.000Z', + 'headline' => 'Coronavirus: £10,000 fines for failing to self-isolate and lockdown life in photos', + 'image' => [ + '@type' => 'ImageObject', + 'width' => 976, + 'height' => 549, + 'url' => 'https://ichef.bbci.co.uk/news/1024/branded_news/CC94/production/_111527325_index_daily_update_version02_cv_976new.png' + ], + 'thumbnailUrl' => 'https://ichef.bbci.co.uk/news/1024/branded_news/CC94/production/_111527325_index_daily_update_version02_cv_976new.png', + 'mainEntityOfPage' => 'https://www.bbc.co.uk/news/uk-54222286', + 'author' => [ + '@type' => 'NewsMediaOrganization', + 'name' => 'BBC News', + 'noBylinesPolicy' => 'http://www.bbc.co.uk/news/help-41670342#authorexpertise', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.bbc.co.uk/news/special/2015/newsspec_10857/bbc_news_logo.png?cb=1' + ] + ] + ] + ] ]; diff --git a/tests/fixtures/www.dailymotion.com.video-xy0wd.php b/tests/fixtures/www.dailymotion.com.video-xy0wd.php index 1b2eeef8..193867c9 100644 --- a/tests/fixtures/www.dailymotion.com.video-xy0wd.php +++ b/tests/fixtures/www.dailymotion.com.video-xy0wd.php @@ -42,5 +42,6 @@ 'thumbnail_url' => 'https://s2.dmcdn.net/v/63aD1VtIdtBWR7nC/x240', 'thumbnail_width' => 320, 'thumbnail_height' => 240 - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.deviantart.com.art-misty-510056679.php b/tests/fixtures/www.deviantart.com.art-misty-510056679.php index f64924bb..9af2f4e2 100644 --- a/tests/fixtures/www.deviantart.com.art-misty-510056679.php +++ b/tests/fixtures/www.deviantart.com.art-misty-510056679.php @@ -22,5 +22,6 @@ 'title' => 'Misty by sakimichan on DeviantArt', 'url' => 'https://www.deviantart.com/sakimichan/art/Misty-510056679', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.flickr.com.photos-desescribir-sets-72157650686499888.php b/tests/fixtures/www.flickr.com.photos-desescribir-sets-72157650686499888.php index 8967af43..93d255b1 100644 --- a/tests/fixtures/www.flickr.com.photos-desescribir-sets-72157650686499888.php +++ b/tests/fixtures/www.flickr.com.photos-desescribir-sets-72157650686499888.php @@ -29,6 +29,57 @@ 'title' => 'Günther Förg. Verfolgen Malerei / Fundación Luís Seoane', 'url' => 'https://www.flickr.com/photos/desescribir/sets/72157650686499888', 'linkedData' => [ + '@context' => 'https://schema.org', + '@type' => 'BlogPosting', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.flickr.com/photos/desescribir/sets/72157650686499888' + ], + 'headline' => 'Günther Förg. Verfolgen Malerei / Fundación Luís Seoane', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://live.staticflickr.com/8572/16055522574_ce77fde14e_b.jpg', + 'height' => 680, + 'width' => 1024 + ], + 'author' => [ + '@type' => 'Person', + 'name' => 'desescribir', + 'sameAs' => 'https://www.flickr.com/photos/desescribir/' + ], + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'Flickr', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.flickr.com/images/opensearch-flickr-logo.png', + 'width' => 64, + 'height' => 64 + ] + ], + 'description' => 'Explore this photo album by desescribir on Flickr!' + ], + 'oEmbed' => [ + 'type' => 'rich', + 'flickr_type' => 'album', + 'title' => 'Günther Förg. Verfolgen Malerei / Fundación Luís Seoane', + 'author_name' => 'desescribir', + 'author_url' => 'https://www.flickr.com/photos/desescribir/', + 'width' => 800, + 'height' => 600, + 'web_page' => 'https://www.flickr.com/photos/desescribir/sets/72157650686499888', + 'thumbnail_url' => 'https://live.staticflickr.com/8572/16055522574_ce77fde14e_b.jpg', + 'thumbnail_width' => 800, + 'thumbnail_height' => 600, + 'web_page_short_url' => 'https://flic.kr/s/aHsk8hUbqq', + 'license_url' => 'https://creativecommons.org/licenses/by-nc-nd/2.0/', + 'html' => '\'Günther', + 'version' => '1.0', + 'cache_age' => 3600, + 'provider_name' => 'Flickr', + 'provider_url' => 'https://www.flickr.com/' + ], + 'allLinkedData' => [ [ '@context' => 'http://schema.org', '@type' => 'WebSite', @@ -59,26 +110,37 @@ 'https://plus.google.com/+flickr', 'https://www.pinterest.com/flickr' ] + ], + [ + '@context' => 'https://schema.org', + '@type' => 'BlogPosting', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.flickr.com/photos/desescribir/sets/72157650686499888' + ], + 'headline' => 'Günther Förg. Verfolgen Malerei / Fundación Luís Seoane', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://live.staticflickr.com/8572/16055522574_ce77fde14e_b.jpg', + 'height' => 680, + 'width' => 1024 + ], + 'author' => [ + '@type' => 'Person', + 'name' => 'desescribir', + 'sameAs' => 'https://www.flickr.com/photos/desescribir/' + ], + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'Flickr', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.flickr.com/images/opensearch-flickr-logo.png', + 'width' => 64, + 'height' => 64 + ] + ], + 'description' => 'Explore this photo album by desescribir on Flickr!' ] - ], - 'oEmbed' => [ - 'type' => 'rich', - 'flickr_type' => 'album', - 'title' => 'Günther Förg. Verfolgen Malerei / Fundación Luís Seoane', - 'author_name' => 'desescribir', - 'author_url' => 'https://www.flickr.com/photos/desescribir/', - 'width' => 800, - 'height' => 600, - 'web_page' => 'https://www.flickr.com/photos/desescribir/sets/72157650686499888', - 'thumbnail_url' => 'https://live.staticflickr.com/8572/16055522574_ce77fde14e_b.jpg', - 'thumbnail_width' => 800, - 'thumbnail_height' => 600, - 'web_page_short_url' => 'https://flic.kr/s/aHsk8hUbqq', - 'license_url' => 'https://creativecommons.org/licenses/by-nc-nd/2.0/', - 'html' => '\'Günther', - 'version' => '1.0', - 'cache_age' => 3600, - 'provider_name' => 'Flickr', - 'provider_url' => 'https://www.flickr.com/' ] ]; diff --git a/tests/fixtures/www.flickr.com.photos-desescribir.php b/tests/fixtures/www.flickr.com.photos-desescribir.php index 2f207583..ef39f639 100644 --- a/tests/fixtures/www.flickr.com.photos-desescribir.php +++ b/tests/fixtures/www.flickr.com.photos-desescribir.php @@ -81,5 +81,69 @@ 'cache_age' => 3600, 'provider_name' => 'Flickr', 'provider_url' => 'https://www.flickr.com/' + ], + 'allLinkedData' => [ + [ + '@context' => 'http://schema.org', + '@type' => 'WebSite', + 'name' => 'Flickr', + 'url' => 'https://www.flickr.com', + 'potentialAction' => [ + '@type' => 'SearchAction', + 'target' => 'https://www.flickr.com/search?text={search_term_string}&structured=yes', + 'query-input' => 'required name=search_term_string' + ] + ], + [ + '@context' => 'http://schema.org', + '@type' => 'Organization', + 'url' => 'http://www.flickr.com', + 'logo' => 'https://www.flickr.com/images/opensearch-flickr-logo.png' + ], + [ + '@context' => 'http://schema.org', + '@type' => 'Person', + 'name' => 'Flickr', + 'url' => 'https://www.flickr.com', + 'sameAs' => [ + 'https://www.facebook.com/flickr', + 'https://instagram.com/flickr', + 'https://flickr.tumblr.com', + 'https://twitter.com/flickr', + 'https://plus.google.com/+flickr', + 'https://www.pinterest.com/flickr' + ] + ], + [ + '@context' => 'https://schema.org', + '@type' => 'BlogPosting', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.flickr.com/photos/desescribir/' + ], + 'headline' => 'desescribir', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://live.staticflickr.com/8765/17244790083_d2f40f713f_z.jpg', + 'height' => 454, + 'width' => 640 + ], + 'author' => [ + '@type' => 'Person', + 'name' => 'desescribir', + 'sameAs' => 'https://www.flickr.com/photos/desescribir/' + ], + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'Flickr', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.flickr.com/images/opensearch-flickr-logo.png', + 'width' => 64, + 'height' => 64 + ] + ], + 'description' => 'Explore desescribir's 618 photos on Flickr!' + ] ] ]; diff --git a/tests/fixtures/www.hookem.com.story-texas-shortstop-joe-baker-arrested-public-intoxication.php b/tests/fixtures/www.hookem.com.story-texas-shortstop-joe-baker-arrested-public-intoxication.php index 8e89c31c..cbc31bba 100644 --- a/tests/fixtures/www.hookem.com.story-texas-shortstop-joe-baker-arrested-public-intoxication.php +++ b/tests/fixtures/www.hookem.com.story-texas-shortstop-joe-baker-arrested-public-intoxication.php @@ -55,5 +55,38 @@ ], 'url' => 'https://www.hookem.com/' ], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [ + [ + '@context' => 'http://schema.org', + '@type' => 'WebPage', + 'author' => [ + '@type' => 'Person', + 'name' => 'Hookem.com Staff' + ], + 'dateModified' => '2021-04-03T23:43:58Z', + 'datePublished' => '2021-04-03T23:43:58Z', + 'headline' => 'Home', + 'image' => [], + 'keywords' => [ + 'ssts:home', + 'type:front' + ], + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.hookem.com/' + ], + 'publisher' => [ + '@type' => 'Organization', + 'logo' => [ + '@type' => 'ImageObject', + 'height' => 80, + 'url' => 'https://www.gannett-cdn.com/sites/hookem/images/site-nav-logo@2x.png', + 'width' => 297 + ], + 'name' => 'Hookem.com' + ], + 'url' => 'https://www.hookem.com/' + ] + ] ]; diff --git a/tests/fixtures/www.kickstarter.com.projects-1452363698-good-seed-craft-veggie-burgers.php b/tests/fixtures/www.kickstarter.com.projects-1452363698-good-seed-craft-veggie-burgers.php index df01933b..f7a7dcae 100644 --- a/tests/fixtures/www.kickstarter.com.projects-1452363698-good-seed-craft-veggie-burgers.php +++ b/tests/fixtures/www.kickstarter.com.projects-1452363698-good-seed-craft-veggie-burgers.php @@ -41,5 +41,6 @@ 'width' => 480, 'height' => 270.0, 'html' => '' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.meetup.com.es-gpul-labs-events-248885422.php b/tests/fixtures/www.meetup.com.es-gpul-labs-events-248885422.php index 4fd866d7..49957c45 100644 --- a/tests/fixtures/www.meetup.com.es-gpul-labs-events-248885422.php +++ b/tests/fixtures/www.meetup.com.es-gpul-labs-events-248885422.php @@ -91,5 +91,79 @@ 'url' => 'https://www.meetup.com/es/GPUL-Labs/' ] ], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [ + [ + '@context' => 'http://schema.org', + '@type' => 'Event', + 'name' => 'Introducción a Flutter', + 'url' => 'https://www.meetup.com/es/GPUL-Labs/events/248885422/', + 'description' => 'Fernando Souto - MOBGEN + +Desde que Google anunció en el MWC que Flutter entraba en oficialmente beta, el interés por esta plataforma se ha multiplicado. + +Flutter es un SDK en lenguaje Dart para generar apps nativas multiplataforma, que permite un desarrollo eficaz, una interfaz de usuario expresiva y un buen rendimiento. + +Si estás interesado en saber más y aprender sobre Flutter apúntate. Haremos una introducción práctica al funcionamiento de Flutter desarollando un ejemplo práctico aplicando un', + 'startDate' => '2018-05-24T19:00+02:00', + 'endDate' => '2018-05-24T22:00+02:00', + 'eventStatus' => 'https://schema.org/EventScheduled', + 'eventAttendanceMode' => 'https://schema.org/OfflineEventAttendanceMode', + 'location' => [ + '@type' => 'Place', + 'name' => 'Vivero de empresas Accede Papagaio', + 'address' => [ + '@type' => 'PostalAddress', + 'addressLocality' => 'A Coruña', + 'addressCountry' => 'España', + 'streetAddress' => 'Rúa Hospital, 19, 15002' + ], + 'geo' => [ + '@type' => 'GeoCoordinates', + 'latitude' => 43.37335968017578, + 'longitude' => -8.399272918701172 + ] + ], + 'offers' => [ + '@type' => 'Offer', + 'price' => '0', + 'priceCurrency' => 'USD' + ], + 'organizer' => [ + '@type' => 'Organization', + 'name' => 'GPUL', + 'url' => 'https://www.meetup.com/es/GPUL-Labs/' + ] + ], + [ + '@context' => 'http://schema.org', + '@type' => 'BreadcrumbList', + 'itemListElement' => [ + [ + '@type' => 'ListItem', + 'position' => 1, + 'item' => [ + '@id' => 'https://www.meetup.com/es/GPUL-Labs/', + 'name' => 'GPUL' + ] + ], + [ + '@type' => 'ListItem', + 'position' => 2, + 'item' => [ + '@id' => 'https://www.meetup.com/es/GPUL-Labs/events/', + 'name' => 'Events' + ] + ], + [ + '@type' => 'ListItem', + 'position' => 3, + 'item' => [ + '@id' => 'https://www.meetup.com/es/GPUL-Labs/events/248885422/', + 'name' => 'Introducción a Flutter' + ] + ] + ] + ] + ] ]; diff --git a/tests/fixtures/www.pinterest.com.pin-106890191127977979.php b/tests/fixtures/www.pinterest.com.pin-106890191127977979.php index 13704e44..d7475d9e 100644 --- a/tests/fixtures/www.pinterest.com.pin-106890191127977979.php +++ b/tests/fixtures/www.pinterest.com.pin-106890191127977979.php @@ -41,5 +41,6 @@ 'thumbnail_url' => 'https://i.pinimg.com/236x/b5/34/13/b53413787f3a42c8b9d5b08a6fbb2124--jack-nicholson-jack-oconnell.jpg', 'thumbnail_width' => 236, 'thumbnail_height' => 295 - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.politico.com.story-2013-12-presidents-barack-obama-george-w-bush-second-term-101314.html.php b/tests/fixtures/www.politico.com.story-2013-12-presidents-barack-obama-george-w-bush-second-term-101314.html.php index 78b34c06..8be52d6e 100644 --- a/tests/fixtures/www.politico.com.story-2013-12-presidents-barack-obama-george-w-bush-second-term-101314.html.php +++ b/tests/fixtures/www.politico.com.story-2013-12-presidents-barack-obama-george-w-bush-second-term-101314.html.php @@ -37,5 +37,6 @@ 'version' => '1.0', 'type' => 'rich', 'html' => '' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.reddit.com.r-investing-comments-7pfpeq-buffett_on_cyrptocurrencies_i_can_say_almost_with.php b/tests/fixtures/www.reddit.com.r-investing-comments-7pfpeq-buffett_on_cyrptocurrencies_i_can_say_almost_with.php index 06c671e7..43a086b7 100644 --- a/tests/fixtures/www.reddit.com.r-investing-comments-7pfpeq-buffett_on_cyrptocurrencies_i_can_say_almost_with.php +++ b/tests/fixtures/www.reddit.com.r-investing-comments-7pfpeq-buffett_on_cyrptocurrencies_i_can_say_almost_with.php @@ -41,5 +41,6 @@ ', 'author_name' => 'dennisrieves' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.scribd.com.doc-110799637-synthesis-of-knowledge-effects-of-fire-and-thinning-treatments-on-understory-vegetation-in-dry-u-s-forests.php b/tests/fixtures/www.scribd.com.doc-110799637-synthesis-of-knowledge-effects-of-fire-and-thinning-treatments-on-understory-vegetation-in-dry-u-s-forests.php index d4cfe1c5..5efb10e7 100644 --- a/tests/fixtures/www.scribd.com.doc-110799637-synthesis-of-knowledge-effects-of-fire-and-thinning-treatments-on-understory-vegetation-in-dry-u-s-forests.php +++ b/tests/fixtures/www.scribd.com.doc-110799637-synthesis-of-knowledge-effects-of-fire-and-thinning-treatments-on-understory-vegetation-in-dry-u-s-forests.php @@ -66,5 +66,28 @@ 'html' => '' + ], + 'allLinkedData' => [ + [ + '@context' => 'http://schema.org', + '@type' => 'MediaObject', + 'additionalType' => 'Product', + 'name' => 'Synthesis of Knowledge: Effects of Fire and Thinning Treatments on Understory Vegetation in Dry U.S. Forests', + 'image' => [ + 'https://imgv2-1-f.scribdassets.com/img/document/110799637/149x198/ca766a678b/1521312948?v=1', + 'https://imgv2-2-f.scribdassets.com/img/document/110799637/298x396/889f159160/1521312948?v=1' + ], + 'aggregateRating' => [ + '@type' => 'AggregateRating', + 'ratingValue' => 5.0, + 'ratingCount' => 1 + ], + 'isAccessibleForFree' => 'False', + 'hasPart' => [ + '@type' => 'WebPageElement', + 'isAccessibleForFree' => 'False', + 'cssSelector' => '.blurred_page' + ] + ] ] ]; diff --git a/tests/fixtures/www.soundhelix.com.examples-mp3-soundhelix-song-1.mp3.php b/tests/fixtures/www.soundhelix.com.examples-mp3-soundhelix-song-1.mp3.php index 641c6d39..1d646d7b 100644 --- a/tests/fixtures/www.soundhelix.com.examples-mp3-soundhelix-song-1.mp3.php +++ b/tests/fixtures/www.soundhelix.com.examples-mp3-soundhelix-song-1.mp3.php @@ -27,5 +27,6 @@ 'title' => null, 'url' => 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.spreaker.com.user-angelclark-angel-clark-ice-cream-tocos.php b/tests/fixtures/www.spreaker.com.user-angelclark-angel-clark-ice-cream-tocos.php index 98e667e3..48334058 100644 --- a/tests/fixtures/www.spreaker.com.user-angelclark-angel-clark-ice-cream-tocos.php +++ b/tests/fixtures/www.spreaker.com.user-angelclark-angel-clark-ice-cream-tocos.php @@ -39,5 +39,6 @@ 'width' => 640, 'height' => 480, 'thumbnail_url' => 'https://d3wo5wojvuv7l.cloudfront.net/t_widget_player_cover_medium/images.spreaker.com/original/07176451fd3625d19c5e5d88d9f1bfbb.jpg' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.ted.com.talks-george_monbiot_for_more_wonder_rewild_the_world.07a0d4dfc7fba14d52025577270bbe9c.php b/tests/fixtures/www.ted.com.talks-george_monbiot_for_more_wonder_rewild_the_world.07a0d4dfc7fba14d52025577270bbe9c.php index 751c1759..7feb53ee 100644 --- a/tests/fixtures/www.ted.com.talks-george_monbiot_for_more_wonder_rewild_the_world.07a0d4dfc7fba14d52025577270bbe9c.php +++ b/tests/fixtures/www.ted.com.talks-george_monbiot_for_more_wonder_rewild_the_world.07a0d4dfc7fba14d52025577270bbe9c.php @@ -87,5 +87,6 @@ 'thumbnail_height' => 316, 'author_url' => 'https://www.ted.com/speakers/george_monbiot', 'html' => '' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.tiktok.com.a3noticias-video-6806030056956251397.php b/tests/fixtures/www.tiktok.com.a3noticias-video-6806030056956251397.php index 4b9d021c..1a660f53 100644 --- a/tests/fixtures/www.tiktok.com.a3noticias-video-6806030056956251397.php +++ b/tests/fixtures/www.tiktok.com.a3noticias-video-6806030056956251397.php @@ -102,5 +102,6 @@ 'thumbnail_url' => 'https://p77-sign-va.tiktokcdn.com/obj/tos-maliva-p-0068/165175e006354d838501378cfb325b79_1584652367?x-expires=1617570000&x-signature=ug9Nat5BeroYU6zWPlDXVO6EDak%3D', 'provider_url' => 'https://www.tiktok.com', 'provider_name' => 'TikTok' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.twitch.tv.twit.php b/tests/fixtures/www.twitch.tv.twit.php index fc5266e0..8195180d 100644 --- a/tests/fixtures/www.twitch.tv.twit.php +++ b/tests/fixtures/www.twitch.tv.twit.php @@ -31,5 +31,6 @@ 'title' => 'Twitch', 'url' => 'https://www.twitch.tv/twit', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.twitch.tv.videos-106400740.php b/tests/fixtures/www.twitch.tv.videos-106400740.php index 247a147b..d8b95775 100644 --- a/tests/fixtures/www.twitch.tv.videos-106400740.php +++ b/tests/fixtures/www.twitch.tv.videos-106400740.php @@ -31,5 +31,6 @@ 'title' => 'Twitch', 'url' => 'https://www.twitch.tv/videos/106400740', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.twitch.tv.videos-72749628.php b/tests/fixtures/www.twitch.tv.videos-72749628.php index cdcb20ea..c85d41ca 100644 --- a/tests/fixtures/www.twitch.tv.videos-72749628.php +++ b/tests/fixtures/www.twitch.tv.videos-72749628.php @@ -31,5 +31,6 @@ 'title' => 'Twitch', 'url' => 'https://www.twitch.tv/videos/72749628', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.ustream.tv.channel-red-shoes-billiards-60803-camera-1.php b/tests/fixtures/www.ustream.tv.channel-red-shoes-billiards-60803-camera-1.php index 06c5ec84..1ce5754c 100644 --- a/tests/fixtures/www.ustream.tv.channel-red-shoes-billiards-60803-camera-1.php +++ b/tests/fixtures/www.ustream.tv.channel-red-shoes-billiards-60803-camera-1.php @@ -40,5 +40,6 @@ 'thumbnail_url' => 'https://ustvstaticcdn2-a.akamaihd.net/i/channel/picture/1/1/9/5/11958409/11958409,120x90,r:2.jpg', 'type' => 'video', 'thumbnail_height' => 90 - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.viddler.com.v-bdce8c7.php b/tests/fixtures/www.viddler.com.v-bdce8c7.php index ed470d46..eceb4b1f 100644 --- a/tests/fixtures/www.viddler.com.v-bdce8c7.php +++ b/tests/fixtures/www.viddler.com.v-bdce8c7.php @@ -33,5 +33,6 @@ 'title' => 'Viddler Platform Overview', 'url' => 'https://www.viddler.com/v/bdce8c7', 'linkedData' => [], - 'oEmbed' => [] + 'oEmbed' => [], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.wired.com..1202600986b37d2c6a30336f82c671f8.php b/tests/fixtures/www.wired.com..1202600986b37d2c6a30336f82c671f8.php index 2d048b55..2155ceee 100644 --- a/tests/fixtures/www.wired.com..1202600986b37d2c6a30336f82c671f8.php +++ b/tests/fixtures/www.wired.com..1202600986b37d2c6a30336f82c671f8.php @@ -86,5 +86,590 @@ 'thumbnail_url' => 'https://www.wired.com/wp-content/uploads/2016/07/Yi-4KHP.jpg', 'thumbnail_width' => 600, 'thumbnail_height' => 337 + ], + 'allLinkedData' => [ + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2016/07/review-yi-4k-action-camera/' + ], + 'headline' => 'Review: Yi 4K Action Camera', + 'datePublished' => '2016-07-29T07:00:38+00:00', + 'dateModified' => '2017-06-12T18:27:35+00:00', + 'keywords' => [ + '4k' + ], + 'url' => 'https://www.wired.com/2016/07/review-yi-4k-action-camera/', + 'articleSection' => 'gear', + 'author' => [ + '@type' => 'Person', + 'name' => 'Brent Rose' + ], + 'description' => 'For nearly two years GoPro’s Hero4 Black has been the standard-bearer for action cameras. But there\'s a new contender.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2016/07/Yi-4KHP.jpg', + 'height' => 2680, + 'width' => 1507 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/04/geeks-guide-the-dispossessed/' + ], + 'headline' => '‘The Dispossessed’ Is Still One of Sci-Fi’s Smartest Books', + 'datePublished' => '2021-04-02T11:36:39+00:00', + 'dateModified' => '2021-04-02T11:36:39+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy' + ], + 'url' => 'https://www.wired.com/2021/04/geeks-guide-the-dispossessed/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'Ursula K. Le Guin\'s 1974 novel, about a society with no government or laws, remains a thoughtful exploration of politics and economics decades later.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/04/Science_geeksguide_2CDFJY0.jpg', + 'height' => 2400, + 'width' => 1600 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/03/geeks-guide-adventure-games/' + ], + 'headline' => 'It’s Never Been Easier to Make an Adventure Game', + 'datePublished' => '2021-03-26T11:40:18+00:00', + 'dateModified' => '2021-03-26T14:24:40+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy' + ], + 'url' => 'https://www.wired.com/2021/03/geeks-guide-adventure-games/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'The story-driven genre is enjoying an indie renaissance, thanks to new tools that are making the coding process simpler than ever.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/03/Culture_geeksguide_clip_boathouse_larger.jpg', + 'height' => 1200, + 'width' => 800 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/03/geeks-guide-griffin-mcelroy/' + ], + 'headline' => 'Starting a Podcast Is Harder Than It Looks', + 'datePublished' => '2021-03-19T11:38:11+00:00', + 'dateModified' => '2021-03-19T11:38:11+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy' + ], + 'url' => 'https://www.wired.com/2021/03/geeks-guide-griffin-mcelroy/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'But Everybody Has a Podcast (Except You) author Griffin McElroy can help.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/03/Culture_podcast_1250239031.jpg', + 'height' => 2400, + 'width' => 1800 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/03/geeks-guide-amazon-upload/' + ], + 'headline' => 'What If the Afterlife Had In-App Purchases?', + 'datePublished' => '2021-03-12T11:48:08+00:00', + 'dateModified' => '2021-03-12T11:48:08+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy' + ], + 'url' => 'https://www.wired.com/2021/03/geeks-guide-amazon-upload/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'The Amazon series Upload shows a comedic—and probably more realistic—version of what would happen if humans could live online after they die.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/03/Science_upload-UPLO_S1_Unit_108_0110RC_FNL_rgb.jpg', + 'height' => 2400, + 'width' => 1600 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/03/geeks-guide-drawing-chainmail/' + ], + 'headline' => 'Yes, Chainmail Is Really Hard to Draw', + 'datePublished' => '2021-03-05T11:30:34+00:00', + 'dateModified' => '2021-03-05T11:30:34+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy' + ], + 'url' => 'https://www.wired.com/2021/03/geeks-guide-drawing-chainmail/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'Ultima artist Denis Loubet knows this for a fact.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/03/Culture_GeeksGuide_2BXF8JA-1.png', + 'height' => 2400, + 'width' => 1800 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/02/geeks-guide-blood-of-zeus/' + ], + 'headline' => '‘Blood of Zeus’ Combines Myth With Saturday Morning Cartoons', + 'datePublished' => '2021-02-26T11:34:19+00:00', + 'dateModified' => '2021-02-26T11:34:19+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy', + 'netflix' + ], + 'url' => 'https://www.wired.com/2021/02/geeks-guide-blood-of-zeus/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'The new Netflix animated series puts a new spin on old tales.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/02/culture_BloodofZeus_Season1_Episode1_00_13_58_20.jpg', + 'height' => 1620, + 'width' => 1080 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/02/geeks-guide-settle-alien-worlds/' + ], + 'headline' => 'What Would It Take to Actually Settle an Alien World?', + 'datePublished' => '2021-02-19T11:59:02+00:00', + 'dateModified' => '2021-02-19T12:13:00+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy' + ], + 'url' => 'https://www.wired.com/2021/02/geeks-guide-settle-alien-worlds/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'David Gerrold\'s new novel Hella is about a low-gravity planet inhabited by dinosaur-like aliens. It does deep on the logistics of settling an alien planet.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/02/geeks-guide-alien-planet.jpg', + 'height' => 2400, + 'width' => 1350 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/02/geeks-guide-his-dark-materials-2/' + ], + 'headline' => 'Mrs. Coulter Is One of the Best Villains on TV', + 'datePublished' => '2021-02-12T11:52:57+00:00', + 'dateModified' => '2021-02-12T11:52:57+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy' + ], + 'url' => 'https://www.wired.com/2021/02/geeks-guide-his-dark-materials-2/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'Ruth Wilson\'s character is the highlight of HBO\'s His Dark Materials.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/02/Culture_GeeksGuide_ruth-wilson_1.jpg', + 'height' => 1444, + 'width' => 963 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2019/09/apple-iphone-event-liveblog/' + ], + 'headline' => 'Apple Event Liveblog: All the iPhone News as It Happens', + 'datePublished' => '2019-09-10T06:00:17+00:00', + 'dateModified' => '2019-09-10T12:00:57+00:00', + 'keywords' => [ + 'apple', + 'iphone' + ], + 'url' => 'https://www.wired.com/2019/09/apple-iphone-event-liveblog/', + 'articleSection' => 'gear', + 'author' => [ + '@type' => 'Person', + 'name' => 'Michael Calore' + ], + 'description' => 'Join us for live commentary beginning at 1 pm Eastern, 10 am Pacific.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2019/09/Gear-Apple-Liveblog-FA-1157988242.jpg', + 'height' => 2400, + 'width' => 1679 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2019/06/apple-wwdc-2019-liveblog/' + ], + 'headline' => 'WWDC 2019 Liveblog: All the Apple News as It Happens', + 'datePublished' => '2019-06-03T06:01:54+00:00', + 'dateModified' => '2019-06-03T14:09:28+00:00', + 'keywords' => [ + 'apple', + 'liveblog', + 'wwdc' + ], + 'url' => 'https://www.wired.com/2019/06/apple-wwdc-2019-liveblog/', + 'articleSection' => 'gear', + 'author' => [ + '@type' => 'Person', + 'name' => 'Wired Staff' + ], + 'description' => 'Apple\'s developer conference kicks off June 3 at 10 am Pacific. Follow along with us for analysis and commentary from WIRED\'s editors.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2019/06/gear_wwdc_967230896.jpg', + 'height' => 2400, + 'width' => 1800 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/03/geeks-guide-adventure-games/' + ], + 'headline' => 'It’s Never Been Easier to Make an Adventure Game', + 'datePublished' => '2021-03-26T11:40:18+00:00', + 'dateModified' => '2021-03-26T14:24:40+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy' + ], + 'url' => 'https://www.wired.com/2021/03/geeks-guide-adventure-games/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'The story-driven genre is enjoying an indie renaissance, thanks to new tools that are making the coding process simpler than ever.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/03/Culture_geeksguide_clip_boathouse_larger.jpg', + 'height' => 1200, + 'width' => 800 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2019/04/facebook-f8-liveblog-2019/' + ], + 'headline' => 'F8 Liveblog: All the Facebook News as It Happens', + 'datePublished' => '2019-04-30T11:39:17+00:00', + 'dateModified' => '2019-04-30T13:03:50+00:00', + 'keywords' => [ + 'f8', + 'facebook', + 'liveblog' + ], + 'url' => 'https://www.wired.com/2019/04/facebook-f8-liveblog-2019/', + 'articleSection' => 'gear', + 'author' => [ + '@type' => 'Person', + 'name' => 'Wired Staff' + ], + 'description' => 'When Facebook kicks off its annual developer conference with a keynote address on Tuesday morning, we\'ll be liveblogging it right here.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2019/04/f8-953545066.jpg', + 'height' => 2399, + 'width' => 1823 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2019/03/apple-media-event-liveblog/' + ], + 'headline' => 'Apple Event Liveblog: All the News, as It Happens', + 'datePublished' => '2019-03-25T06:00:04+00:00', + 'dateModified' => '2019-03-25T12:05:50+00:00', + 'keywords' => [ + 'apple', + 'apple-event' + ], + 'url' => 'https://www.wired.com/2019/03/apple-media-event-liveblog/', + 'articleSection' => 'gear', + 'author' => [ + '@type' => 'Person', + 'name' => 'Wired Staff' + ], + 'description' => 'On Monday morning, Apple hosts an event to outline plans for its news distribution and media streaming services. Our live coverage starts at 9 am Pacific.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2019/03/timcook-967356920.jpg', + 'height' => 2400, + 'width' => 1800 + ] + ], + [ + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'WIRED', + 'logo' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/themes/Phoenix/assets/images/article-icon.jpg', + 'width' => '1024 px', + 'height' => '1024 px' + ] + ], + '@context' => 'http://schema.org', + '@type' => 'NewsArticle', + 'mainEntityOfPage' => [ + '@type' => 'WebPage', + '@id' => 'https://www.wired.com/2021/04/geeks-guide-the-dispossessed/' + ], + 'headline' => '‘The Dispossessed’ Is Still One of Sci-Fi’s Smartest Books', + 'datePublished' => '2021-04-02T11:36:39+00:00', + 'dateModified' => '2021-04-02T11:36:39+00:00', + 'keywords' => [ + 'geeks-guide-to-the-galaxy' + ], + 'url' => 'https://www.wired.com/2021/04/geeks-guide-the-dispossessed/', + 'articleSection' => 'culture', + 'author' => [ + '@type' => 'Person', + 'name' => 'Geek's Guide to the Galaxy' + ], + 'description' => 'Ursula K. Le Guin\'s 1974 novel, about a society with no government or laws, remains a thoughtful exploration of politics and economics decades later.', + 'image' => [ + '@type' => 'ImageObject', + 'url' => 'https://www.wired.com/wp-content/uploads/2021/04/Science_geeksguide_2CDFJY0.jpg', + 'height' => 2400, + 'width' => 1600 + ] + ], + [ + '@context' => 'http://schema.org/', + '@type' => 'Review', + 'itemReviewed' => [ + '@type' => 'Thing', + 'name' => 'Yi 4K Action Camera' + ], + 'author' => [ + '@type' => 'Person', + 'name' => 'Brent Rose' + ], + 'reviewRating' => [ + '@type' => 'Rating', + 'ratingValue' => '8', + 'bestRating' => '10' + ], + 'publisher' => [ + '@type' => 'Organization', + 'name' => 'Wired' + ] + ] ] ]; diff --git a/tests/fixtures/www.youtube.com.playlist.13d1655ccf6cbdc1fc0162c6a02f822a.php b/tests/fixtures/www.youtube.com.playlist.13d1655ccf6cbdc1fc0162c6a02f822a.php index 3c166939..386ec3bf 100644 --- a/tests/fixtures/www.youtube.com.playlist.13d1655ccf6cbdc1fc0162c6a02f822a.php +++ b/tests/fixtures/www.youtube.com.playlist.13d1655ccf6cbdc1fc0162c6a02f822a.php @@ -42,5 +42,6 @@ 'thumbnail_url' => 'https://i.ytimg.com/vi/CdbnVwot6lc/hqdefault.jpg', 'html' => '', 'url' => 'https://www.youtube.com/playlist?list=PL4qTakKkQATKOyZPJG_cAMnRtF7fAIdST' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/www.youtube.com.watch.878f5352b6f0e632a763ebf05fb48b16.php b/tests/fixtures/www.youtube.com.watch.878f5352b6f0e632a763ebf05fb48b16.php index 3f20a5e7..4a7ab12d 100644 --- a/tests/fixtures/www.youtube.com.watch.878f5352b6f0e632a763ebf05fb48b16.php +++ b/tests/fixtures/www.youtube.com.watch.878f5352b6f0e632a763ebf05fb48b16.php @@ -42,5 +42,6 @@ 'thumbnail_url' => 'https://i.ytimg.com/vi/eiHXASgRTcA/hqdefault.jpg', 'html' => '', 'url' => 'http://www.youtube.com/watch?v=eiHXASgRTcA' - ] + ], + 'allLinkedData' => [] ]; diff --git a/tests/fixtures/youtu.be.eihxasgrtca.php b/tests/fixtures/youtu.be.eihxasgrtca.php index 7750f595..8b6e24bd 100644 --- a/tests/fixtures/youtu.be.eihxasgrtca.php +++ b/tests/fixtures/youtu.be.eihxasgrtca.php @@ -42,5 +42,6 @@ 'thumbnail_url' => 'https://i.ytimg.com/vi/eiHXASgRTcA/hqdefault.jpg', 'html' => '', 'url' => 'http://youtu.be/eiHXASgRTcA' - ] + ], + 'allLinkedData' => [] ]; From 06dc9a1f1656bf3dc37701001448f1990e374e03 Mon Sep 17 00:00:00 2001 From: Brian Moon Date: Tue, 27 Jun 2023 18:31:11 -0500 Subject: [PATCH 2/4] Better handle pages that have all nodes in arrays --- src/LinkedData.php | 31 +- ....com..1202600986b37d2c6a30336f82c671f8.php | 2508 ++++++++--------- tests/fixtures/vimeo.com.235352744.php | 80 +- .../www.flickr.com.photos-desescribir.php | 38 +- 4 files changed, 1307 insertions(+), 1350 deletions(-) diff --git a/src/LinkedData.php b/src/LinkedData.php index c3ed89db..41f6c533 100644 --- a/src/LinkedData.php +++ b/src/LinkedData.php @@ -83,20 +83,6 @@ protected function fetchData(): array $ldjson = json_decode($node, true); if (!empty($ldjson)) { - if (empty($data)) { - $data = $ldjson; - } elseif (isset($ldjson['mainEntityOfPage'])) { - $url = ''; - if (is_string($ldjson['mainEntityOfPage'])) { - $url = $ldjson['mainEntityOfPage']; - } elseif (isset($ldjson['mainEntityOfPage']['@id'])) { - $url = $ldjson['mainEntityOfPage']['@id']; - } - if (!empty($url) && $url == $request_uri) { - $data = $ldjson; - } - } - // some pages with multiple ld+json blocks will put // each block into an array (Flickr does this). Most // appear to put an object in each ld+json block. To @@ -106,6 +92,23 @@ protected function fetchData(): array $ldjson = [$ldjson]; } + foreach ($ldjson as $node) { + if (empty($data)) { + $data = $node; + } elseif (isset($node['mainEntityOfPage'])) { + $url = ''; + if (is_string($node['mainEntityOfPage'])) { + $url = $node['mainEntityOfPage']; + } elseif (isset($node['mainEntityOfPage']['@id'])) { + $url = $node['mainEntityOfPage']['@id']; + } + if (!empty($url) && $url == $request_uri) { + $data = $node; + } + } + } + + $this->allData = array_merge($this->allData, $ldjson); } } diff --git a/tests/cache/www.wired.com..1202600986b37d2c6a30336f82c671f8.php b/tests/cache/www.wired.com..1202600986b37d2c6a30336f82c671f8.php index a8fe8f83..97fb8c39 100644 --- a/tests/cache/www.wired.com..1202600986b37d2c6a30336f82c671f8.php +++ b/tests/cache/www.wired.com..1202600986b37d2c6a30336f82c671f8.php @@ -134,116 +134,116 @@ - - - - - - - - - - - - - - - - - - - - Yi 4K Action Camera Review: Price, Specs | WIRED - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + Yi 4K Action Camera Review: Price, Specs | WIRED + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - +}] + + @@ -320,480 +320,480 @@ - + - -
+ +
- +
- Skip to: Start of article - - - - - - - - Go to Wired Home Page. - - - - - - - - - - - + Skip to: Start of article + + + + + + + + Go to Wired Home Page. + + + + + + + + + + +
- + - + - +
- +
-
+
- - + + - Skip Article Header. Skip to: Start of Article. - -
- - - -

Review: Yi 4K Action Camera

Sub Title: Better Than the Real Thing

-
-
-
- -
-
- -

For nearly two years GoPro’s Hero4 Black has been the standard-bearer for action cameras. It can shoot 4K at 30 frames per second, 1080p at a blistering 120fps, and the footage from both looks fantastic. Two years is a long time to be sitting on a throne, though, and it gives potential usurpers ample time to learn your secrets. That’s just what’s happened with the Yi 4K Action Camera.

+ Skip Article Header. Skip to: Start of Article. + +
+ + + +

Review: Yi 4K Action Camera

Sub Title: Better Than the Real Thing

+
+
+
+ +
+
+ +

For nearly two years GoPro’s Hero4 Black has been the standard-bearer for action cameras. It can shoot 4K at 30 frames per second, 1080p at a blistering 120fps, and the footage from both looks fantastic. Two years is a long time to be sitting on a throne, though, and it gives potential usurpers ample time to learn your secrets. That’s just what’s happened with the Yi 4K Action Camera.

- - -
-

Yi 4K Action Camera

-

8/10

-
Wired
-

Same specs as the Hero4 Black but half the cost. Adds a nice touchscreen and better battery life. Works with GoPro accessories.

-
Tired
-

Entirely unoriginal and it makes you feel bad for buying it. Hard to tell when rolling. Can’t change settings in waterproof housing, and housing is sold separately.

-
- -
-
- -
- - - -

How We Rate

-
-
    -
  • - 1/10A complete failure in every way -
  • -
  • - 2/10Sad, really -
  • -
  • - 3/10Serious flaws; proceed with caution -
  • -
  • - 4/10Downsides outweigh upsides -
  • -
  • - 5/10Recommended with reservations -
  • -
  • - 6/10Solid with some issues -
  • -
  • - 7/10Very good, but not quite great -
  • -
  • - 8/10Excellent, with room to kvetch -
  • -
  • - 9/10Nearly flawless -
  • -
  • - 10/10Metaphysical perfection -
  • -
-
-
+ + +
+

Yi 4K Action Camera

+

8/10

+
Wired
+

Same specs as the Hero4 Black but half the cost. Adds a nice touchscreen and better battery life. Works with GoPro accessories.

+
Tired
+

Entirely unoriginal and it makes you feel bad for buying it. Hard to tell when rolling. Can’t change settings in waterproof housing, and housing is sold separately.

+
+ +
+
+ +
+ + + +

How We Rate

+
+
    +
  • + 1/10A complete failure in every way +
  • +
  • + 2/10Sad, really +
  • +
  • + 3/10Serious flaws; proceed with caution +
  • +
  • + 4/10Downsides outweigh upsides +
  • +
  • + 5/10Recommended with reservations +
  • +
  • + 6/10Solid with some issues +
  • +
  • + 7/10Very good, but not quite great +
  • +
  • + 8/10Excellent, with room to kvetch +
  • +
  • + 9/10Nearly flawless +
  • +
  • + 10/10Metaphysical perfection +
  • +
+
+
The Yi is almost exactly a GoPro. It looks exactly like a GoPro. Everybody I showed it to thought it was a GoPro. Even the font in its menu system is suspiciously familiar, as is the latch on the waterproof housing. It can shoot at the same high speeds as the Hero4 Black. The pattern of beeps for starting and stopping recording is the same. So what’s the difference? The Hero4 Black costs $500, and the Yi 4K costs $250. But wait, there’s more.

When GoPro made the Hero4 line, it decided that the mid-tier Silver edition would have a touchscreen on the back, but that the top-tier Black edition would not. The Yi 4K basically took the Black edition and put the Silver edition’s screen on it, but it’s larger (2.19 inches versus 1.5 inches), higher resolution (330 pixels per inch), and more responsive than GoPro’s.

@@ -812,153 +812,153 @@

But for now, I guess I’m saying, yes, the Yi is the better buy for most consumers. I just don’t feel good about saying it.

When you buy something using the retail links in our product reviews, we earn a small affiliate commission. Read more about how this works.

- Go Back to Top. Skip To: Start of Article. + Go Back to Top. Skip To: Start of Article. -
+
- -
+ - - +
+ + -
+
-
  • - - - Yes, Chainmail Is Really Hard to Draw +} + + Yes, Chainmail Is Really Hard to Draw - - -
  • + +
    + + -
    +
    -
  • - - - ‘Blood of Zeus’ Combines Myth With Saturday Morning Cartoons +} + + ‘Blood of Zeus’ Combines Myth With Saturday Morning Cartoons - - hera -
  • + + + + -
    +
    -
  • - - - What Would It Take to Actually Settle an Alien World? +} + + What Would It Take to Actually Settle an Alien World? - - dinosaur -
  • + + + + -
    +
    -
  • - - - Mrs. Coulter Is One of the Best Villains on TV +} + + Mrs. Coulter Is One of the Best Villains on TV - - Ruth Wilson -
  • + + + + -
    +
    - - - - More Stories - + + + + More Stories + - + @@ -1421,22 +1421,22 @@
    - +
    - -
    -
    -
    - +
    +
    +
    +
    @@ -1471,52 +1471,52 @@ })(); -
    -
    -
    +
    +
    +
    +
    - - + - - - - - - - + + + + + + + @@ -2352,21 +2352,21 @@ "site": { "appVersion": "1.0.0" } -}; - - +}; + + - - - - - + + + + + - - - - - + + + diff --git a/tests/fixtures/vimeo.com.235352744.php b/tests/fixtures/vimeo.com.235352744.php index 3ec40e68..a551ead3 100644 --- a/tests/fixtures/vimeo.com.235352744.php +++ b/tests/fixtures/vimeo.com.235352744.php @@ -27,59 +27,35 @@ 'title' => 'Vimeo Live is here', 'url' => 'https://vimeo.com/235352744', 'linkedData' => [ - [ - 'url' => 'https://vimeo.com/235352744', - 'thumbnailUrl' => 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F657162424_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png', - 'embedUrl' => 'https://player.vimeo.com/video/235352744', - 'name' => 'Vimeo Live is here', - 'description' => 'Professional live streaming is here. Learn more at vimeo.com/live', - 'height' => 1080, - 'width' => 1920, - 'playerType' => 'HTML5 Flash', - 'videoQuality' => 'HD', - 'duration' => 'PT00H01M15S', - 'uploadDate' => '2017-09-25T10:36:56-04:00', - 'dateModified' => '2021-04-04T08:57:58-04:00', - 'thumbnail' => [ - '@type' => 'ImageObject', - 'url' => 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F657162424_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png', - 'width' => 1280, - 'height' => 720 - ], - 'author' => [ - '@type' => 'Person', - 'name' => 'Vimeo', - 'url' => 'https://vimeo.com/vimeomarketing' - ], - 'potentialAction' => [ - '@type' => 'ViewAction', - 'target' => 'vimeo://app.vimeo.com/videos/235352744' - ], - '@type' => 'VideoObject', - '@context' => 'http://schema.org' + 'url' => 'https://vimeo.com/235352744', + 'thumbnailUrl' => 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F657162424_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png', + 'embedUrl' => 'https://player.vimeo.com/video/235352744', + 'name' => 'Vimeo Live is here', + 'description' => 'Professional live streaming is here. Learn more at vimeo.com/live', + 'height' => 1080, + 'width' => 1920, + 'playerType' => 'HTML5 Flash', + 'videoQuality' => 'HD', + 'duration' => 'PT00H01M15S', + 'uploadDate' => '2017-09-25T10:36:56-04:00', + 'dateModified' => '2021-04-04T08:57:58-04:00', + 'thumbnail' => [ + '@type' => 'ImageObject', + 'url' => 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F657162424_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png', + 'width' => 1280, + 'height' => 720 ], - [ - 'itemListElement' => [ - [ - '@type' => 'ListItem', - 'position' => 1, - 'item' => [ - '@id' => 'https://vimeo.com/vimeomarketing', - 'name' => 'Vimeo' - ] - ], - [ - '@type' => 'ListItem', - 'position' => 2, - 'item' => [ - '@id' => 'https://vimeo.com/vimeomarketing/videos', - 'name' => 'Videos' - ] - ] - ], - '@type' => 'BreadcrumbList', - '@context' => 'http://schema.org' - ] + 'author' => [ + '@type' => 'Person', + 'name' => 'Vimeo', + 'url' => 'https://vimeo.com/vimeomarketing' + ], + 'potentialAction' => [ + '@type' => 'ViewAction', + 'target' => 'vimeo://app.vimeo.com/videos/235352744' + ], + '@type' => 'VideoObject', + '@context' => 'http://schema.org' ], 'oEmbed' => [ 'type' => 'video', diff --git a/tests/fixtures/www.flickr.com.photos-desescribir.php b/tests/fixtures/www.flickr.com.photos-desescribir.php index ef39f639..e32ac3de 100644 --- a/tests/fixtures/www.flickr.com.photos-desescribir.php +++ b/tests/fixtures/www.flickr.com.photos-desescribir.php @@ -29,36 +29,14 @@ 'title' => 'desescribir', 'url' => 'https://www.flickr.com/photos/desescribir/', 'linkedData' => [ - [ - '@context' => 'http://schema.org', - '@type' => 'WebSite', - 'name' => 'Flickr', - 'url' => 'https://www.flickr.com', - 'potentialAction' => [ - '@type' => 'SearchAction', - 'target' => 'https://www.flickr.com/search?text={search_term_string}&structured=yes', - 'query-input' => 'required name=search_term_string' - ] - ], - [ - '@context' => 'http://schema.org', - '@type' => 'Organization', - 'url' => 'http://www.flickr.com', - 'logo' => 'https://www.flickr.com/images/opensearch-flickr-logo.png' - ], - [ - '@context' => 'http://schema.org', - '@type' => 'Person', - 'name' => 'Flickr', - 'url' => 'https://www.flickr.com', - 'sameAs' => [ - 'https://www.facebook.com/flickr', - 'https://instagram.com/flickr', - 'https://flickr.tumblr.com', - 'https://twitter.com/flickr', - 'https://plus.google.com/+flickr', - 'https://www.pinterest.com/flickr' - ] + '@context' => 'http://schema.org', + '@type' => 'WebSite', + 'name' => 'Flickr', + 'url' => 'https://www.flickr.com', + 'potentialAction' => [ + '@type' => 'SearchAction', + 'target' => 'https://www.flickr.com/search?text={search_term_string}&structured=yes', + 'query-input' => 'required name=search_term_string' ] ], 'oEmbed' => [ From 0be2bb3246848ce336c0a98766da0dc529f01eb5 Mon Sep 17 00:00:00 2001 From: Brian Moon Date: Wed, 28 Jun 2023 13:32:46 -0500 Subject: [PATCH 3/4] Set flags to new 8.1 defaults as that decodes more symbols --- src/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/functions.php b/src/functions.php index 77712708..85db16d8 100644 --- a/src/functions.php +++ b/src/functions.php @@ -10,7 +10,7 @@ function clean(string $value, bool $allowHTML = false): ?string $value = trim($value); if (!$allowHTML) { - $value = html_entity_decode($value); + $value = html_entity_decode($value, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401); $value = strip_tags($value); } From 631ea03704885c9dee26e06a881176ecd842f159 Mon Sep 17 00:00:00 2001 From: Brian Moon Date: Wed, 28 Jun 2023 13:33:06 -0500 Subject: [PATCH 4/4] Update tests to align with new html_entity_decode flags --- ...embed.f979e136668a2b1f8801a26690847913.php | 2 +- .../www.flickr.com.photos-desescribir.php | 2 +- ....com..1202600986b37d2c6a30336f82c671f8.php | 24 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/cache/www.wired.com.wp-json-oembed-1.0-embed.f979e136668a2b1f8801a26690847913.php b/tests/cache/www.wired.com.wp-json-oembed-1.0-embed.f979e136668a2b1f8801a26690847913.php index b7f232e2..029468bd 100644 --- a/tests/cache/www.wired.com.wp-json-oembed-1.0-embed.f979e136668a2b1f8801a26690847913.php +++ b/tests/cache/www.wired.com.wp-json-oembed-1.0-embed.f979e136668a2b1f8801a26690847913.php @@ -100,5 +100,5 @@ ], 'statusCode' => 200, 'reasonPhrase' => 'OK', - 'body' => '{"version":"1.0","provider_name":"WIRED","provider_url":"https:\\/\\/www.wired.com","author_name":"Wired Staff","author_url":"https:\\/\\/www.wired.com\\/author\\/wired-staff\\/","title":"Review: Yi 4K Action Camera","type":"rich","width":600,"height":338,"html":"
    Review: Yi 4K Action Camera<\\/a><\\/blockquote>\\n', + 'html' => '
    Review: Yi 4K Action Camera
    ', 'width' => 600, 'height' => 338, 'ratio' => 56.333 @@ -80,7 +80,7 @@ 'html' => '
    Review: Yi 4K Action Camera
    ', 'thumbnail_url' => 'https://www.wired.com/wp-content/uploads/2016/07/Yi-4KHP.jpg', @@ -152,7 +152,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'Ursula K. Le Guin\'s 1974 novel, about a society with no government or laws, remains a thoughtful exploration of politics and economics decades later.', 'image' => [ @@ -189,7 +189,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'The story-driven genre is enjoying an indie renaissance, thanks to new tools that are making the coding process simpler than ever.', 'image' => [ @@ -226,7 +226,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'But Everybody Has a Podcast (Except You) author Griffin McElroy can help.', 'image' => [ @@ -263,7 +263,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'The Amazon series Upload shows a comedic—and probably more realistic—version of what would happen if humans could live online after they die.', 'image' => [ @@ -300,7 +300,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'Ultima artist Denis Loubet knows this for a fact.', 'image' => [ @@ -338,7 +338,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'The new Netflix animated series puts a new spin on old tales.', 'image' => [ @@ -375,7 +375,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'David Gerrold\'s new novel Hella is about a low-gravity planet inhabited by dinosaur-like aliens. It does deep on the logistics of settling an alien planet.', 'image' => [ @@ -412,7 +412,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'Ruth Wilson\'s character is the highlight of HBO\'s His Dark Materials.', 'image' => [ @@ -526,7 +526,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'The story-driven genre is enjoying an indie renaissance, thanks to new tools that are making the coding process simpler than ever.', 'image' => [ @@ -640,7 +640,7 @@ 'articleSection' => 'culture', 'author' => [ '@type' => 'Person', - 'name' => 'Geek's Guide to the Galaxy' + 'name' => 'Geek\'s Guide to the Galaxy' ], 'description' => 'Ursula K. Le Guin\'s 1974 novel, about a society with no government or laws, remains a thoughtful exploration of politics and economics decades later.', 'image' => [