sonata-project /
SonataMediaBundle
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | |||
| 3 | declare(strict_types=1); |
||
| 4 | |||
| 5 | /* |
||
| 6 | * This file is part of the Sonata Project package. |
||
| 7 | * |
||
| 8 | * (c) Thomas Rabaix <[email protected]> |
||
| 9 | * |
||
| 10 | * For the full copyright and license information, please view the LICENSE |
||
| 11 | * file that was distributed with this source code. |
||
| 12 | */ |
||
| 13 | |||
| 14 | namespace Sonata\MediaBundle\Provider; |
||
| 15 | |||
| 16 | use Buzz\Browser; |
||
| 17 | use Gaufrette\Filesystem; |
||
| 18 | use Sonata\MediaBundle\CDN\CDNInterface; |
||
| 19 | use Sonata\MediaBundle\Generator\GeneratorInterface; |
||
| 20 | use Sonata\MediaBundle\Metadata\MetadataBuilderInterface; |
||
| 21 | use Sonata\MediaBundle\Model\MediaInterface; |
||
| 22 | use Sonata\MediaBundle\Thumbnail\ThumbnailInterface; |
||
| 23 | use Symfony\Component\HttpFoundation\RedirectResponse; |
||
| 24 | |||
| 25 | /** |
||
| 26 | * @final since sonata-project/media-bundle 3.21.0 |
||
| 27 | */ |
||
| 28 | class YouTubeProvider extends BaseVideoProvider |
||
| 29 | { |
||
| 30 | /** |
||
| 31 | * @var bool |
||
| 32 | */ |
||
| 33 | protected $html5; |
||
| 34 | |||
| 35 | /** |
||
| 36 | * @param string $name |
||
| 37 | * @param MetadataBuilderInterface $metadata |
||
| 38 | * @param bool $html5 |
||
| 39 | */ |
||
| 40 | public function __construct($name, Filesystem $filesystem, CDNInterface $cdn, GeneratorInterface $pathGenerator, ThumbnailInterface $thumbnail, Browser $browser, ?MetadataBuilderInterface $metadata = null, $html5 = false) |
||
| 41 | { |
||
| 42 | parent::__construct($name, $filesystem, $cdn, $pathGenerator, $thumbnail, $browser, $metadata); |
||
| 43 | $this->html5 = $html5; |
||
| 44 | } |
||
| 45 | |||
| 46 | public function getProviderMetadata() |
||
| 47 | { |
||
| 48 | return new Metadata( |
||
| 49 | $this->getName(), |
||
| 50 | $this->getName().'.description', |
||
| 51 | null, |
||
| 52 | 'SonataMediaBundle', |
||
| 53 | ['class' => 'fa fa-youtube'] |
||
| 54 | ); |
||
| 55 | } |
||
| 56 | |||
| 57 | public function getHelperProperties(MediaInterface $media, $format, $options = []) |
||
| 58 | { |
||
| 59 | // Override html5 value if $options['html5'] is a boolean |
||
| 60 | if (!isset($options['html5'])) { |
||
| 61 | $options['html5'] = $this->html5; |
||
| 62 | } |
||
| 63 | |||
| 64 | // documentation : http://code.google.com/apis/youtube/player_parameters.html |
||
| 65 | |||
| 66 | $default_player_url_parameters = [ |
||
| 67 | //Values: 0 or 1. Default is 1. Sets whether the player should load related |
||
| 68 | // videos once playback of the initial video starts. Related videos are |
||
| 69 | // displayed in the "genie menu" when the menu button is pressed. The player |
||
| 70 | // search functionality will be disabled if rel is set to 0. |
||
| 71 | 'rel' => 0, |
||
| 72 | |||
| 73 | // Values: 0 or 1. Default is 0. Sets whether or not the initial video will autoplay |
||
| 74 | // when the player loads. |
||
| 75 | 'autoplay' => 0, |
||
| 76 | |||
| 77 | // Values: 0 or 1. Default is 0. In the case of a single video player, a setting of 1 |
||
| 78 | // will cause the player to play the initial video again and again. In the case of a |
||
| 79 | // playlist player (or custom player), the player will play the entire playlist and |
||
| 80 | // then start again at the first video. |
||
| 81 | 'loop' => 0, |
||
| 82 | |||
| 83 | // Values: 0 or 1. Default is 0. Setting this to 1 will enable the Javascript API. |
||
| 84 | // For more information on the Javascript API and how to use it, see the JavaScript |
||
| 85 | // API documentation. |
||
| 86 | 'enablejsapi' => 0, |
||
| 87 | |||
| 88 | // Value can be any alphanumeric string. This setting is used in conjunction with the |
||
| 89 | // JavaScript API. See the JavaScript API documentation for details. |
||
| 90 | 'playerapiid' => null, |
||
| 91 | |||
| 92 | // Values: 0 or 1. Default is 0. Setting to 1 will disable the player keyboard controls. |
||
| 93 | // Keyboard controls are as follows: |
||
| 94 | // Spacebar: Play / Pause |
||
| 95 | // Arrow Left: Jump back 10% in the current video |
||
| 96 | // Arrow Right: Jump ahead 10% in the current video |
||
| 97 | // Arrow Up: Volume up |
||
| 98 | // Arrow Down: Volume Down |
||
| 99 | 'disablekb' => 0, |
||
| 100 | |||
| 101 | // Values: 0 or 1. Default is 0. Setting to 1 enables the "Enhanced Genie Menu". This |
||
| 102 | // behavior causes the genie menu (if present) to appear when the user's mouse enters |
||
| 103 | // the video display area, as opposed to only appearing when the menu button is pressed. |
||
| 104 | 'egm' => 0, |
||
| 105 | |||
| 106 | // Values: 0 or 1. Default is 0. Setting to 1 enables a border around the entire video |
||
| 107 | // player. The border's primary color can be set via the color1 parameter, and a |
||
| 108 | // secondary color can be set by the color2 parameter. |
||
| 109 | 'border' => 0, |
||
| 110 | |||
| 111 | // Values: Any RGB value in hexadecimal format. color1 is the primary border color, and |
||
| 112 | // color2 is the video control bar background color and secondary border color. |
||
| 113 | 'color1' => null, |
||
| 114 | 'color2' => null, |
||
| 115 | |||
| 116 | // Values: 0 or 1. Default is 0. Setting to 1 enables the fullscreen button. This has no |
||
| 117 | // effect on the Chromeless Player. Note that you must include some extra arguments to |
||
| 118 | // your embed code for this to work. |
||
| 119 | 'fs' => 1, |
||
| 120 | |||
| 121 | // Values: A positive integer. This parameter causes the player to begin playing the video |
||
| 122 | // at the given number of seconds from the start of the video. Note that similar to the |
||
| 123 | // seekTo function, the player will look for the closest keyframe to the time you specify. |
||
| 124 | // This means sometimes the play head may seek to just before the requested time, usually |
||
| 125 | // no more than ~2 seconds |
||
| 126 | 'start' => 0, |
||
| 127 | |||
| 128 | // Values: 0 or 1. Default is 0. Setting to 1 enables HD playback by default. This has no |
||
| 129 | // effect on the Chromeless Player. This also has no effect if an HD version of the video |
||
| 130 | // is not available. If you enable this option, keep in mind that users with a slower |
||
| 131 | // connection may have an sub-optimal experience unless they turn off HD. You should ensure |
||
| 132 | // your player is large enough to display the video in its native resolution. |
||
| 133 | 'hd' => 1, |
||
| 134 | |||
| 135 | // Values: 0 or 1. Default is 1. Setting to 0 disables the search box from displaying when |
||
| 136 | // the video is minimized. Note that if the rel parameter is set to 0 then the search box |
||
| 137 | // will also be disabled, regardless of the value of showsearch. |
||
| 138 | 'showsearch' => 0, |
||
| 139 | |||
| 140 | // Values: 0 or 1. Default is 1. Setting to 0 causes the player to not display information |
||
| 141 | // like the video title and rating before the video starts playing. |
||
| 142 | 'showinfo' => 0, |
||
| 143 | |||
| 144 | // Values: 1 or 3. Default is 1. Setting to 1 will cause video annotations to be shown by |
||
| 145 | // default, whereas setting to 3 will cause video annotation to not be shown by default. |
||
| 146 | 'iv_load_policy' => 1, |
||
| 147 | |||
| 148 | // Values: 1. Default is based on user preference. Setting to 1 will cause closed captions |
||
| 149 | // to be shown by default, even if the user has turned captions off. |
||
| 150 | 'cc_load_policy' => 1, |
||
| 151 | |||
| 152 | // Values: 'window' or 'opaque' or 'transparent'. |
||
| 153 | // When wmode=window, the Flash movie is not rendered in the page. |
||
| 154 | // When wmode=opaque, the Flash movie is rendered as part of the page. |
||
| 155 | // When wmode=transparent, the Flash movie is rendered as part of the page. |
||
| 156 | 'wmode' => 'window', |
||
| 157 | ]; |
||
| 158 | |||
| 159 | $default_player_parameters = [ |
||
| 160 | // Values: 0 or 1. Default is 0. Setting to 1 enables a border around the entire video |
||
| 161 | // player. The border's primary color can be set via the color1 parameter, and a |
||
| 162 | // secondary color can be set by the color2 parameter. |
||
| 163 | 'border' => $default_player_url_parameters['border'], |
||
| 164 | |||
| 165 | // Values: 'allowfullscreen' or empty. Default is 'allowfullscreen'. Setting to empty value disables |
||
| 166 | // the fullscreen button. |
||
| 167 | 'allowFullScreen' => '1' === $default_player_url_parameters['fs'] ? true : false, |
||
|
0 ignored issues
–
show
Unused Code
Bug
introduced
by
Loading history...
|
|||
| 168 | |||
| 169 | // The allowScriptAccess parameter in the code is needed to allow the player SWF to call |
||
| 170 | // functions on the containing HTML page, since the player is hosted on a different domain |
||
| 171 | // from the HTML page. |
||
| 172 | 'allowScriptAccess' => $options['allowScriptAccess'] ?? 'always', |
||
| 173 | |||
| 174 | // Values: 'window' or 'opaque' or 'transparent'. |
||
| 175 | // When wmode=window, the Flash movie is not rendered in the page. |
||
| 176 | // When wmode=opaque, the Flash movie is rendered as part of the page. |
||
| 177 | // When wmode=transparent, the Flash movie is rendered as part of the page. |
||
| 178 | 'wmode' => $default_player_url_parameters['wmode'], |
||
| 179 | ]; |
||
| 180 | |||
| 181 | $player_url_parameters = array_merge($default_player_url_parameters, $options['player_url_parameters'] ?? []); |
||
| 182 | |||
| 183 | $box = $this->getBoxHelperProperties($media, $format, $options); |
||
| 184 | |||
| 185 | $player_parameters = array_merge($default_player_parameters, $options['player_parameters'] ?? [], [ |
||
| 186 | 'width' => $box->getWidth(), |
||
| 187 | 'height' => $box->getHeight(), |
||
| 188 | ]); |
||
| 189 | |||
| 190 | $params = [ |
||
| 191 | 'html5' => $options['html5'], |
||
| 192 | 'player_url_parameters' => http_build_query($player_url_parameters), |
||
| 193 | 'player_parameters' => $player_parameters, |
||
| 194 | ]; |
||
| 195 | |||
| 196 | return $params; |
||
| 197 | } |
||
| 198 | |||
| 199 | public function updateMetadata(MediaInterface $media, $force = false): void |
||
| 200 | { |
||
| 201 | $url = sprintf('https://www.youtube.com/oembed?url=%s&format=json', $this->getReferenceUrl($media)); |
||
| 202 | |||
| 203 | try { |
||
| 204 | $metadata = $this->getMetadata($media, $url); |
||
| 205 | } catch (\RuntimeException $e) { |
||
| 206 | $media->setEnabled(false); |
||
| 207 | $media->setProviderStatus(MediaInterface::STATUS_ERROR); |
||
| 208 | |||
| 209 | return; |
||
| 210 | } |
||
| 211 | |||
| 212 | $media->setProviderMetadata($metadata); |
||
| 213 | |||
| 214 | if ($force) { |
||
| 215 | $media->setName($metadata['title']); |
||
| 216 | $media->setAuthorName($metadata['author_name']); |
||
| 217 | } |
||
| 218 | |||
| 219 | $media->setHeight($metadata['height']); |
||
| 220 | $media->setWidth($metadata['width']); |
||
| 221 | $media->setContentType('video/x-flv'); |
||
| 222 | } |
||
| 223 | |||
| 224 | public function getDownloadResponse(MediaInterface $media, $format, $mode, array $headers = []) |
||
| 225 | { |
||
| 226 | return new RedirectResponse($this->getReferenceUrl($media), 302, $headers); |
||
| 227 | } |
||
| 228 | |||
| 229 | /** |
||
| 230 | * Get provider reference url. |
||
| 231 | * |
||
| 232 | * @return string |
||
| 233 | */ |
||
| 234 | public function getReferenceUrl(MediaInterface $media) |
||
| 235 | { |
||
| 236 | return sprintf('https://www.youtube.com/watch?v=%s', $media->getProviderReference()); |
||
| 237 | } |
||
| 238 | |||
| 239 | protected function fixBinaryContent(MediaInterface $media): void |
||
| 240 | { |
||
| 241 | if (!$media->getBinaryContent()) { |
||
| 242 | return; |
||
| 243 | } |
||
| 244 | |||
| 245 | if (11 === \strlen($media->getBinaryContent())) { |
||
| 246 | return; |
||
| 247 | } |
||
| 248 | |||
| 249 | if (preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\#\?&\"'>]+)/", $media->getBinaryContent(), $matches)) { |
||
| 250 | $media->setBinaryContent($matches[1]); |
||
| 251 | } |
||
| 252 | } |
||
| 253 | |||
| 254 | protected function doTransform(MediaInterface $media): void |
||
| 255 | { |
||
| 256 | $this->fixBinaryContent($media); |
||
| 257 | |||
| 258 | if (!$media->getBinaryContent()) { |
||
| 259 | return; |
||
| 260 | } |
||
| 261 | |||
| 262 | $media->setProviderName($this->name); |
||
| 263 | $media->setProviderStatus(MediaInterface::STATUS_OK); |
||
| 264 | $media->setProviderReference($media->getBinaryContent()); |
||
| 265 | |||
| 266 | $this->updateMetadata($media, true); |
||
| 267 | } |
||
| 268 | } |
||
| 269 |