/** * @param flavorAsset $flavorAsset * @return string */ public function getFlavorAssetUrl(flavorAsset $flavorAsset) { $entry = $flavorAsset->getentry(); $partnerId = $entry->getPartnerId(); $subpId = $entry->getSubpId(); $flavorAssetId = $flavorAsset->getId(); $partnerPath = myPartnerUtils::getUrlForPartner($partnerId, $subpId); $this->setFileExtension($flavorAsset->getFileExt()); $url = "/s{$partnerPath}/serveFlavor/flavorId/{$flavorAssetId}"; if ($this->clipTo) { $url .= "/clipTo/{$this->clipTo}"; } if ($this->extention) { $url .= "/name/{$flavorAssetId}.{$this->extention}"; } $url = str_replace('\\', '/', $url); if ($this->protocol != StorageProfile::PLAY_FORMAT_RTMP) { $url .= '?novar=0'; $url .= '&e=' . (time() + 120); $secret = $this->getMediaVault(); $fullUrl = $this->protocol . '://' . $this->domain . $url; $url .= '&h=' . md5($secret . $fullUrl); $syncKey = $flavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $seekFromBytes = $this->getSeekFromBytes(kFileSyncUtils::getLocalFilePathForKey($syncKey)); if ($seekFromBytes) { $url .= '&fs=' . $seekFromBytes; } } else { $url .= '/forceproxy/true'; } return $url; }
protected function doGetFlavorAssetUrl(flavorAsset $flavorAsset) { $partnerId = $flavorAsset->getPartnerId(); $flavorAssetId = $flavorAsset->getId(); $versionString = $this->getFlavorVersionString($flavorAsset); return "/p/{$partnerId}/serveFlavor{$versionString}/flavorId/{$flavorAssetId}"; }
/** * @param flavorAsset $flavorAsset * @return string */ protected function doGetFlavorAssetUrl(flavorAsset $flavorAsset) { $entry = $flavorAsset->getentry(); $partnerId = $entry->getPartnerId(); $subpId = $entry->getSubpId(); $flavorAssetId = $flavorAsset->getId(); $partnerPath = myPartnerUtils::getUrlForPartner($partnerId, $subpId); $this->setFileExtension($flavorAsset->getFileExt()); $versionString = $this->getFlavorVersionString($flavorAsset); $url = "/s{$partnerPath}/serveFlavor/entryId/" . $flavorAsset->getEntryId() . "{$versionString}/flavorId/{$flavorAssetId}"; if ($this->clipTo) { $url .= "/clipTo/{$this->clipTo}"; } if ($this->extention) { $url .= "/name/a.{$this->extention}"; } $url = str_replace('\\', '/', $url); if ($this->protocol != StorageProfile::PLAY_FORMAT_RTMP) { $url .= '?novar=0'; $syncKey = $flavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $seekFromBytes = $this->getSeekFromBytes(kFileSyncUtils::getLocalFilePathForKey($syncKey)); if ($seekFromBytes) { $url .= '&fs=' . $seekFromBytes; } } else { if ($this->extention && strtolower($this->extention) != 'flv' || $this->containerFormat && strtolower($this->containerFormat) != 'flash video') { $url = "mp4:{$url}"; } } return $url; }
protected function doGetFlavorAssetUrl(flavorAsset $flavorAsset) { $syncKey = $flavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $fileSync = kFileSyncUtils::getReadyInternalFileSyncForKey($syncKey); $url = $this->getFileSyncUrl($fileSync); $url = $this->formatByExtension($url, false); return $url; }
/** * @param int $partnerId * @param string $entryId * @param string $msg * @return flavorAsset */ public static function createOriginalFlavorAsset($partnerId, $entryId, &$msg = null) { $flavorAsset = flavorAssetPeer::retrieveOriginalByEntryId($entryId); if ($flavorAsset) { $flavorAsset->incrementVersion(); $flavorAsset->save(); return $flavorAsset; } $entry = entryPeer::retrieveByPK($entryId); if (!$entry) { KalturaLog::err("Entry [{$entryId}] not found"); return null; } // creates the flavor asset $flavorAsset = new flavorAsset(); $flavorAsset->setStatus(flavorAsset::FLAVOR_ASSET_STATUS_QUEUED); $flavorAsset->incrementVersion(); $flavorAsset->setIsOriginal(true); $flavorAsset->setPartnerId($partnerId); $flavorAsset->setEntryId($entryId); // // 2010-11-08 - Solved by Tan-Tan in DocumentCreatedHandler::objectAdded // // 2010-10-17 - Hotfix by Dor - source document asset with no conversion profile should be in status READY // if ($entry->getType() == entryType::DOCUMENT) // { // if (is_null($entry->conversionProfileId)) // { // $flavorAsset->setStatus(flavorAsset::FLAVOR_ASSET_STATUS_READY); // } // } // // ----- hotfix end $flavorAsset->save(); return $flavorAsset; }
/** * @param flavorAsset $flavor * @param StorageProfile $externalStorage */ protected function exportFlavorAsset(flavorAsset $flavor, StorageProfile $externalStorage) { $flavorParamsIds = $externalStorage->getFlavorParamsIds(); KalturaLog::log(__METHOD__ . " flavorParamsIds [{$flavorParamsIds}]"); if (!is_null($flavorParamsIds) && strlen(trim($flavorParamsIds))) { $flavorParamsArr = explode(',', $flavorParamsIds); if (!in_array($flavor->getFlavorParamsId(), $flavorParamsArr)) { return; } } $key = $flavor->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $this->export($flavor->getentry(), $externalStorage, $key, !$flavor->getIsOriginal()); return true; }
/** * @param flavorAsset $object * @return bool true if should continue to the next consumer */ private function addedFlavorAsset(flavorAsset $object) { if ($object instanceof flavorAsset && $object->getIsOriginal()) { if ($this->saveIfShouldScan($object)) { $profile = self::$flavorAssetIdsToScan[$object->getId()]; // suitable virus scan profile found - create scan job $syncKey = $object->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $srcFilePath = kFileSyncUtils::getLocalFilePathForKey($syncKey); kVirusScanJobsManager::addVirusScanJob(null, $object->getPartnerId(), $object->getEntryId(), $object->getId(), $srcFilePath, $profile->getEngineType(), $profile->getActionIfInfected()); return false; // pause other event consumers until virus scan job is finished } } return true; // no scan jobs to do, object added event consumption may continue normally }
public function generateFileName($sub_type, $version = null) { if ($sub_type != self::FILE_SYNC_ASSET_SUB_TYPE_LIVE_PRIMARY && $sub_type != self::FILE_SYNC_ASSET_SUB_TYPE_LIVE_SECONDARY) { return parent::generateFileName($sub_type, $version); } return $this->getEntryId() . "_" . $this->getId() . "_{$sub_type}_{$version}"; }
protected function doGetFlavorAssetUrl(flavorAsset $flavorAsset) { if (strpos($flavorAsset->getTags(), flavorParams::TAG_APPLEMBR) === FALSE) { $url = $this->getBaseUrl($flavorAsset); if ($this->params->getClipTo()) { $url .= "/clipTo/" . $this->params->getClipTo(); } // we use index_0_av.m3u8 instead of master.m3u8 as temporary solution to overcome // an extra "redirection" done on the part of akamai. // the auto created master.m3u8 file contains a single item playlist to the index_0_av.m3u8 file // this extra "redirection" fails return $this->formatHdIos($url); } else { KalturaLog::err("@_!! WE DO GET TO THE ELSE"); return parent::doGetFlavorAssetUrl($flavorAsset); } }
/** * @param flavorAsset $flavorAsset * @return string */ public function getFlavorAssetUrl(flavorAsset $flavorAsset) { $partnerId = $flavorAsset->getPartnerId(); $subpId = $flavorAsset->getentry()->getSubpId(); $flavorAssetId = $flavorAsset->getId(); $partnerPath = myPartnerUtils::getUrlForPartner($partnerId, $subpId); $this->setFileExtension($flavorAsset->getFileExt()); $this->setContainerFormat($flavorAsset->getContainerFormat()); $url = "{$partnerPath}/serveFlavor/flavorId/{$flavorAssetId}"; if ($this->protocol == StorageProfile::PLAY_FORMAT_APPLE_HTTP) { if (strpos($flavorAsset->getTags(), flavorParams::TAG_APPLEMBR) === FALSE) { $url = "http://" . @$this->params['hd_ios'] . "/i" . $url . "/index_0_av.m3u8"; } else { $url .= "/file/playlist.m3u8"; } } else { if ($this->clipTo) { $url .= "/clipTo/{$this->clipTo}"; } if ($this->extention) { $url .= "/name/{$flavorAssetId}.{$this->extention}"; } if ($this->protocol == StorageProfile::PLAY_FORMAT_RTMP) { $url .= '/forceproxy/true'; if ($this->extention && strtolower($this->extention) != 'flv' || $this->containerFormat && strtolower($this->containerFormat) != 'flash video') { $url = "mp4:{$url}"; } } else { if ($this->seekFromTime > 0) { $url .= '?aktimeoffset=' . floor($this->seekFromTime / 1000); } } } if ($this->protocol == "hdnetworksmil") { $url = "http://" . $this->params["hd_flash"] . $url; } $url = str_replace('\\', '/', $url); if ($this->protocol == StorageProfile::PLAY_FORMAT_HTTP && @$this->params['http_auth_salt']) { $window = $this->params['http_auth_seconds']; $param = $this->params['http_auth_param']; $salt = $this->params['http_auth_salt']; $root_dir = $this->params['http_auth_root_dir']; $url = $this->urlauth_gen_url($root_dir . $url, $param, $window, $salt, null, null); } return $url; }
/** * @param flavorAsset $flavorAsset * @return string */ protected function doGetFlavorAssetUrl(flavorAsset $flavorAsset) { $partnerId = $flavorAsset->getPartnerId(); $subpId = $flavorAsset->getentry()->getSubpId(); $flavorAssetId = $flavorAsset->getId(); $partnerPath = myPartnerUtils::getUrlForPartner($partnerId, $subpId); $this->setFileExtension($flavorAsset->getFileExt()); $this->setContainerFormat($flavorAsset->getContainerFormat()); $versionString = $this->getFlavorVersionString($flavorAsset); $url = "{$partnerPath}/serveFlavor/entryId/" . $flavorAsset->getEntryId() . "{$versionString}/flavorId/{$flavorAssetId}"; if ($this->protocol == StorageProfile::PLAY_FORMAT_RTSP) { return $url; } if ($this->protocol == StorageProfile::PLAY_FORMAT_APPLE_HTTP) { if (strpos($flavorAsset->getTags(), flavorParams::TAG_APPLEMBR) === FALSE) { // we use index_0_av.m3u8 instead of master.m3u8 as temporary solution to overcome // an extra "redirection" done on the part of akamai. // the auto created master.m3u8 file contains a single item playlist to the index_0_av.m3u8 file // this extra "redirection" fails $url = "http://" . @$this->params['hd_ios'] . "/i" . $url . "/index_0_av.m3u8"; } else { $url .= "/file/playlist.m3u8"; } } else { if ($this->clipTo) { $url .= "/clipTo/{$this->clipTo}"; } if ($this->protocol == "hdnetworksmil") { $url = "http://" . $this->params["hd_flash"] . $url . '/forceproxy/true'; } else { if ($this->protocol == StorageProfile::PLAY_FORMAT_RTMP) { $url .= '/forceproxy/true'; $url = trim($url, "/"); if ($this->extention && strtolower($this->extention) != 'flv' || $this->containerFormat && strtolower($this->containerFormat) != 'flash video') { $url = "mp4:{$url}"; } } else { if ($this->extention) { $url .= "/name/a.{$this->extention}"; } if ($this->seekFromTime > 0) { $fromTime = floor($this->seekFromTime / 1000); /* * Akamai servers fail to return subset of the last second of the video. * The URL will return the two last seconds of the video in such cases. **/ $entry = $flavorAsset->getentry(); if ($entry && $fromTime > $entry->getDurationInt() - 1) { $fromTime -= 1; } $url .= "?aktimeoffset={$fromTime}"; } } } } $url = str_replace('\\', '/', $url); return $url; }
/** * @param asset $asset * @params entry $entry * @return string */ public static function getFileName(entry $entry, flavorAsset $flavorAsset = null) { $fileExt = ""; $fileBaseName = $entry->getName(); if ($flavorAsset) { $flavorParams = $flavorAsset->getFlavorParams(); if ($flavorParams) { $fileBaseName = $fileBaseName . " (" . $flavorParams->getName() . ")"; } $fileExt = $flavorAsset->getFileExt(); } else { $syncKey = $entry->getSyncKey(entry::FILE_SYNC_ENTRY_SUB_TYPE_DATA); list($fileSync, $local) = kFileSyncUtils::getReadyFileSyncForKey($syncKey, true, false); if ($fileSync) { $fileExt = $fileSync->getFileExt(); } } return array($fileBaseName, $fileExt); }
public static function getReadyBehavior(flavorAsset $flavorAsset) { if ($flavorAsset->getIsOriginal()) { try { $profile = myPartnerUtils::getConversionProfile2ForEntry($flavorAsset->getEntryId()); if ($profile) { $flavorParamsConversionProfile = flavorParamsConversionProfilePeer::retrieveByFlavorParamsAndConversionProfile($flavorAsset->getFlavorParamsId(), $profile->getId()); if ($flavorParamsConversionProfile) { return $flavorParamsConversionProfile->getReadyBehavior(); } } } catch (Exception $e) { KalturaLog::err('getConversionProfile2ForEntry Error: ' . $e->getMessage()); } } $targetFlavor = flavorParamsOutputPeer::retrieveByFlavorAssetId($flavorAsset->getId()); if ($targetFlavor) { return $targetFlavor->getReadyBehavior(); } return flavorParamsConversionProfile::READY_BEHAVIOR_INHERIT_FLAVOR_PARAMS; }
/** * @param flavorAsset $flavorAsset * @return string */ public function getFlavorAssetUrl(flavorAsset $flavorAsset) { $entry = $flavorAsset->getentry(); $partnerId = $entry->getPartnerId(); $subpId = $entry->getSubpId(); $flavorAssetId = $flavorAsset->getId(); $partnerPath = myPartnerUtils::getUrlForPartner($partnerId, $subpId); $this->setFileExtension($flavorAsset->getFileExt()); $url = "{$partnerPath}/serveFlavor/flavorId/{$flavorAssetId}"; if ($this->clipTo) { $url .= "/clipTo/{$this->clipTo}"; } if ($this->extention) { $url .= "/name/{$flavorAssetId}.{$this->extention}"; } if ($this->protocol != StorageProfile::PLAY_FORMAT_RTMP) { $url .= '?novar=0'; if ($entry->getSecurityPolicy()) { $url = "/s{$url}"; // set expire time in GMT hence the date("Z") offset $url .= "&nva=" . strftime("%Y%m%d%H%M%S", time() - date("Z") + 30); $secret = kConf::get("level3_authentication_key"); $hash = "0" . substr(self::hmac('sha1', $secret, $url), 0, 20); $url .= "&h={$hash}"; } $syncKey = $flavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $seekFromBytes = $this->getSeekFromBytes(kFileSyncUtils::getLocalFilePathForKey($syncKey)); if ($seekFromBytes) { $url .= '&start=' . $seekFromBytes; } } else { $url .= '/forceproxy/true'; } $url = str_replace('\\', '/', $url); return $url; }
/** * @param int $partnerId * @param string $entryId * @param string $msg * @return flavorAsset */ public static function createOriginalFlavorAsset($partnerId, $entryId, &$msg = null) { $flavorAsset = assetPeer::retrieveOriginalByEntryId($entryId); if ($flavorAsset) { // $flavorAsset->incrementVersion(); $flavorAsset->save(); return $flavorAsset; } $entry = entryPeer::retrieveByPK($entryId); if (!$entry) { KalturaLog::err("Entry [{$entryId}] not found"); return null; } // creates the flavor asset $flavorAsset = new flavorAsset(); $flavorAsset->setStatus(flavorAsset::FLAVOR_ASSET_STATUS_QUEUED); $flavorAsset->incrementVersion(); $flavorAsset->setIsOriginal(true); $flavorAsset->setPartnerId($partnerId); $flavorAsset->setEntryId($entryId); $flavorAsset->save(); return $flavorAsset; }
/** * @param flavorAsset $flavorAsset * @return boolean true if the given flavor asset is configured to be exported or false otherwise */ public function shouldExportFlavorAsset(flavorAsset $flavorAsset) { $shouldExport = null; // check if flavor params id is in the list to export $flavorParamsIdsToExport = $this->getFlavorParamsIds(); KalturaLog::log(__METHOD__ . " flavorParamsIds [{$flavorParamsIdsToExport}]"); if (is_null($flavorParamsIdsToExport) || strlen(trim($flavorParamsIdsToExport)) == 0) { // all flavor assets should be exported $shouldExport = true; } else { $flavorParamsIdsToExport = array_map('trim', explode(',', $flavorParamsIdsToExport)); if (in_array($flavorAsset->getFlavorParamsId(), $flavorParamsIdsToExport)) { // flavor set to export $shouldExport = true; } else { // flavor not set to export $shouldExport = false; } } // check if flavor fits the export rules defined on the profile if ($shouldExport) { $key = $flavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $shouldExport = kStorageExporter::shouldExport($key, $this); if (!$shouldExport) { KalturaLog::log("no need to export key [{$key}] to externalStorage id[" . $this->getId() . "]"); } } return $shouldExport; }
/** * Check if flavor asset id set for export on the storage profile * * @param flavorAsset $flavorAsset */ protected function isFlavorAssetConfiguredForExport(flavorAsset $flavorAsset) { $configuredForExport = null; // check if flavor params id is in the list to export $flavorParamsIdsToExport = $this->getFlavorParamsIds(); KalturaLog::log(__METHOD__ . " flavorParamsIds [{$flavorParamsIdsToExport}]"); if (is_null($flavorParamsIdsToExport) || strlen(trim($flavorParamsIdsToExport)) == 0) { // all flavor assets should be exported $configuredForExport = true; } else { $flavorParamsIdsToExport = array_map('trim', explode(',', $flavorParamsIdsToExport)); if (in_array($flavorAsset->getFlavorParamsId(), $flavorParamsIdsToExport)) { // flavor set to export $configuredForExport = true; } else { // flavor not set to export $configuredForExport = false; } } return $configuredForExport; }
private function getFlavorHttpUrl(flavorAsset $flavorAsset) { $syncKey = $flavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $externalStorageUrl = $this->getExternalStorageUrl($flavorAsset, $syncKey); if ($externalStorageUrl) { return $externalStorageUrl; } if ($this->storageId) { // must be specific external storage return null; } $partner = $this->entry->getPartner(); if ($partner && $partner->getStorageServePriority() == StorageProfile::STORAGE_SERVE_PRIORITY_EXTERNAL_ONLY) { return null; } $urlManager = kUrlManager::getUrlManagerByCdn($this->cdnHost); $urlManager->setClipTo($this->clipTo); $urlManager->setSeekFromTime($this->seekFrom); $urlManager->setDomain($this->cdnHost); $urlManager->setProtocol($this->format); $url = $urlManager->getFlavorAssetUrl($flavorAsset); if (strpos($url, "/") === 0) { $url = $this->cdnHost . $url; } $url = preg_replace('/^https?:\\/\\//', '', $url); return $this->protocol . '://' . $url; }
private function getSyncKeyAndForFlavorAsset(entry $entry, flavorAsset $flavorAsset) { $syncKey = $flavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); return $syncKey; }
public static function ConvertMediainfoCdl2FlavorAsset(mediaInfo $cdlMediaInfo, flavorAsset &$fla) { KalturaLog::log(__METHOD__ . "==>"); KalturaLog::log("\nCDL mediaInfo==>\n" . print_r($cdlMediaInfo, true)); /* $flavorAsset->setWidth($mediaInfoDb->getVideoWidth()); $flavorAsset->setHeight($mediaInfoDb->getVideoHeight()); $flavorAsset->setFrameRate($mediaInfoDb->getVideoFrameRate()); $flavorAsset->setBitrate($mediaInfoDb->getContainerBitRate()); $flavorAsset->setSize($mediaInfoDb->getFileSize()); $flavorAsset->setContainerFormat($mediaInfoDb->getContainerFormat()); $flavorAsset->setVideoCodecId($mediaInfoDb->getVideoCodecId()); */ $medSet = new KDLMediaDataSet(); self::ConvertMediainfoCdl2Mediadataset($cdlMediaInfo, $medSet); KalturaLog::log("\nKDL mediaDataSet==>\n" . print_r($medSet, true)); // $fla = new flavorAsset(); if (!is_null($medSet->_container)) { $fla->setContainerFormat($medSet->_container->GetIdOrFormat()); } $fla->setSize($cdlMediaInfo->getFileSize()); $vidBr = 0; if ($medSet->_video) { $fla->setWidth($medSet->_video->_width); $fla->setHeight($medSet->_video->_height); $fla->setFrameRate($medSet->_video->_frameRate); $vidBr = $medSet->_video->_bitRate; $fla->setVideoCodecId($medSet->_video->GetIdOrFormat()); } if ($vidBr == 0) { $fla->setBitrate($medSet->_container->_bitRate); } else { $fla->setBitrate($vidBr); } KalturaLog::log("\nCDL fl.Asset==>\n" . print_r($fla, true)); return $fla; }
/** * * @param $flavorAsset * @param $con * * @return flavorParamsOutput */ public static function retrieveByFlavorAsset(flavorAsset $flavorAsset, $con = null) { return self::retrieveByFlavorAssetId($flavorAsset->getId(), $flavorAsset->getVersion(), $con); }
/** * @param string $url * @param string $urlPrefix * @param flavorAsset|flavorParams $flavor * @return array */ protected function getFlavorAssetInfo($url, $urlPrefix = '', $flavor = null) { $ext = null; $audioLanguage = null; $audioLanguageName = null; if ($flavor) { if (is_callable(array($flavor, 'getFileExt'))) { $ext = $flavor->getFileExt(); } //Extract the audio language code from flavor if ($flavor->hasTag(assetParams::TAG_AUDIO_ONLY)) { $audioLanguageData = $this->getAudioLanguage($flavor); if (!$audioLanguageData) { $audioLanguage = 'und'; $audioLanguageName = 'Undefined'; } else { list($audioLanguage, $audioLanguageName) = $audioLanguageData; } } } if (!$ext) { if ($urlPrefix && $url) { $urlPrefix = $urlPrefix . "/"; } $urlPath = parse_url($urlPrefix . $url, PHP_URL_PATH); $ext = pathinfo($urlPath, PATHINFO_EXTENSION); } $bitrate = $flavor ? $flavor->getVideoBitrate() : 0; $width = $flavor ? $flavor->getWidth() : 0; $height = $flavor ? $flavor->getHeight() : 0; return array('url' => $url, 'urlPrefix' => $urlPrefix, 'ext' => $ext, 'bitrate' => $bitrate, 'width' => $width, 'height' => $height, 'audioLanguage' => $audioLanguage, 'audioLanguageName' => $audioLanguageName); }
/** * @param flavorAsset $originalFlavorAsset * @param entry $entry * @param BatchJob $convertProfileJob * @return BatchJob */ public static function bypassConversion(flavorAsset $originalFlavorAsset, entry $entry, BatchJob $convertProfileJob) { if (!$originalFlavorAsset->hasTag(flavorParams::TAG_MBR)) { $mediaInfo = mediaInfoPeer::retrieveByFlavorAssetId($originalFlavorAsset->getId()); if ($mediaInfo) { $tagsArray = $originalFlavorAsset->getTagsArray(); $finalTagsArray = KDLWrap::CDLMediaInfo2Tags($mediaInfo, $tagsArray); $originalFlavorAsset->setTagsArray($finalTagsArray); } } if (!$entry->getCreateThumb()) { // mark the asset as ready $originalFlavorAsset->setStatusLocalReady(); $originalFlavorAsset->save(); kFlowHelper::generateThumbnailsFromFlavor($entry->getId(), null, $originalFlavorAsset->getFlavorParamsId()); kBusinessPostConvertDL::handleConvertFinished(null, $originalFlavorAsset); return null; } $offset = $entry->getThumbOffset(); // entry getThumbOffset now takes the partner DefThumbOffset into consideration $srcSyncKey = $originalFlavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $srcFileSyncLocalPath = kFileSyncUtils::getLocalFilePathForKey($srcSyncKey); $srcFileSyncWamsAssetId = kFileSyncUtils::getWamsAssetIdForKey($srcSyncKey); $postConvertAssetType = BatchJob::POSTCONVERT_ASSET_TYPE_BYPASS; return kJobsManager::addPostConvertJob($convertProfileJob, $postConvertAssetType, $srcFileSyncLocalPath, $originalFlavorAsset->getId(), null, true, $offset, null, $srcFileSyncWamsAssetId); }
/** * @param BatchJob $parentJob * @param flavorAsset $asset * @param array $files * @return BatchJob */ public static function addConcatJob(BatchJob $parentJob = null, flavorAsset $asset, array $files, $offset = null, $duration = null) { $jobData = new kConcatJobData(); $jobData->setSrcFiles($files); $jobData->setFlavorAssetId($asset->getId()); $jobData->setOffset($offset); $jobData->setDuration($duration); $entry = $asset->getentry(); if ($entry && $entry->getStatus() != entryStatus::READY) { $entry->setStatus(entryStatus::PRECONVERT); $entry->save(); } $batchJob = null; if ($parentJob) { $batchJob = $parentJob->createChild(BatchJobType::CONCAT); } else { $batchJob = new BatchJob(); $batchJob->setPartnerId($asset->getPartnerId()); } $batchJob->setEntryId($asset->getEntryId()); $batchJob->setObjectId($jobData->getFlavorAssetId()); $batchJob->setObjectType(BatchJobObjectType::ASSET); return self::addJob($batchJob, $jobData, BatchJobType::CONCAT); }
public static function ConvertMediainfoCdl2FlavorAsset(mediaInfo $cdlMediaInfo, flavorAsset &$fla) { KalturaLog::log("==>"); KalturaLog::log("\nCDL mediaInfo==>\n" . print_r($cdlMediaInfo, true)); $medSet = new KDLMediaDataSet(); self::ConvertMediainfoCdl2Mediadataset($cdlMediaInfo, $medSet); KalturaLog::log("\nKDL mediaDataSet==>\n" . print_r($medSet, true)); $contBr = 0; if (isset($medSet->_container)) { $fla->setContainerFormat($medSet->_container->GetIdOrFormat()); $contBr = $medSet->_container->_bitRate; } $fla->setSize($cdlMediaInfo->getFileSize()); $vidBr = 0; if (isset($medSet->_video)) { $fla->setWidth($medSet->_video->_width); $fla->setHeight($medSet->_video->_height); $fla->setFrameRate($medSet->_video->_frameRate); $vidBr = $medSet->_video->_bitRate; $fla->setVideoCodecId($medSet->_video->GetIdOrFormat()); } $audBr = 0; if (isset($medSet->_audio)) { $audBr = $medSet->_audio->_bitRate; } /* * Evaluate the asset br. * Prevously it was taken from video, if t was available. */ $assetBr = max($contBr, $vidBr + $audBr); $fla->setBitrate($assetBr); KalturaLog::log("\nCDL fl.Asset==>\n" . print_r($fla, true)); return $fla; }
private static function shouldConvertProfileFlavors(conversionProfile2 $profile, mediaInfo $mediaInfo = null, flavorAsset $originalFlavorAsset) { $shouldConvert = true; if ($profile->getCreationMode() == conversionProfile2::CONVERSION_PROFILE_2_CREATION_MODE_AUTOMATIC_BYPASS_FLV) { KalturaLog::log("The profile created from old conversion profile with bypass flv"); $isFlv = false; if ($mediaInfo) { $isFlv = KDLWrap::CDLIsFLV($mediaInfo); } if ($isFlv && $originalFlavorAsset->hasTag(flavorParams::TAG_MBR)) { KalturaLog::log("The source is mbr and flv, conversion will be bypassed"); $shouldConvert = false; } else { KalturaLog::log("The source is NOT mbr or flv, conversion will NOT be bypassed"); } } return $shouldConvert; }
protected function addEntryFromFlavorAsset(KalturaBaseEntry $newEntry, entry $srcEntry, flavorAsset $srcFlavorAsset) { $newEntry->type = $srcEntry->getType(); if ($newEntry->name === null) { $newEntry->name = $srcEntry->getName(); } if ($newEntry->description === null) { $newEntry->description = $srcEntry->getDescription(); } if ($newEntry->creditUrl === null) { $newEntry->creditUrl = $srcEntry->getSourceLink(); } if ($newEntry->creditUserName === null) { $newEntry->creditUserName = $srcEntry->getCredit(); } if ($newEntry->tags === null) { $newEntry->tags = $srcEntry->getTags(); } $newEntry->sourceType = KalturaSourceType::SEARCH_PROVIDER; $newEntry->searchProviderType = KalturaSearchProviderType::KALTURA; $dbEntry = $this->prepareEntryForInsert($newEntry); $dbEntry->setSourceId($srcEntry->getId()); $kshow = $this->createDummyKShow(); $kshowId = $kshow->getId(); $msg = null; $flavorAsset = kFlowHelper::createOriginalFlavorAsset($this->getPartnerId(), $dbEntry->getId(), $msg); if (!$flavorAsset) { KalturaLog::err("Flavor asset not created for entry [" . $dbEntry->getId() . "] reason [{$msg}]"); if ($dbEntry->getStatus() == entryStatus::NO_CONTENT) { $dbEntry->setStatus(entryStatus::ERROR_CONVERTING); $dbEntry->save(); } throw new KalturaAPIException(KalturaErrors::ORIGINAL_FLAVOR_ASSET_NOT_CREATED, $msg); } $srcSyncKey = $srcFlavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $newSyncKey = $flavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); kFileSyncUtils::createSyncFileLinkForKey($newSyncKey, $srcSyncKey); kEventsManager::raiseEvent(new kObjectAddedEvent($flavorAsset)); myNotificationMgr::createNotification(kNotificationJobData::NOTIFICATION_TYPE_ENTRY_ADD, $dbEntry); $newEntry->fromObject($dbEntry, $this->getResponseProfile()); return $newEntry; }
/** * @param BatchJob $dbBatchJob * @param flavorAsset $currentFlavorAsset * @return BatchJob */ public static function handleConvertFinished(BatchJob $dbBatchJob = null, flavorAsset $currentFlavorAsset) { KalturaLog::debug("entry id [" . $currentFlavorAsset->getEntryId() . "] flavor asset id [" . $currentFlavorAsset->getId() . "]"); $profile = null; try { $profile = myPartnerUtils::getConversionProfile2ForEntry($currentFlavorAsset->getEntryId()); KalturaLog::debug("profile [" . $profile->getId() . "]"); } catch (Exception $e) { KalturaLog::err($e->getMessage()); } $currentReadyBehavior = self::getReadyBehavior($currentFlavorAsset, $profile); KalturaLog::debug("Current ready behavior [{$currentReadyBehavior}]"); if ($currentReadyBehavior == flavorParamsConversionProfile::READY_BEHAVIOR_IGNORE) { return $dbBatchJob; } $rootBatchJob = null; if ($dbBatchJob) { $rootBatchJob = $dbBatchJob->getRootJob(); } if ($rootBatchJob) { KalturaLog::debug("root batch job id [" . $rootBatchJob->getId() . "] type [" . $rootBatchJob->getJobType() . "]"); } // update the root job end exit if ($rootBatchJob && $rootBatchJob->getJobType() == BatchJobType::BULKDOWNLOAD) { $siblingJobs = $rootBatchJob->getChildJobs(); foreach ($siblingJobs as $siblingJob) { // checking only conversion child jobs if ($siblingJob->getJobType() != BatchJobType::CONVERT && $siblingJob->getJobType() != BatchJobType::CONVERT_COLLECTION && $siblingJob->getJobType() != BatchJobType::POSTCONVERT) { continue; } // if not complete leave function if (!in_array($siblingJob->getStatus(), BatchJobPeer::getClosedStatusList())) { KalturaLog::debug("job id [" . $siblingJob->getId() . "] status [" . $siblingJob->getStatus() . "]"); return $dbBatchJob; } } KalturaLog::debug("finish bulk download root job"); // all child jobs completed kJobsManager::updateBatchJob($rootBatchJob, BatchJob::BATCHJOB_STATUS_FINISHED); return $dbBatchJob; } $inheritedFlavorParamsIds = array(); $requiredFlavorParamsIds = array(); $flavorParamsConversionProfileItems = array(); if ($profile) { $flavorParamsConversionProfileItems = flavorParamsConversionProfilePeer::retrieveByConversionProfile($profile->getId()); } foreach ($flavorParamsConversionProfileItems as $flavorParamsConversionProfile) { if ($flavorParamsConversionProfile->getReadyBehavior() == flavorParamsConversionProfile::READY_BEHAVIOR_REQUIRED) { $requiredFlavorParamsIds[$flavorParamsConversionProfile->getFlavorParamsId()] = true; } if ($flavorParamsConversionProfile->getReadyBehavior() == flavorParamsConversionProfile::READY_BEHAVIOR_NO_IMPACT) { $inheritedFlavorParamsIds[] = $flavorParamsConversionProfile->getFlavorParamsId(); } } $flavorParamsItems = assetParamsPeer::retrieveByPKs($inheritedFlavorParamsIds); foreach ($flavorParamsItems as $flavorParams) { if ($flavorParams->getReadyBehavior() == flavorParamsConversionProfile::READY_BEHAVIOR_REQUIRED) { $requiredFlavorParamsIds[$flavorParamsConversionProfile->getFlavorParamsId()] = true; } } KalturaLog::debug("required flavor params ids [" . print_r($requiredFlavorParamsIds, true) . "]"); // go over all the flavor assets of the entry $inCompleteFlavorIds = array(); $origianlAssetFlavorId = null; $siblingFlavorAssets = assetPeer::retrieveFlavorsByEntryId($currentFlavorAsset->getEntryId()); foreach ($siblingFlavorAssets as $siblingFlavorAsset) { KalturaLog::debug("sibling flavor asset id [" . $siblingFlavorAsset->getId() . "] flavor params id [" . $siblingFlavorAsset->getFlavorParamsId() . "]"); // don't mark any incomplete flag if ($siblingFlavorAsset->getStatus() == flavorAsset::FLAVOR_ASSET_STATUS_READY) { KalturaLog::debug("sibling flavor asset id [" . $siblingFlavorAsset->getId() . "] is ready"); if (isset($requiredFlavorParamsIds[$siblingFlavorAsset->getFlavorParamsId()])) { unset($requiredFlavorParamsIds[$siblingFlavorAsset->getFlavorParamsId()]); } continue; } $readyBehavior = self::getReadyBehavior($siblingFlavorAsset, $profile); if ($siblingFlavorAsset->getStatus() == flavorAsset::ASSET_STATUS_EXPORTING) { if ($siblingFlavorAsset->getIsOriginal()) { $origianlAssetFlavorId = $siblingFlavorAsset->getFlavorParamsId(); } else { if ($readyBehavior != flavorParamsConversionProfile::READY_BEHAVIOR_IGNORE) { KalturaLog::debug("sibling flavor asset id [" . $siblingFlavorAsset->getId() . "] is incomplete"); $inCompleteFlavorIds[] = $siblingFlavorAsset->getFlavorParamsId(); } } } if ($readyBehavior == flavorParamsConversionProfile::READY_BEHAVIOR_IGNORE) { KalturaLog::debug("sibling flavor asset id [" . $siblingFlavorAsset->getId() . "] is ignored"); continue; } if ($siblingFlavorAsset->getStatus() == flavorAsset::FLAVOR_ASSET_STATUS_QUEUED || $siblingFlavorAsset->getStatus() == flavorAsset::FLAVOR_ASSET_STATUS_CONVERTING || $siblingFlavorAsset->getStatus() == flavorAsset::FLAVOR_ASSET_STATUS_IMPORTING || $siblingFlavorAsset->getStatus() == flavorAsset::FLAVOR_ASSET_STATUS_VALIDATING) { KalturaLog::debug("sibling flavor asset id [" . $siblingFlavorAsset->getId() . "] is incomplete"); $inCompleteFlavorIds[] = $siblingFlavorAsset->getFlavorParamsId(); } if ($readyBehavior == flavorParamsConversionProfile::READY_BEHAVIOR_REQUIRED) { KalturaLog::debug("sibling flavor asset id [" . $siblingFlavorAsset->getId() . "] is required"); $requiredFlavorParamsIds[$siblingFlavorAsset->getFlavorParamsId()] = true; } } KalturaLog::debug("left required flavor params ids [" . print_r($requiredFlavorParamsIds, true) . "]"); KalturaLog::debug("left incomplete flavor ids [" . print_r($inCompleteFlavorIds, true) . "]"); if (count($requiredFlavorParamsIds)) { $inCompleteRequiredFlavorParamsIds = array_keys($requiredFlavorParamsIds); foreach ($inCompleteRequiredFlavorParamsIds as $inCompleteFlavorId) { $inCompleteFlavorIds[] = $inCompleteFlavorId; } KalturaLog::debug('Convert Finished - has In-Complete Required flavors [[' . print_r($inCompleteRequiredFlavorParamsIds, true) . ']'); } elseif ($currentFlavorAsset->getStatus() == asset::ASSET_STATUS_READY && ($currentReadyBehavior == flavorParamsConversionProfile::READY_BEHAVIOR_OPTIONAL || $currentReadyBehavior == flavorParamsConversionProfile::READY_BEHAVIOR_REQUIRED)) { // mark the entry as ready if all required conversions completed or any of the optionals if ($currentFlavorAsset->getentry()->getReplacedEntryId()) { KalturaLog::debug('Entry is temporary replacement and requires all flavors to complete'); } else { KalturaLog::debug('Mark the entry as ready'); kBatchManager::updateEntry($currentFlavorAsset->getEntryId(), entryStatus::READY); } } if ($origianlAssetFlavorId) { $inCompleteFlavorIds = array_diff($inCompleteFlavorIds, array($origianlAssetFlavorId)); } if (!count($inCompleteFlavorIds)) { KalturaLog::debug('Convert Finished'); if ($origianlAssetFlavorId && $rootBatchJob && $rootBatchJob->getJobType() == BatchJobType::CONVERT_PROFILE) { kStorageExporter::exportSourceAssetFromJob($rootBatchJob); } else { // mark the context root job as finished only if all conversion jobs are completed kBatchManager::updateEntry($currentFlavorAsset->getEntryId(), entryStatus::READY); if ($rootBatchJob && $rootBatchJob->getJobType() == BatchJobType::CONVERT_PROFILE) { kJobsManager::updateBatchJob($rootBatchJob, BatchJob::BATCHJOB_STATUS_FINISHED); } } return $dbBatchJob; } KalturaLog::debug('Convert Finished - has In-Complete flavors [' . print_r($inCompleteFlavorIds, true) . ']'); if (!$rootBatchJob || $rootBatchJob->getJobType() != BatchJobType::CONVERT_PROFILE) { return $dbBatchJob; } $childJobs = $rootBatchJob->getChildJobs(); KalturaLog::debug('Child jobs found [' . count($childJobs) . ']'); if (count($childJobs) > 1) { $allDone = true; foreach ($childJobs as $childJob) { if ($childJob->getId() != $rootBatchJob->getId() && $childJob->getStatus() != BatchJob::BATCHJOB_STATUS_FINISHED) { KalturaLog::debug('Child job id [' . $childJob->getId() . '] status [' . $childJob->getStatus() . ']'); $allDone = false; } } if ($allDone) { KalturaLog::debug('All child jobs done, closing profile'); kJobsManager::updateBatchJob($rootBatchJob, BatchJob::BATCHJOB_STATUS_FINISHED); } } return $dbBatchJob; }
/** * @param flavorAsset $originalFlavorAsset * @param entry $entry * @param BatchJob $convertProfileJob * @return BatchJob */ public static function bypassConversion(flavorAsset $originalFlavorAsset, entry $entry, BatchJob $convertProfileJob) { if (!$originalFlavorAsset->hasTag(flavorParams::TAG_MBR)) { $mediaInfo = mediaInfoPeer::retrieveByFlavorAssetId($originalFlavorAsset->getId()); if ($mediaInfo) { $tagsArray = $originalFlavorAsset->getTagsArray(); $finalTagsArray = KDLWrap::CDLMediaInfo2Tags($mediaInfo, $tagsArray); $originalFlavorAsset->setTagsArray($finalTagsArray); } } $offset = $entry->getThumbOffset(); // entry getThumbOffset now takes the partner DefThumbOffset into consideration $srcSyncKey = $originalFlavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $srcFileSyncLocalPath = kFileSyncUtils::getLocalFilePathForKey($srcSyncKey); $jobSubType = BatchJob::BATCHJOB_SUB_TYPE_POSTCONVERT_BYPASS; return kJobsManager::addPostConvertJob($convertProfileJob, $jobSubType, $srcFileSyncLocalPath, $originalFlavorAsset->getId(), null, true, $offset); }
/** * @param flavorAsset $flavorAsset * @param FileSyncKey $key * @return array */ protected function getExternalStorageUrl(flavorAsset $flavorAsset) { $remoteFileSyncs = $this->params->getRemoteFileSyncs(); $fileSync = $remoteFileSyncs[$flavorAsset->getId()]; $this->initDeliveryDynamicAttributes($fileSync, $flavorAsset); $url = $this->getFileSyncUrl($fileSync, false); $url = ltrim($url, "/"); $urlPrefix = ''; if (strpos($url, "://") === false) { $urlPrefix = $this->getUrlPrefix(); $url = "/" . $url; } return $this->getFlavorAssetInfo($url, $urlPrefix, $flavorAsset); }