Skip to content

Commit

Permalink
Merge pull request #140 from wrav/feature/embed-v4
Browse files Browse the repository at this point in the history
Update embed/embed to v4 for support with newer plugins
  • Loading branch information
reganlawton authored Nov 8, 2023
2 parents fc8957e + 2bfe0d4 commit 273ed21
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 42 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# oEmbed Changelog

## 3.0.0 - 2023-11-04

### Update
- Update embed/embed to v4 to allow for support with newer plugins.

## 2.3.1 - 2023-10-11

### Update
Expand Down
7 changes: 5 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "wrav/oembed",
"description": "A simple plugin to extract media information from websites, like youtube videos, twitter statuses or blog articles.",
"type": "craft-plugin",
"version": "2.3.0",
"version": "3.0.0",
"keywords": [
"craft",
"cms",
Expand All @@ -29,9 +29,12 @@
"homepage": "https://github.com/reganlawton"
}
],
"require-dev": {
"roave/security-advisories": "dev-latest"
},
"require": {
"craftcms/cms": "^4.0",
"embed/embed": "^3.3",
"embed/embed": "^v4.4",
"ext-dom": "*"
},
"repositories": [
Expand Down
41 changes: 41 additions & 0 deletions src/adapters/EmbedAdapter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php
/**
* oEmbed plugin for Craft CMS 3.x
*
* A simple plugin to extract media information from websites, like youtube videos, twitter statuses or blog articles.
*
* @link https://github.com/wrav
* @copyright Copyright (c) 2017 reganlawton
*/

namespace wrav\oembed\adapters;

class EmbedAdapter
{
public $data = [];

public function __construct($data)
{
$this->data = $data;
}

public function __call($name, $arguments)
{
return $this->data[$name] ?? null;
}

public function __get($name)
{
return $this->data[$name] ?? null;
}

public function __toString()
{
return (string)$this->getCode();
}

public function getCode()
{
return $this->data['html'] ?? '';
}
}
20 changes: 1 addition & 19 deletions src/adapters/FallbackAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,6 @@

namespace wrav\oembed\adapters;

use Embed\Adapters\Adapter;
use Embed\Utils;

class FallbackAdapter extends Adapter
class FallbackAdapter extends EmbedAdapter
{
protected function init()
{
$this->providers = [];
$this->height = null;
$this->width = null;
}

public function getCode()
{
if (!$this->url) {
return Utils::iframe($this->url);
}

return null;
}
}
5 changes: 3 additions & 2 deletions src/models/OembedModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,11 @@ public function __get($name)
$oembed = Oembed::getInstance()->oembedService->embed($this->url);

if (!$oembed) {
$this->embed = [];
$this->oembed = [];
} else {
$this->oembed = $oembed;
}

$this->oembed = $oembed;
}

return $this->oembed->$name ?? null;
Expand Down
51 changes: 32 additions & 19 deletions src/services/OembedService.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,13 @@
use craft\helpers\Template;
use craft\helpers\UrlHelper;
use DOMDocument;
use Embed\Adapters\Adapter;
use Embed\Embed;
use Embed\Exceptions\InvalidUrlException;
use Embed\Http\CurlDispatcher;
use Embed\Utils;
use wrav\oembed\adapters\EmbedAdapter;
use wrav\oembed\adapters\FallbackAdapter;
use wrav\oembed\events\BrokenUrlEvent;
use wrav\oembed\Oembed;
use yii\log\Logger;

/**
* OembedService Service
Expand Down Expand Up @@ -64,6 +62,7 @@ public function embed($url, array $options = [], array $cacheProps = [])
$hash = '';
}
$cacheKey = $url . '_' . $hash;
$data = [];

if (Oembed::getInstance()->getSettings()->enableCache && Craft::$app->cache->exists($cacheKey)) {
return \Craft::$app->cache->get($cacheKey);
Expand All @@ -76,35 +75,47 @@ public function embed($url, array $options = [], array $cacheProps = [])
try {
array_multisort($options);

$dispatcher = new CurlDispatcher([
CURLOPT_REFERER => UrlHelper::siteUrl(),
]);
$embed = new Embed();
$infos = $embed
->get($url)
;
$infos->setSettings($options);
$data = $infos->getOEmbed()->all();

/** @var Adapter $media */
$media = Embed::create($url, $options, $dispatcher);
$media = new EmbedAdapter($data);
} catch (InvalidUrlException $e) {
// Trigger notification
Craft::info($e->getMessage(), 'oembed');

// Trigger notification event
if (Oembed::getInstance()->getSettings()->enableNotifications) {
Oembed::getInstance()->trigger(Oembed::EVENT_BROKEN_URL_DETECTED, new BrokenUrlEvent([
'url' => $url,
]));
}

// Create fallback
$media = new FallbackAdapter(
$e->getResponse(),
$options,
new CurlDispatcher()
);
$media = new FallbackAdapter([
'html' => $url ? '<iframe src="'.$url.'"></iframe>' : null
]);
} finally {
// Fallback to iframex
if (empty($data)) {
$data = [
'html' => $url ? '<iframe src="'.$url.'"></iframe>' : null
];
}

// Wrapping to be safe :)
try {
$dom = new DOMDocument;
$code = $media->getCode();
if (empty($code) && !($media instanceof FallbackAdapter)) {
$code = empty((string)$url) ? '' : Utils::iframe($media->url);
$html = $media->getCode() ?: null;

if (empty($html) || empty((string)$url) ) {
$html = empty((string)$url) ? '' : '<iframe src="'.$url.'"></iframe>';
$dom->loadHTML($html);
} else {
$dom->loadHTML($data['html']);
}
$dom->loadHTML($code);

$iframe = $dom->getElementsByTagName('iframe')->item(0);
$src = $iframe->getAttribute('src');
Expand Down Expand Up @@ -195,6 +206,7 @@ public function embed($url, array $options = [], array $cacheProps = [])

$cacheKeys = array_unique(array_merge($defaultCacheKeys, $cacheProps));

// Make sure all keys are set to avoid errors
foreach ($cacheKeys as $key) {
try {
$media->{$key} = $media->{$key};
Expand All @@ -205,7 +217,8 @@ public function embed($url, array $options = [], array $cacheProps = [])

Craft::$app->cache->set($cacheKey, json_decode(json_encode($media)), $duration);
}
return $media;

return $media ?? [];
}
}
}
Expand Down

0 comments on commit 273ed21

Please sign in to comment.