GalleryMovieItem * @g2 GalleryDataItem * @g2 * @g2 1 * @g2 0 * @g2 * @g2 * * @package GalleryCore * @subpackage Classes * @author Bharat Mediratta * @version $Revision: 17580 $ */ class GalleryMovieItem extends GalleryDataItem { /** * The width of this movie. * @var int * * @g2 * @g2 width * @g2 INTEGER * @g2 * @g2 FULL * @g2 */ var $width; /** * The height of this movie. * @var int * * @g2 * @g2 height * @g2 INTEGER * @g2 * @g2 FULL * @g2 */ var $height; /** * The duration of the movie in seconds * @var int * * @g2 * @g2 duration * @g2 INTEGER * @g2 * @g2 FULL * @g2 */ var $duration; /** * @see GalleryDataItem::canBeViewedInline */ function canBeViewedInline() { /* The mimeTypes listed here should provide a render() output */ static $mimeList = array( 'video/quicktime', 'video/mpeg', 'video/mp4', 'video/x-msvideo', 'video/x-ms-wmv', 'video/x-ms-asf', 'video/x-ms-asx', ); return $this->_canBeViewedInline( ($this->getWidth() > 0 && $this->getHeight() > 0) ? $mimeList : null); } /** * Create a new GalleryMovieItem from a video file * * @param int $parentId the id of the parent GalleryItem * @param string $videoFileName the path to the source video * @param string $mimeType * @param string $targetName the desired name of the new item * @param boolean $symlink (optional) a boolean true if we should symlink instead * of copy (default is false). * @return GalleryStatus a status code */ function create($parentId, $videoFileName, $mimeType, $targetName=null, $symlink=false) { global $gallery; $platform =& $gallery->getPlatform(); /* Validate the input filename */ if (empty($videoFileName)) { return GalleryCoreApi::error(ERROR_BAD_PARAMETER); } if (!$platform->file_exists($videoFileName)) { return GalleryCoreApi::error(ERROR_BAD_PATH); } /* Create our data item */ $ret = parent::create($parentId, $videoFileName, $mimeType, $targetName, $symlink); if ($ret) { return $ret; } /* Default to empty dimensions */ $this->setWidth(0); $this->setHeight(0); $this->setDuration(0); /* We're linkable */ $this->setIsLinkable(true); /* Detect our dimensions, if possible */ $ret = $this->rescan(); if ($ret) { /* Cleanup our datafile on failure */ list ($ret2, $path) = $this->fetchPath(); if (!$ret2) { @$platform->unlink($path); } return $ret; } return null; } /** * @see GalleryDataItem::rescan */ function rescan() { global $gallery; $ret = parent::rescan(); if ($ret) { return $ret; } list ($ret, $path) = $this->fetchPath(); if ($ret) { return $ret; } $mimeType = $this->getMimeType(); list ($ret, $toolkit) = GalleryCoreApi::getToolkitByProperty($mimeType, 'dimensions-and-duration'); if ($ret) { return $ret; } if (isset($toolkit)) { list ($ret, $dimensions) = $toolkit->getProperty($mimeType, 'dimensions-and-duration', $path); if ($ret) { if (!($ret->getErrorCode() & ERROR_STORAGE_FAILURE)) { /* * We can't get the dimensions. It may be a bad movie, or the graphics toolkit * may be broken. We can't tell, so set everything to zero for now. * * TODO: trapping everything but storage failures is too broad. Trap only * toolkit failures after we refactor all toolkits to set the * ERROR_TOOLKIT_FAILURE bit on every error that they generate or pass * through. */ $dimensions = array(0, 0, 0); } else { return $ret; } } $this->setWidth($dimensions[0]); $this->setHeight($dimensions[1]); $this->setDuration(round($dimensions[2])); } return null; } /** * @see GalleryEntity::itemTypeName */ function itemTypeName($localized = true) { global $gallery; if ($localized) { list ($ret, $core) = GalleryCoreApi::loadPlugin('module', 'core'); if (! $ret) { return array($core->translate('Movie'), $core->translate('movie')); } } return array('Movie', 'movie'); } /** * @see GalleryDataItem::render */ function render($format, $params) { global $gallery; $fallback = trim(preg_replace("/[\r\n]/", '', $params['fallback'])); switch ($format) { case 'HTML': $urlGenerator =& $gallery->getUrlGenerator(); $src = $urlGenerator->generateUrl( array('view' => 'core.DownloadItem', 'itemId' => $this->getId(), 'serialNumber' => $this->getSerialNumber()), array('forceFullUrl' => true, 'forceSessionId' => true)); list ($width, $height) = array($this->getWidth(), $this->getHeight()); switch ($this->getMimeType()) { case 'video/quicktime': return sprintf( ' %s ', $width, $height + 16, !empty($params['id']) ? $params['id'] : 'movie', !empty($params['class']) ? ' class="' . $params['class'] . '"' : '', $src, $src, $width, $height + 16, $this->getMimeType(), $fallback); case 'video/mpeg': case 'video/mp4': case 'video/x-msvideo': case 'video/x-ms-wmv': $classId = 'CLSID:05589FA1-C356-11CE-BF01-00AA0055595A'; case 'video/x-ms-asf': case 'video/x-ms-asx': if (!isset($classId)) { $classId = 'CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95'; } return sprintf( ' %s ', $classId, $width, $height + 50, !empty($params['id']) ? $params['id'] : 'movie', !empty($params['class']) ? ' class="' . $params['class'] . '"' : '', $src, $src, $width, $height + 50, $this->getMimeType(), $fallback); default: return $fallback; } default: return null; } } /** * @see GalleryEntity::getClassName */ function getClassName() { return 'GalleryMovieItem'; } function getWidth() { return $this->width; } function setWidth($width) { $this->width = $width; } function getHeight() { return $this->height; } function setHeight($height) { $this->height = $height; } function getDuration() { return $this->duration; } function setDuration($duration) { $this->duration = $duration; } } ?>