TYPO3 CMS  TYPO3_8-7
YouTubeRenderer.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  */
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/youtube' || $file->getExtension() === 'youtube') && $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->createYouTubeUrl($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  $showPlayerControls = 1;
119  $options['controls'] = (int)!empty($options['controls'] ?? $showPlayerControls);
120 
121  if (!isset($options['allow'])) {
122  $options['allow'] = 'fullscreen';
123  if (!empty($options['autoplay'])) {
124  $options['allow'] = 'autoplay; fullscreen';
125  }
126  }
127  return $options;
128  }
129 
135  protected function createYouTubeUrl(array $options, FileInterface $file)
136  {
137  $videoId = $this->getVideoIdFromFile($file);
138 
139  $urlParams = ['autohide=1'];
140  $urlParams[] = 'controls=' . $options['controls'];
141  if (!empty($options['autoplay'])) {
142  $urlParams[] = 'autoplay=1';
143  }
144  if (!empty($options['modestbranding'])) {
145  $urlParams[] = 'modestbranding=1';
146  }
147  if (!empty($options['loop'])) {
148  $urlParams[] = 'loop=1&playlist=' . rawurlencode($videoId);
149  }
150  if (isset($options['relatedVideos'])) {
151  $urlParams[] = 'rel=' . (int)(bool)$options['relatedVideos'];
152  }
153  if (!isset($options['enablejsapi']) || !empty($options['enablejsapi'])) {
154  $urlParams[] = 'enablejsapi=1&origin=' . rawurlencode(GeneralUtility::getIndpEnv('TYPO3_REQUEST_HOST'));
155  }
156 
157  $youTubeUrl = sprintf(
158  'https://www.youtube%s.com/embed/%s?%s',
159  !isset($options['no-cookie']) || !empty($options['no-cookie']) ? '-nocookie' : '',
160  rawurlencode($videoId),
161  implode('&', $urlParams)
162  );
163 
164  return $youTubeUrl;
165  }
166 
171  protected function getVideoIdFromFile(FileInterface $file)
172  {
173  if ($file instanceof FileReference) {
174  $orgFile = $file->getOriginalFile();
175  } else {
176  $orgFile = $file;
177  }
178 
179  return $this->getOnlineMediaHelper($file)->getOnlineMediaId($orgFile);
180  }
181 
188  protected function collectIframeAttributes($width, $height, array $options)
189  {
190  $attributes = [];
191  $attributes['allowfullscreen'] = true;
192 
193  if ((int)$width > 0) {
194  $attributes['width'] = (int)$width;
195  }
196  if ((int)$height > 0) {
197  $attributes['height'] = (int)$height;
198  }
199  if (isset($GLOBALS['TSFE']) && is_object($GLOBALS['TSFE']) && $GLOBALS['TSFE']->config['config']['doctype'] !== 'html5') {
200  $attributes['frameborder'] = 0;
201  }
202  foreach (['class', 'dir', 'id', 'lang', 'style', 'title', 'accesskey', 'tabindex', 'onclick', 'poster', 'preload', 'allow'] as $key) {
203  if (!empty($options[$key])) {
204  $attributes[$key] = $options[$key];
205  }
206  }
207 
208  return $attributes;
209  }
210 
216  protected function implodeAttributes(array $attributes): string
217  {
218  $attributeList = [];
219  foreach ($attributes as $name => $value) {
220  $name = preg_replace('/[^\p{L}0-9_.-]/u', '', $name);
221  if ($value === true) {
222  $attributeList[] = $name;
223  } else {
224  $attributeList[] = $name . '="' . htmlspecialchars($value, ENT_QUOTES | ENT_HTML5) . '"';
225  }
226  }
227  return implode(' ', $attributeList);
228  }
229 }
render(FileInterface $file, $width, $height, array $options=[], $usedPathsRelativeToCurrentScript=false)
createYouTubeUrl(array $options, FileInterface $file)
collectOptions(array $options, FileInterface $file)
collectIframeAttributes($width, $height, array $options)
if(TYPO3_MODE==='BE') $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tsfebeuserauth.php']['frontendEditingController']['default']