Example #1
0
 /**
  * @param Model\Asset\Video $asset
  * @param $config
  * @param array $onlyFormats
  * @return Processor
  * @throws \Exception
  */
 public static function process(Model\Asset\Video $asset, $config, $onlyFormats = [])
 {
     if (!\Pimcore\Video::isAvailable()) {
         throw new \Exception("No ffmpeg executable found, please configure the correct path in the system settings");
     }
     $instance = new self();
     $formats = empty($onlyFormats) ? ["mp4"] : $onlyFormats;
     $instance->setProcessId(uniqid());
     $instance->setAssetId($asset->getId());
     $instance->setConfig($config);
     // check for running or already created thumbnails
     $customSetting = $asset->getCustomSetting("thumbnails");
     $existingFormats = [];
     if (is_array($customSetting) && array_key_exists($config->getName(), $customSetting)) {
         if ($customSetting[$config->getName()]["status"] == "inprogress") {
             if (TmpStore::get($instance->getJobStoreId($customSetting[$config->getName()]["processId"]))) {
                 return;
             }
         } elseif ($customSetting[$config->getName()]["status"] == "finished") {
             // check if the files are there
             $formatsToConvert = [];
             foreach ($formats as $f) {
                 if (!is_file($asset->getVideoThumbnailSavePath() . $customSetting[$config->getName()]["formats"][$f])) {
                     $formatsToConvert[] = $f;
                 } else {
                     $existingFormats[$f] = $customSetting[$config->getName()]["formats"][$f];
                     $existingFormats[$f] = $customSetting[$config->getName()]["formats"][$f];
                 }
             }
             if (!empty($formatsToConvert)) {
                 $formats = $formatsToConvert;
             } else {
                 return;
             }
         } elseif ($customSetting[$config->getName()]["status"] == "error") {
             throw new \Exception("Unable to convert video, see logs for details.");
         }
     }
     foreach ($formats as $format) {
         $thumbDir = $asset->getVideoThumbnailSavePath() . "/thumb__" . $config->getName();
         $filename = preg_replace("/\\." . preg_quote(File::getFileExtension($asset->getFilename())) . "/", "", $asset->getFilename()) . "." . $format;
         $fsPath = $thumbDir . "/" . $filename;
         $tmpPath = PIMCORE_SYSTEM_TEMP_DIRECTORY . "/" . $filename;
         if (!is_dir(dirname($fsPath))) {
             File::mkdir(dirname($fsPath));
         }
         if (is_file($fsPath)) {
             @unlink($fsPath);
         }
         $converter = \Pimcore\Video::getInstance();
         $converter->load($asset->getFileSystemPath());
         $converter->setAudioBitrate($config->getAudioBitrate());
         $converter->setVideoBitrate($config->getVideoBitrate());
         $converter->setFormat($format);
         $converter->setDestinationFile($tmpPath);
         $converter->setStorageFile($fsPath);
         $transformations = $config->getItems();
         if (is_array($transformations) && count($transformations) > 0) {
             foreach ($transformations as $transformation) {
                 if (!empty($transformation)) {
                     $arguments = [];
                     $mapping = self::$argumentMapping[$transformation["method"]];
                     if (is_array($transformation["arguments"])) {
                         foreach ($transformation["arguments"] as $key => $value) {
                             $position = array_search($key, $mapping);
                             if ($position !== false) {
                                 $arguments[$position] = $value;
                             }
                         }
                     }
                     ksort($arguments);
                     if (count($mapping) == count($arguments)) {
                         call_user_func_array([$converter, $transformation["method"]], $arguments);
                     } else {
                         $message = "Video Transform failed: cannot call method `" . $transformation["method"] . "´ with arguments `" . implode(",", $arguments) . "´ because there are too few arguments";
                         Logger::error($message);
                     }
                 }
             }
         }
         $instance->queue[] = $converter;
     }
     $customSetting = $asset->getCustomSetting("thumbnails");
     $customSetting = is_array($customSetting) ? $customSetting : [];
     $customSetting[$config->getName()] = ["status" => "inprogress", "formats" => $existingFormats, "processId" => $instance->getProcessId()];
     $asset->setCustomSetting("thumbnails", $customSetting);
     $asset->save();
     $instance->convert();
     return $instance;
 }
