Пример #1
0
 /**
  * @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;
 }
Пример #2
0
 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;
 }
Пример #5
0
 /**
  * @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;
 }
Пример #6
0
 /**
  * @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;
 }
Пример #7
0
 /**
  * @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
 }
Пример #8
0
 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);
     }
 }
Пример #10
0
 /**
  * @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;
 }
Пример #12
0
 /**
  * @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);
 }
Пример #13
0
 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;
 }
Пример #14
0
 /**
  * @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;
 }
Пример #17
0
 /**
  * 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;
 }
Пример #18
0
 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;
 }
Пример #20
0
 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;
 }
Пример #21
0
 /**
  * 
  * @param $flavorAsset
  * @param $con
  * 
  * @return flavorParamsOutput
  */
 public static function retrieveByFlavorAsset(flavorAsset $flavorAsset, $con = null)
 {
     return self::retrieveByFlavorAssetId($flavorAsset->getId(), $flavorAsset->getVersion(), $con);
 }
Пример #22
0
 /**
  * @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);
 }
Пример #24
0
 /**
  * @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;
 }
Пример #26
0
 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;
 }
Пример #27
0
 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;
 }
Пример #29
0
 /**
  * @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);
 }
Пример #30
0
 /**
  * @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);
 }