‪TYPO3CMS  9.5
VimeoRenderer.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
22 
27 {
31  protected ‪$onlineMediaHelper;
32 
42  public function ‪getPriority()
43  {
44  return 1;
45  }
46 
53  public function ‪canRender(‪FileInterface $file)
54  {
55  return ($file->‪getMimeType() === 'video/vimeo' || $file->‪getExtension() === 'vimeo') && $this->‪getOnlineMediaHelper($file) !== false;
56  }
57 
64  protected function ‪getOnlineMediaHelper(‪FileInterface $file)
65  {
66  if ($this->onlineMediaHelper === null) {
67  $orgFile = $file;
68  if ($orgFile instanceof ‪FileReference) {
69  $orgFile = $orgFile->getOriginalFile();
70  }
71  if ($orgFile instanceof ‪File) {
72  $this->onlineMediaHelper = ‪OnlineMediaHelperRegistry::getInstance()->‪getOnlineMediaHelper($orgFile);
73  } else {
74  $this->onlineMediaHelper = false;
75  }
76  }
78  }
79 
90  public function ‪render(‪FileInterface $file, $width, $height, array $options = [], $usedPathsRelativeToCurrentScript = false)
91  {
92  $options = $this->‪collectOptions($options, $file);
93  $src = $this->‪createVimeoUrl($options, $file);
94  $attributes = $this->‪collectIframeAttributes($width, $height, $options);
95 
96  return sprintf(
97  '<iframe src="%s"%s></iframe>',
98  htmlspecialchars($src, ENT_QUOTES | ENT_HTML5),
99  empty($attributes) ? '' : ' ' . $this->‪implodeAttributes($attributes)
100  );
101  }
102 
108  protected function ‪collectOptions(array $options, ‪FileInterface $file)
109  {
110  // Check for an autoplay option at the file reference itself, if not overridden yet.
111  if (!isset($options['autoplay']) && $file instanceof ‪FileReference) {
112  $autoplay = $file->‪getProperty('autoplay');
113  if ($autoplay !== null) {
114  $options['autoplay'] = $autoplay;
115  }
116  }
117 
118  if (!isset($options['allow'])) {
119  $options['allow'] = 'fullscreen';
120  if (!empty($options['autoplay'])) {
121  $options['allow'] = 'autoplay; fullscreen';
122  }
123  }
124 
125  return $options;
126  }
127 
133  protected function ‪createVimeoUrl(array $options, ‪FileInterface $file)
134  {
135  $videoId = $this->‪getVideoIdFromFile($file);
136 
137  $urlParams = [];
138  if (!empty($options['autoplay'])) {
139  $urlParams[] = 'autoplay=1';
140  }
141  if (!empty($options['loop'])) {
142  $urlParams[] = 'loop=1';
143  }
144  if (!empty($options['no-cookie'])) {
145  $urlParams[] = 'dnt=1';
146  }
147  $urlParams[] = 'title=' . (int)!empty($options['showinfo']);
148  $urlParams[] = 'byline=' . (int)!empty($options['showinfo']);
149  $urlParams[] = 'portrait=0';
150 
151  return sprintf('https://player.vimeo.com/video/%s?%s', $videoId, implode('&', $urlParams));
152  }
153 
158  protected function ‪getVideoIdFromFile(‪FileInterface $file)
159  {
160  if ($file instanceof ‪FileReference) {
161  $orgFile = $file->getOriginalFile();
162  } else {
163  $orgFile = $file;
164  }
165 
166  return $this->‪getOnlineMediaHelper($file)->‪getOnlineMediaId($orgFile);
167  }
168 
175  protected function ‪collectIframeAttributes($width, $height, array $options)
176  {
177  $attributes = [];
178  $attributes['allowfullscreen'] = true;
179 
180  if (isset($options['additionalAttributes']) && is_array($options['additionalAttributes'])) {
181  $attributes = array_merge($attributes, $options['additionalAttributes']);
182  }
183  if (isset($options['data']) && is_array($options['data'])) {
184  array_walk(
185  $options['data'],
186  function (&$value, $key) use (&$attributes) {
187  $attributes['data-' . $key] = $value;
188  }
189  );
190  }
191  if ((int)$width > 0) {
192  $attributes['width'] = (int)$width;
193  }
194  if ((int)$height > 0) {
195  $attributes['height'] = (int)$height;
196  }
197  if (isset(‪$GLOBALS['TSFE']) && is_object(‪$GLOBALS['TSFE']) && (isset(‪$GLOBALS['TSFE']->config['config']['doctype']) && ‪$GLOBALS['TSFE']->config['config']['doctype'] !== 'html5')) {
198  $attributes['frameborder'] = 0;
199  }
200  foreach (['class', 'dir', 'id', 'lang', 'style', 'title', 'accesskey', 'tabindex', 'onclick', 'allow'] as $key) {
201  if (!empty($options[$key])) {
202  $attributes[$key] = $options[$key];
203  }
204  }
205  return $attributes;
206  }
207 
213  protected function ‪implodeAttributes(array $attributes): string
214  {
215  $attributeList = [];
216  foreach ($attributes as $name => $value) {
217  $name = preg_replace('/[^\p{L}0-9_.-]/u', '', $name);
218  if ($value === true) {
219  $attributeList[] = $name;
220  } else {
221  $attributeList[] = $name . '="' . htmlspecialchars($value, ENT_QUOTES | ENT_HTML5) . '"';
222  }
223  }
224  return implode(' ', $attributeList);
225  }
226 }
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer
Definition: VimeoRenderer.php:27
‪TYPO3\CMS\Core\Resource\FileInterface\getExtension
‪string getExtension()
‪TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\OnlineMediaHelperRegistry
Definition: OnlineMediaHelperRegistry.php:25
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\implodeAttributes
‪string implodeAttributes(array $attributes)
Definition: VimeoRenderer.php:212
‪TYPO3\CMS\Core\Resource\FileInterface
Definition: FileInterface.php:21
‪TYPO3\CMS\Core\Resource\FileReference
Definition: FileReference.php:31
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\createVimeoUrl
‪string createVimeoUrl(array $options, FileInterface $file)
Definition: VimeoRenderer.php:132
‪TYPO3\CMS\Core\Resource\FileInterface\getProperty
‪string getProperty($key)
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\getPriority
‪int getPriority()
Definition: VimeoRenderer.php:41
‪TYPO3\CMS\Core\Resource\Rendering
Definition: AudioTagRenderer.php:2
‪TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\OnlineMediaHelperRegistry\getOnlineMediaHelper
‪bool OnlineMediaHelperInterface getOnlineMediaHelper(File $file)
Definition: OnlineMediaHelperRegistry.php:42
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\getVideoIdFromFile
‪string getVideoIdFromFile(FileInterface $file)
Definition: VimeoRenderer.php:157
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:23
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\collectOptions
‪array collectOptions(array $options, FileInterface $file)
Definition: VimeoRenderer.php:107
‪TYPO3\CMS\Core\Resource\Rendering\FileRendererInterface
Definition: FileRendererInterface.php:23
‪TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\OnlineMediaHelperRegistry\getInstance
‪static OnlineMediaHelperRegistry getInstance()
Definition: OnlineMediaHelperRegistry.php:31
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\getOnlineMediaHelper
‪bool OnlineMediaHelperInterface getOnlineMediaHelper(FileInterface $file)
Definition: VimeoRenderer.php:63
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:5
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\$onlineMediaHelper
‪OnlineMediaHelperInterface $onlineMediaHelper
Definition: VimeoRenderer.php:30
‪TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\OnlineMediaHelperInterface
Definition: OnlineMediaHelperInterface.php:24
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\render
‪string render(FileInterface $file, $width, $height, array $options=[], $usedPathsRelativeToCurrentScript=false)
Definition: VimeoRenderer.php:89
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\canRender
‪bool canRender(FileInterface $file)
Definition: VimeoRenderer.php:52
‪TYPO3\CMS\Core\Resource\FileInterface\getMimeType
‪string getMimeType()
‪TYPO3\CMS\Core\Resource\Rendering\VimeoRenderer\collectIframeAttributes
‪array collectIframeAttributes($width, $height, array $options)
Definition: VimeoRenderer.php:174
‪TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\OnlineMediaHelperInterface\getOnlineMediaId
‪string getOnlineMediaId(File $file)