PluginProbe ʕ •ᴥ•ʔ
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more / 4.5.4
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more v4.5.4
4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 trunk 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.5.0 1.6.0 1.6.1 1.6.2 1.6.3 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.2.0 2.2.1 2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.4.0 2.4.1 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.1.3 3.2.0 3.2.1 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 3.9.17 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9 4.0.0 4.0.1 4.0.10 4.0.11 4.0.12 4.0.13 4.0.14 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.10 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.8 4.2.9 4.3.0 4.3.1 4.4.0 4.4.1 4.4.10 4.4.11 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.5.0 4.5.1
embedpress / EmbedPress / Providers / SelfHosted.php
embedpress / EmbedPress / Providers Last commit date
TemplateLayouts 1 month ago AirTable.php 1 year ago Boomplay.php 1 year ago Calendly.php 2 years ago Canva.php 1 year ago FITE.php 1 year ago GettyImages.php 9 months ago Giphy.php 2 years ago GitHub.php 3 years ago GoogleCalendar.php 8 months ago GoogleDocs.php 2 years ago GoogleDrive.php 2 years ago GoogleMaps.php 2 years ago GooglePhotos.php 3 months ago Gumroad.php 2 years ago InstagramFeed.php 1 month ago LinkedIn.php 2 years ago Meetup.php 6 months ago NRKRadio.php 2 years ago OneDrive.php 11 months ago OpenSea.php 9 months ago SelfHosted.php 2 months ago Spreaker.php 1 year ago TikTok.php 2 years ago Twitch.php 2 years ago Wistia.php 3 months ago Wrapper.php 3 years ago X.php 2 years ago Youtube.php 1 month ago index.html 7 years ago
SelfHosted.php
180 lines
1 <?php
2
3 namespace EmbedPress\Providers;
4
5 use Embera\Provider\ProviderAdapter;
6 use Embera\Provider\ProviderInterface;
7 use Embera\Url;
8
9 (defined('ABSPATH') && defined('EMBEDPRESS_IS_LOADED')) or die("No direct script access allowed.");
10
11 /**
12 * Entity responsible to support SelfHosted embeds.
13 *
14 * @package EmbedPress
15 * @subpackage EmbedPress/Providers
16 * @author EmbedPress <help@embedpress.com>
17 * @copyright Copyright (C) 2020 WPDeveloper. All rights reserved.
18 * @license GPLv3 or later
19 * @since 1.0.0
20 */
21
22 class SelfHosted extends ProviderAdapter implements ProviderInterface
23 {
24
25 /** Original URL with port preserved — Embera\Url::__toString() drops the
26 * port, which breaks self-hosted media on dev hosts like localhost:8080. */
27 protected $rawUrl;
28
29 public function __construct($url, array $config = [])
30 {
31 parent::__construct($url, $config);
32 $this->rawUrl = (string) $url;
33 $hosts_url = parse_url($url);
34 $this->addHost($hosts_url['host']);
35 }
36
37 /**
38 * Returns the source URL with the original port restored. Embera's
39 * Url object strips the port in __toString(), so self-hosted assets
40 * served from non-standard ports (e.g. http://localhost:8080) end up
41 * pointing at the wrong origin in the rendered <video>/<audio> tag.
42 */
43 protected function srcUrl()
44 {
45 $orig = parse_url($this->rawUrl);
46 if (empty($orig['port'])) {
47 return (string) $this->url;
48 }
49 $cur = parse_url((string) $this->url);
50 if (!empty($cur['port'])) {
51 return (string) $this->url;
52 }
53 $rebuilt = (isset($cur['scheme']) ? $cur['scheme'] : 'http') . '://'
54 . (isset($cur['host']) ? $cur['host'] : $orig['host']) . ':' . $orig['port']
55 . (isset($cur['path']) ? $cur['path'] : '')
56 . (isset($cur['query']) ? '?' . $cur['query'] : '')
57 . (isset($cur['fragment']) ? '#' . $cur['fragment'] : '');
58 return $rebuilt;
59 }
60
61 /** inline {@inheritdoc} */
62
63
64 /**
65 * Method that verifies if the embed URL belongs to SelfHosted.
66 *
67 * @param Url $url
68 * @return boolean
69 * @since 1.0.0
70 *
71 */
72 public function validateUrl(Url $url)
73 {
74 return (bool) preg_match(
75 '/^(https?:\/\/)?(www\.)?([a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,24}|localhost|(\d{1,3}\.){3}\d{1,3})(:[0-9]{1,5})?(\/.*)?$/i',
76 (string) $url
77 );
78 }
79
80 public function validateSelfHostedVideo($url)
81 {
82 // Strip query string / fragment before extension test — streaming
83 // manifests often carry signed-URL parameters (?token=…&exp=…).
84 $path = preg_replace('/[?#].*$/', '', (string) $url);
85 return (bool) preg_match(
86 '/\.(mp4|mov|avi|wmv|flv|mkv|webm|mpeg|mpg|m3u8|mpd)$/i',
87 $path
88 );
89 }
90 public function validateSelfHostedAudio($url)
91 {
92 return (bool) preg_match(
93 '/\.(mp3|wav|ogg|aac)$/i',
94 (string) $url
95 );
96 }
97
98 public function validateWrapper($url)
99 {
100 return (bool) preg_match(
101 '/^(https?:\/\/)?(www\.)?([a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,24}|localhost|(\d{1,3}\.){3}\d{1,3})(:[0-9]{1,5})?(\/.*)?$/i',
102 (string) $url
103 );
104 }
105
106 public function fileExtention($fileUrl)
107 {
108 $pathInfo = pathinfo($fileUrl);
109
110 if (isset($pathInfo['extension'])) {
111 $fileExtension = $pathInfo['extension'];
112 return $fileExtension;
113 }
114 }
115
116
117
118 /**
119 * This method fakes an Oembed response.
120 *
121 * @since 1.0.0
122 *
123 * @return array
124 */
125 public function fakeResponse()
126 {
127 $media_url = $this->srcUrl();
128 $src_url = urldecode($media_url);
129 $provider_name = 'Self Hosterd';
130
131 $width = isset($this->config['maxwidth']) ? $this->config['maxwidth'] : 600;
132 $height = isset($this->config['maxheight']) ? $this->config['maxheight'] : 450;
133
134 // Check if the url is already converted to the embed format
135 if ($this->fileExtention($src_url) === 'ppsx' || $this->fileExtention($src_url) === 'pptx' || $this->fileExtention($src_url) === 'ppt' || $this->fileExtention($src_url) === 'xlsx' || $this->fileExtention($src_url) === 'xls' || $this->fileExtention($src_url) === 'doc' || $this->fileExtention($src_url) === 'docx') {
136 $src_url = '//view.officeapps.live.com/op/embed.aspx?src=' . $media_url;
137 }
138
139 // Check if the url is already converted to the embed format
140 $html = '';
141 if ($this->validateSelfHostedVideo($media_url)) {
142 $videoMime = [
143 'mp4' => 'video/mp4', 'mov' => 'video/quicktime', 'webm' => 'video/webm',
144 'mkv' => 'video/x-matroska', 'avi' => 'video/x-msvideo', 'wmv' => 'video/x-ms-wmv',
145 'flv' => 'video/x-flv', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg',
146 'm3u8' => 'application/vnd.apple.mpegurl',
147 'mpd' => 'application/dash+xml',
148 ];
149 $ext_path = preg_replace('/[?#].*$/', '', $media_url);
150 $ext = strtolower($this->fileExtention($ext_path));
151 $type = isset($videoMime[$ext]) ? $videoMime[$ext] : 'video/mp4';
152 $html = '<video controls width="' . esc_attr($width) . '" height="' . esc_attr($height) . '"> <source src="' . esc_url($media_url) . '" type="' . esc_attr($type) . '"> </video>';
153 } else if ($this->validateSelfHostedAudio($media_url)) {
154 $audioMime = [ 'mp3' => 'audio/mpeg', 'wav' => 'audio/wav', 'ogg' => 'audio/ogg', 'aac' => 'audio/aac' ];
155 $ext = strtolower($this->fileExtention($media_url));
156 $type = isset($audioMime[$ext]) ? $audioMime[$ext] : 'audio/mpeg';
157 $html = '<audio controls> <source src="' . esc_url($media_url) . '" type="' . esc_attr($type) . '"></audio>';
158 } else if ($this->validateWrapper($media_url)) {
159 $provider_name = 'Wrapper';
160
161 $html = '<iframe width="' . esc_attr($width) . '" height="' . esc_attr($height) . '" src="' . esc_url($src_url) . '" > </iframe>';
162 } else {
163 return [];
164 }
165
166 return [
167 'type' => 'rich',
168 'provider_name' => $provider_name,
169 'provider_url' => site_url(),
170 'title' => 'Unknown title',
171 'html' => $html,
172 ];
173 }
174 /** inline @inheritDoc */
175 public function modifyResponse(array $response = [])
176 {
177 return $this->fakeResponse();
178 }
179 }
180