All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
4.6.0 - 2026-10-30
mastodon:iframesetting (off by default). Mastodon oEmbed html (blockquote.mastodon-embedwithdata-embed-url) becomes a sandboxed<iframe>to the post's/embedpage, so noembed.jsis needed. Only same-hosthttpsembed URLs are used- Bilibili adapter:
bilibili.com/video/BV...andav...URLs (alsob23.tvshort links) get aplayer.bilibili.comiframe built from the URL. The title, description and image of Bilibili's error pages ("出错啦!" and "视频去哪了呢?") are ignored, and so is a description template that was never filled #243 - Youku adapter:
v.youku.com/v_show/id_<ID>.htmlURLs get aplayer.youku.com/embediframe built from the URL #243 - NetEase Music adapter: songs, albums and playlists on
music.163.comget anoutchain/playeriframe, and the author is read from the description. URLs with a#/route are requested without it. MV pages (/mv?id=and/#/mv?id=) get metadata only, because NetEase has no official embeddable MV player #243 Extractor::normalizeUri(), used by adapters to rewrite a URL before it is requested
4.5.4 - 2026-10-30
- TLS verification is on by default.
CurlClientnow sendsCURLOPT_SSL_VERIFYPEERtrue andCURLOPT_SSL_VERIFYHOST2 unless told otherwise, so self-signed, expired and wrong-host certificates are rejected (curl error 60). Before, both checks were off when the settings were missing #575 - A
nullssl_verify_peerorssl_verify_hostnow means the default (verification on). Explicit0,false,'0'and''still disable it
To disable verification, which is not recommended, pass the existing settings:
$client = new Embed\Http\CurlClient();
$client->setSettings(['ssl_verify_peer' => false, 'ssl_verify_host' => 0]);
$embed = new Embed\Embed(new Embed\Http\Crawler($client));4.5.3 - 2026-10-30
- Kick adapter. Channel pages embed
https://player.kick.com/<slug>(16:9). Video pages read the title, thumbnail and author name from Kick's public API. Clips have no embed code because Kick does not document a clip player
- An Open Graph video served as HLS (
.m3u8,application/x-mpegURLorapplication/vnd.apple.mpegurl, also read fromog:video:type) no longer produces an<iframe>pointing to the playlist - Twitch video iframes use the documented
video=v<ID>parameter instead ofid - Twitch clip URLs (
clips.twitch.tv/<slug>andtwitch.tv/<channel>/clip/<slug>) produce aclips.twitch.tv/embediframe whentwitch:parentis set
4.5.2 - 2026-10-27
- oEmbed responses of type
photowithouthtmlnow produce an<img>embed code from theirurl,widthandheight#584
4.5.1 - 2026-10-26
- JSON-LD remote contexts are never fetched. A page-supplied
@contextis not requested, so it cannot bypass the URL policy or follow redirects. schema.org contexts are resolved from a bundled vocabulary; any other remote context is skipped #573
4.5.0 - 2026-10-19
- Block requests to non-public addresses before they are sent, including redirects, page-declared oEmbed endpoints, adapter APIs, and meta-refresh targets. Private and loopback URLs are rejected unless
UrlPolicy::allowPrivateNetworks()orwithAllowedHosts()is used #573
Embed\Http\UrlPolicyandEmbed\Http\BlockedRequestException, configurable fromCrawler::setUrlPolicy()
- A negative
max_redirs, which curl treated as unlimited, now follows at most 50 redirects - Reaching that limit is still curl error 47. The message is
Number of redirects hit maximum amountrather than curl'sMaximum (N) redirects followed
resolveUri()dropped the port of the base URL- Read every
curl_multi_info_readmessage in the parallel client instead of only one per iteration
4.4.19 - 2026-07-08
- Access tokens are now optional with Meta (Facebook & Instagram) #577
- Updated tests
4.4.18 - 2026-06-19
- Add PHPStan Static Analysis (Level Max + Strict Rules) #562
- Add support for Facebook reel URLs #572
- Update oEmbed endpoints #574
- Make snapshot updates possible without modifying test code #564
- Remove support for discontinued services (chirb.it and sassmeister.com) #565
- Add PHPStan generic type annotations and simplify detector implementations #563
- Update fixtures to pass PHPUnit #559
- wrong mb_encoding_aliases() handling for PHP 8.0+ #560
- Remove calls to curl_close and curl_multi_close on PHP 8.0 and later #569
- Add phpstan.dist.neon to export-ignore in .gitattributes #571
4.4.17 - 2025-05-13
- Adapters hostname detection #556.
4.4.16 - 2025-05-09
- Adapters hostname detection #555.
4.4.15 - 2025-01-02
- Type bug #553.
4.4.14 - 2024-12-04
- Php 8.4 support #551.
4.4.13 - 2024-11-21
- Php 8.4 support #548.
4.4.12 - 2024-07-24
- X.com (Twitter) #540
- Updated oembed resources.
4.4.11 - 2024-06-10
- Updated oEmbed entry points #537
4.4.10 - 2023-12-10
- PHP 7.4 support
- Use correct method for string length #529
4.4.9 - 2023-12-01
4.4.8 - 2023-05-22
4.4.7 - 2022-12-12
- Href attributes with
undefinedvalues #501, #502 - Deprecated warning for var interpolation in PHP 8.2 #506
- Prevent unsupported operand types exception #507
4.4.6 - 2022-10-02
- Some code issues detected by phpstan: #495, #496, #497, #498.
- Fix for quotation marks in redirect URL #499
4.4.5 - 2022-09-06
- Updated oembed endpoints #494
4.4.4 - 2022-04-13
- Error getting data from Linked data #481.
4.4.3 - 2022-03-13
- PHP 8.1 deprecation notice #480.
4.4.2 - 2022-02-13
- Options to customize the CurlClient to perform http queries #474.
4.4.1 - 2022-02-06
- PHP 8.1 deprecation notice #473.
4.4.0 - 2022-01-08
4.3.5 - 2021-10-10
- Fixed a possible XML Quadratic Blowup vulnerability.
4.3.4 - 2021-06-22
- Urls of images should include the same url for the
$info->imagevalue. #452
4.3.3 - 2021-06-22
4.3.2 - 2021-04-04
- Add configured oEmbed query parameters to all oEmbed endpoints #437
- Updated oEmbed endpoints.
- Replaced Travis with Github workflows for testing
4.3.1 - 2021-03-21
- Oembed for facebook photos #405 #406
- Oembed for facebook videos #432 #433
- Added more ways to detect data using meta tags #427
- Bandcamp provider name #429 #430
4.3.0 - 2020-11-04
- New function
$embed->setSettings()to pass the settings before get the site info
4.2.7 - 2020-09-23
- New option
twitch:parentto fix Twitch embed with iframes #384
- Added
datePublishedcheck toPublishedTimeextractor #385 #386 - Added
@property-readfor IDE suppport #387 #388
4.2.6 - 2020-08-28
- Code width and height when the provided value is not numeric (ex: 100%) #380
4.2.5 - 2020-08-01
- Github TypeError exception with some urls #375
4.2.4 - 2020-07-06
- Ignore invalid urls instead throw an exception
- Updated oembed list of endpoints
4.2.3 - 2020-06-12
- Suppport for other non-latin alphabets such Persian or Arabic #366
4.2.2 - 2020-05-31
- Provided a fallback for oEmbed compatible sites like Instagram that redirects to login page #357
4.2.1 - 2020-05-25
- Redirect urls like
t.co.
4.2.0 - 2020-05-23
- Added the
ignored_errorssettings to ignore some curls errors instead throw an exception #355 - Support for Twitch embeds #332
- Ignored linkedData errors #356
4.1.1 - 2020-04-24
- Updated oembed endpoints from
oembed.com - Add support for tiktok.com
4.1.0 - 2020-04-19
- Ability to send settings to
CurlClient. Added thecookies_pathsetting to customize the file used for cookies. #345 Document::selectCss()function to select elements using css selectors instead xpath (it requiressymfony/css-selector)Document::removeCss()function to remove elements using css selectors instead xpath (it requiressymfony/css-selector)- Ability to configure OEmbed parameters from the outside using the
oembed:query_parameterssetting #346
4.0.0 - 2020-03-13
Full library refactoring.
- Support for multiple parallel request with
curl_multi - Support for PSR-7 Http Messages, PSR-17 Http Factories and PSR-18 Http Client
cmsvaluelanguageto detect the page languagelanguagesto detect urls to versions in different languagesfaviconto detect small favicons (16 or 32px)iconto detect big icons (from 48px)
- Changed providers (oEmbed, Html, OpenGraph etc) by independent detectors (title, url, language etc).
- The
tagsvalue is renamed tokeywords - Use Psr standards instead custom interfaces.
- Improved tests using cached responses.
- Support for PHP<7.4
typevalue (is was very confusing)imagesvalueproviderImage(usefaviconoriconinstead)- Support for files (pdf, jpg, video, etc).