diff options
Diffstat (limited to 'www/wiki/extensions/EmbedVideo/classes/media/VideoHandler.php')
-rw-r--r-- | www/wiki/extensions/EmbedVideo/classes/media/VideoHandler.php | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/www/wiki/extensions/EmbedVideo/classes/media/VideoHandler.php b/www/wiki/extensions/EmbedVideo/classes/media/VideoHandler.php new file mode 100644 index 00000000..9e00d35c --- /dev/null +++ b/www/wiki/extensions/EmbedVideo/classes/media/VideoHandler.php @@ -0,0 +1,200 @@ +<?php +/** + * EmbedVideo + * VideoHandler Class + * + * @author Alexia E. Smith + * @license MIT + * @package EmbedVideo + * @link https://www.mediawiki.org/wiki/Extension:EmbedVideo + * + **/ + +namespace EmbedVideo; + +class VideoHandler extends AudioHandler { + /** + * Validate a thumbnail parameter at parse time. + * Return true to accept the parameter, and false to reject it. + * If you return false, the parser will do something quiet and forgiving. + * + * @access public + * @param string $name + * @param mixed $value + */ + public function validateParam($name, $value) { + if ($name === 'width' || $name === 'height') { + return $value > 0; + } + return parent::validateParam($name, $value); + } + + /** + * Changes the parameter array as necessary, ready for transformation. + * Should be idempotent. + * Returns false if the parameters are unacceptable and the transform should fail + * + * @access public + * @param object File + * @param array Parameters + * @return boolean Success + */ + public function normaliseParams($file, &$parameters) { + parent::normaliseParams($file, $parameters); + + list($width, $height) = $this->getImageSize($file, $file->getLocalRefPath()); + + if ($width === 0 && $height === 0) { + //Force a reset. + $width = 640; + $height = 360; + } + + if (isset($parameters['width']) && isset($parameters['height']) && $parameters['width'] > 0 && $parameters['height'] === $parameters['width']) { + // special allowance for square video embeds needed by some wikis, otherwise forced 16:9 ratios are followed. + return true; + } + + if (isset($parameters['width']) && $parameters['width'] > 0 && $parameters['width'] < $width) { + $parameters['width'] = intval($parameters['width']); + + if (!isset($parameters['height'])) { + //Page embeds do not specify thumbnail height so correct it here based on aspect ratio. + $parameters['height'] = round($height / $width * $parameters['width']); + } + } else { + $parameters['width'] = $width; + } + + if (isset($parameters['height']) && $parameters['height'] > 0 && $parameters['height'] < $height) { + $parameters['height'] = intval($parameters['height']); + } else { + $parameters['height'] = $height; + } + + if ($width > 0 && $parameters['width'] > 0) { + if (($height / $width) != ($parameters['height'] / $parameters['width'])) { + $parameters['height'] = round($height / $width * $parameters['width']); + } + } + + return true; + } + + /** + * Get an image size array like that returned by getimagesize(), or false if it + * can't be determined. + * + * This function is used for determining the width, height and bitdepth directly + * from an image. The results are stored in the database in the img_width, + * img_height, img_bits fields. + * + * @note If this is a multipage file, return the width and height of the + * first page. + * + * @access public + * @param File $image The image object, or false if there isn't one + * @param string $path The filename + * @return mixed An array following the format of PHP getimagesize() internal function or false if not supported. + */ + public function getImageSize($file, $path) { + $probe = new FFProbe($path); + + $stream = $probe->getStream("v:0"); + + if ($stream !== false) { + return [$stream->getWidth(), $stream->getHeight(), 0, "width=\"{$stream->getWidth()}\" height=\"{$stream->getHeight()}\"", 'bits' => $stream->getBitDepth()]; + } + return [0, 0, 0, 'width="0" height="0"', 'bits' => 0]; + } + + /** + * Get a MediaTransformOutput object representing the transformed output. Does the + * transform unless $flags contains self::TRANSFORM_LATER. + * + * @param File $image The image object + * @param string $dstPath Filesystem destination path + * @param string $dstUrl Destination URL to use in output HTML + * @param array $params Arbitrary set of parameters validated by $this->validateParam() + * Note: These parameters have *not* gone through $this->normaliseParams() + * @param integer $flags A bitfield, may contain self::TRANSFORM_LATER + * @return MediaTransformOutput + */ + public function doTransform($file, $dstPath, $dstUrl, $parameters, $flags = 0) { + $this->normaliseParams($file, $parameters); + + if (!($flags & self::TRANSFORM_LATER)) { + //@TODO: Thumbnail generation here. + } + + return new VideoTransformOutput($file, $parameters); + } + + /** + * Shown in file history box on image description page. + * + * @access public + * @param File $file + * @return string Dimensions + */ + public function getDimensionsString($file) { + global $wgLang; + + $probe = new FFProbe($file->getLocalRefPath()); + + $format = $probe->getFormat(); + $stream = $probe->getStream("v:0"); + + if ($format === false || $stream === false) { + return parent::getDimensionsString($file); + } + + return wfMessage('ev_video_short_desc', $wgLang->formatTimePeriod($format->getDuration()), $stream->getWidth(), $stream->getHeight())->text(); + } + + /** + * Short description. Shown on Special:Search results. + * + * @access public + * @param File $file + * @return string + */ + public function getShortDesc($file) { + global $wgLang; + + $probe = new FFProbe($file->getLocalRefPath()); + + $format = $probe->getFormat(); + $stream = $probe->getStream("v:0"); + + if ($format === false || $stream === false) { + return parent::getGeneralShortDesc($file); + } + + return wfMessage('ev_video_short_desc', $wgLang->formatTimePeriod($format->getDuration()), $stream->getWidth(), $stream->getHeight(), $wgLang->formatSize($file->getSize()))->text(); + } + + /** + * Long description. Shown under image on image description page surounded by (). + * + * @access public + * @param File $file + * @return string + */ + public function getLongDesc($file) { + global $wgLang; + + $probe = new FFProbe($file->getLocalRefPath()); + + $format = $probe->getFormat(); + $stream = $probe->getStream("v:0"); + + if ($format === false || $stream === false) { + return parent::getGeneralLongDesc($file); + } + + $extension = pathinfo($file->getLocalRefPath(), PATHINFO_EXTENSION); + + return wfMessage('ev_video_long_desc', strtoupper($extension), $stream->getCodecName(), $wgLang->formatTimePeriod($format->getDuration()), $stream->getWidth(), $stream->getHeight(), $wgLang->formatBitrate($format->getBitRate()))->text(); + } +} |