Example #2
0
 /**
  * @static
  * @param Asset_Video $asset
  * @param Asset_Video_Thumbnail_Config $config
  */
 public static function process(Asset_Video $asset, $config)
 {
     if (!Pimcore_Video::isAvailable()) {
         throw new Exception("No ffmpeg executable found, please configure the correct path in the system settings");
     }
     $instance = new self();
     $formats = array("mp4", "webm", "f4v");
     $instance->setProcessId(uniqid());
     $instance->setAssetId($asset->getId());
     $instance->setConfig($config);
     // check for running or already created thumbnails
     $customSetting = $asset->getCustomSetting("thumbnails");
     $existingFormats = array();
     if (is_array($customSetting) && array_key_exists($config->getName(), $customSetting)) {
         if ($customSetting[$config->getName()]["status"] == "inprogress") {
             if (is_file($instance->getJobFile($customSetting[$config->getName()]["processId"]))) {
                 return;
             }
         } else {
             if ($customSetting[$config->getName()]["status"] == "finished") {
                 // check if the files are there
                 $formatsToConvert = array();
                 foreach ($formats as $f) {
                     if (!is_file(PIMCORE_DOCUMENT_ROOT . $customSetting[$config->getName()]["formats"][$f])) {
                         $formatsToConvert[] = $f;
                     } else {
                         $existingFormats[$f] = $customSetting[$config->getName()]["formats"][$f];
                     }
                 }
                 if (!empty($formatsToConvert)) {
                     $formats = $formatsToConvert;
                 } else {
                     return;
                 }
             }
         }
     }
     foreach ($formats as $format) {
         $filename = "video_" . $asset->getId() . "__" . $config->getName() . "." . $format;
         $fsPath = PIMCORE_TEMPORARY_DIRECTORY . "/" . $filename;
         if (is_file($fsPath)) {
             @unlink($fsPath);
         }
         $converter = Pimcore_Video::getInstance();
         $converter->load($asset->getFileSystemPath());
         $converter->setAudioBitrate($config->getAudioBitrate());
         $converter->setVideoBitrate($config->getVideoBitrate());
         $converter->setFormat($format);
         $converter->setDestinationFile($fsPath);
         $transformations = $config->getItems();
         if (is_array($transformations) && count($transformations) > 0) {
             foreach ($transformations as $transformation) {
                 if (!empty($transformation)) {
                     $arguments = array();
                     $mapping = self::$argumentMapping[$transformation["method"]];
                     if (is_array($transformation["arguments"])) {
                         foreach ($transformation["arguments"] as $key => $value) {
                             $position = array_search($key, $mapping);
                             if ($position !== false) {
                                 $arguments[$position] = $value;
                             }
                         }
                     }
                     ksort($arguments);
                     if (count($mapping) == count($arguments)) {
                         call_user_func_array(array($converter, $transformation["method"]), $arguments);
                     } else {
                         $message = "Video Transform failed: cannot call method `" . $transformation["method"] . "´ with arguments `" . implode(",", $arguments) . "´ because there are too few arguments";
                         Logger::error($message);
                     }
                 }
             }
         }
         $instance->queue[] = $converter;
     }
     $customSetting = $asset->getCustomSetting("thumbnails");
     $customSetting = is_array($customSetting) ? $customSetting : array();
     $customSetting[$config->getName()] = array("status" => "inprogress", "formats" => $existingFormats, "processId" => $instance->getProcessId());
     $asset->setCustomSetting("thumbnails", $customSetting);
     $asset->save();
     $instance->convert();
     return $instance;
 }