function convert(&$Medium, $mimeType) { if (Medium::name(null, $mimeType) === 'Image') { $randomFrame = rand(1, $Medium->objects['ffmpeg_movie']->getFrameCount() - 1); $resource = $Medium->objects['ffmpeg_movie']->getFrame($randomFrame)->toGDImage(); if (!is_resource($resource)) { return false; } $Image = Medium::factory(array('gd' => $resource), 'image/gd'); return $Image->convert($mimeType); } return false; }
/** * "makes" a file * * @param string $file Absolute path to a file * @access protected * @return boolean */ function _make($file) { $File = new File($file); $name = Medium::name($file); $subdir = array_pop(explode(DS, dirname($this->source))); if ($name === 'Icon' || strpos($file, 'ico' . DS) !== false) { return true; } if ($this->version) { $configString = 'Media.filter.' . strtolower($name) . '.' . $this->version; $filter = array(Configure::read($configString)); } else { $configString = 'Media.filter.' . strtolower($name); $filter = Configure::read($configString); } foreach ($filter as $version => $instructions) { $directory = Folder::slashTerm(rtrim($this->destination . $version . DS . $subdir, '.')); $Folder = new Folder($directory, $this->_createDirectories); if (!$Folder->pwd()) { $this->err($directory . ' could not be created or is not writable.'); $this->err('Please check your permissions.'); return false; } $Medium = Medium::make($File->pwd(), $instructions); if (!$Medium) { $this->err('Failed to make version ' . $version . ' of medium.'); return false; } $Medium->store($Folder->pwd() . $File->name, $this->overwrite); } return true; }
/** * Triggered by `beforeValidate`, `beforeSave` or upon user request * * Prepares runtime for being used by `perform()` * * @param Model $Model * @param string $file Optionally provide a valid transfer resource to be used as source * @return mixed true if transfer is ready to be performed, false on error, null if no data was found */ function prepare(&$Model, $file = null) { if (isset($Model->data[$Model->alias]['file'])) { $file = $Model->data[$Model->alias]['file']; } if (empty($file)) { return null; } if ($this->runtime[$Model->alias]['hasPerformed']) { $this->reset($Model); } if ($this->runtime[$Model->alias]['isReady']) { return true; } /* Extraction must happen after reset */ extract($this->settings[$Model->alias], EXTR_SKIP); extract($this->runtime[$Model->alias], EXTR_SKIP); if (TransferValidation::blank($file)) { /* Set explicitly null enabling allowEmpty in rules act upon emptiness */ return $Model->data[$Model->alias]['file'] = null; } if ($source = $this->_source($Model, $file)) { $this->runtime[$Model->alias]['source'] = $source; } else { return false; } /* Temporary is optional and can fail */ if ($source['type'] !== 'file-local') { $temporary = $this->runtime[$Model->alias]['temporary'] = $this->_temporary($Model, $file); } $this->_addMarker($Model, 'DS', DS); $this->_addMarker($Model, 'uuid', String::uuid()); $this->_addMarker($Model, 'unixTimestamp', time()); $this->_addMarker($Model, 'year', date('Y')); $this->_addMarker($Model, 'month', date('m')); $this->_addMarker($Model, 'day', date('d')); $filename = $this->_addMarker($Model, 'Source.filename', $source['filename'], true); $extension = $this->_addMarker($Model, 'Source.extension', $source['extension'], true); $this->_addMarker($Model, 'Source.basename', empty($extension) ? $filename : $filename . '.' . $extension); $this->_addMarker($Model, 'Source.mimeType', $source['mimeType'], true); $this->_addMarker($Model, 'Source.type', $source['type']); $this->_addMarker($Model, 'Medium.name', strtolower(Medium::name($source['file'], $source['mimeType']))); $this->_addMarker($Model, 'Medium.short', Medium::short($source['file'], $source['mimeType'])); /* Needed for tableless Models */ if (isset($Model->data[$Model->alias])) { $this->_addMarker($Model, $Model->alias . '.', $Model->data[$Model->alias], true); $this->_addMarker($Model, 'Model.', $Model->data[$Model->alias], true); } $this->_addMarker($Model, 'Model.name', $Model->name); $this->_addMarker($Model, 'Model.alias', $Model->alias); if (!($destinationFile = $this->_replaceMarker($Model, $destinationFile))) { return false; } if ($destination = $this->_destination($Model, $baseDirectory . $destinationFile)) { $this->runtime[$Model->alias]['destination'] = $destination; } else { return false; } if ($source == $destination || $temporary == $destination) { return false; } $Folder = new Folder($destination['dirname'], $createDirectory); if (!$Folder->pwd()) { $message = "TransferBehavior::prepare - Directory `{$destination['dirname']}` could "; $message .= "not be created or is not writable. Please check the permissions."; trigger_error($message, E_USER_WARNING); return false; } return $this->runtime[$Model->alias]['isReady'] = true; }
/** * Parses instruction sets and invokes `Medium::make()` for a file * * @param Model $Model * @param string $file Path to a file relative to `baseDirectory` or an absolute path to a file * @return boolean */ function make(&$Model, $file, $overwrite = false) { extract($this->settings[$Model->alias]); list($file, $relativeFile) = $this->_file($Model, $file); $relativeDirectory = DS . rtrim(dirname($relativeFile), '.'); $name = Medium::name($file); $filter = Configure::read('Media.filter.' . strtolower($name)); $hasCallback = method_exists($Model, 'beforeMake'); foreach ($filter as $version => $instructions) { $directory = Folder::slashTerm($filterDirectory . $version . $relativeDirectory); $Folder = new Folder($directory, $createDirectory); if (!$Folder->pwd()) { $message = "MediaBehavior::make - Directory `{$directory}` "; $message .= "could not be created or is not writable. "; $message .= "Please check the permissions."; trigger_error($message, E_USER_WARNING); continue; } if ($hasCallback) { $process = compact('overwrite', 'directory', 'name', 'version', 'instructions'); if ($Model->beforeMake($file, $process)) { continue; } } if (!($Medium = Medium::make($file, $instructions))) { $message = "MediaBehavior::make - Failed to make version `{$version}` "; $message .= "of file `{$file}`. "; trigger_error($message, E_USER_WARNING); continue; } $Medium->store($directory . basename($file), $overwrite); } return true; }
function convert($Medium, $mimeType) { if (Medium::name(null, $mimeType) === 'Image') { $coverArt = $this->__coverArt($Medium); if (!$coverArt) { return false; } $resource = @imagecreatefromstring($coverArt); if (!is_resource($resource)) { return false; } $Image = Medium::factory(array('gd' => $resource), 'image/gd'); return $Image->convert($mimeType); } return false; }
/** * Factory method * * Takes a file and determines type of medium to use for it * Falls back to generic medium * * @param mixed $file See description of the constructor * @param string $mimeType Sets the mimeType of the new medium * @return object */ static function &factory($file, $mimeType = null) { if ($mimeType === null) { $mimeType = MimeType::guessType($file, array('experimental' => false)); } $name = Medium::name(null, $mimeType); $class = $name . 'Medium'; if (!class_exists($class)) { App::import('Vendor', 'Media.' . $class, array('file' => 'medium' . DS . strtolower($name) . '.php')); } $Object = new $class($file, $mimeType); return $Object; }