/** * batch decideProfileConvert is the decision layer for a conversion profile * * @param BatchJob $parentJob * @param BatchJob $convertProfileJob * @param int $mediaInfoId * @return bool true if created all required conversions */ public static function decideProfileConvert(BatchJob $parentJob, BatchJob $convertProfileJob, $mediaInfoId = null) { KalturaLog::log("Conversion decision layer used for entry [" . $parentJob->getEntryId() . "]"); $convertProfileData = $convertProfileJob->getData(); $entryId = $convertProfileJob->getEntryId(); $entry = $convertProfileJob->getEntry(); if (!$entry) { throw new APIException(APIErrors::INVALID_ENTRY, $convertProfileJob, $entryId); } $profile = myPartnerUtils::getConversionProfile2ForEntry($entryId); if (!$profile) { $errDescription = "Conversion profile for entryId [{$entryId}] not found"; $convertProfileJob = kJobsManager::failBatchJob($convertProfileJob, $errDescription, BatchJobType::CONVERT_PROFILE); kBatchManager::updateEntry($convertProfileJob, entryStatus::ERROR_CONVERTING); KalturaLog::err("No flavors created: {$errDescription}"); return false; } $originalFlavorAsset = flavorAssetPeer::retrieveOriginalByEntryId($entryId); if (is_null($originalFlavorAsset)) { $errDescription = 'Original flavor asset not found'; KalturaLog::err($errDescription); $convertProfileJob = kJobsManager::failBatchJob($convertProfileJob, $errDescription, BatchJobType::CONVERT_PROFILE); kBatchManager::updateEntry($convertProfileJob, entryStatus::ERROR_CONVERTING); return false; } $shouldConvert = true; // gets the list of flavor params of the conversion profile $list = flavorParamsConversionProfilePeer::retrieveByConversionProfile($profile->getId()); if (!count($list)) { $errDescription = "No flavors match the profile id [{$profile->getId()}]"; KalturaLog::err($errDescription); $convertProfileJob = kJobsManager::failBatchJob($convertProfileJob, $errDescription, BatchJobType::CONVERT_PROFILE); kBatchManager::updateEntry($convertProfileJob, entryStatus::ERROR_CONVERTING); $originalFlavorAsset->setStatus(flavorAsset::FLAVOR_ASSET_STATUS_DELETED); $originalFlavorAsset->setDeletedAt(time()); $originalFlavorAsset->save(); return false; } $mediaInfo = null; if ($mediaInfoId) { $mediaInfo = mediaInfoPeer::retrieveByPK($mediaInfoId); } 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"); } } // gets the ids of the flavor params $flavorsIds = array(); $conversionProfileFlavorParams = array(); foreach ($list as $flavorParamsConversionProfile) { $flavorsId = $flavorParamsConversionProfile->getFlavorParamsId(); $flavorsIds[] = $flavorsId; $conversionProfileFlavorParams[$flavorsId] = $flavorParamsConversionProfile; } $dynamicFlavorAttributes = $entry->getDynamicFlavorAttributes(); $sourceFlavor = null; $flavors = flavorParamsPeer::retrieveByPKs($flavorsIds); foreach ($flavors as $index => $flavor) { if (isset($dynamicFlavorAttributes[$flavor->getId()])) { foreach ($dynamicFlavorAttributes[$flavor->getId()] as $attributeName => $attributeValue) { $flavor->setDynamicAttribute($attributeName, $attributeValue); } } if ($flavor->hasTag(flavorParams::TAG_SOURCE)) { $sourceFlavor = $flavor; unset($flavors[$index]); } } KalturaLog::log(count($flavors) . " destination flavors found for this profile[" . $profile->getId() . "]"); if (!$sourceFlavor) { KalturaLog::log("Source flavor params not found"); $originalFlavorAsset->setStatus(flavorAsset::FLAVOR_ASSET_STATUS_TEMP); $originalFlavorAsset->save(); } elseif ($shouldConvert) { KalturaLog::log("Source flavor params [" . $sourceFlavor->getId() . "] found"); $originalFlavorAsset->setFlavorParamsId($sourceFlavor->getId()); if ($sourceFlavor->getOperators() || $sourceFlavor->getConversionEngines()) { KalturaLog::log("Source flavor asset requires conversion"); $srcSyncKey = $originalFlavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); $errDescription = null; $sourceFlavorOutput = self::validateFlavorAndMediaInfo($sourceFlavor, $mediaInfo, $errDescription); // save flavor params $sourceFlavorOutput->setPartnerId($sourceFlavorOutput->getPartnerId()); $sourceFlavorOutput->setEntryId($entryId); $sourceFlavorOutput->setFlavorAssetId($originalFlavorAsset->getId()); $sourceFlavorOutput->setFlavorAssetVersion($originalFlavorAsset->getVersion()); $sourceFlavorOutput->save(); if ($errDescription) { $originalFlavorAsset->setDescription($originalFlavorAsset->getDescription() . "\n{$errDescription}"); } $errDescription = kBusinessConvertDL::parseFlavorDescription($sourceFlavorOutput); if ($errDescription) { $originalFlavorAsset->setDescription($originalFlavorAsset->getDescription() . "\n{$errDescription}"); } // decided by the business logic layer if ($sourceFlavorOutput->_create_anyway) { KalturaLog::log("Flavor [" . $sourceFlavorOutput->getFlavorParamsId() . "] selected to be created anyway"); } else { if (!$sourceFlavorOutput->IsValid()) { KalturaLog::log("Flavor [" . $sourceFlavorOutput->getFlavorParamsId() . "] is invalid"); $originalFlavorAsset->setStatus(flavorAsset::FLAVOR_ASSET_STATUS_ERROR); $originalFlavorAsset->save(); $errDescription = "Source flavor could not be converted"; KalturaLog::err($errDescription); $convertProfileJob = kJobsManager::failBatchJob($convertProfileJob, $errDescription, BatchJobType::CONVERT_PROFILE); kBatchManager::updateEntry($convertProfileJob, entryStatus::ERROR_CONVERTING); return false; } if ($sourceFlavorOutput->_force) { KalturaLog::log("Flavor [" . $sourceFlavorOutput->getFlavorParamsId() . "] is forced"); } elseif ($sourceFlavorOutput->_isNonComply) { KalturaLog::log("Flavor [" . $sourceFlavorOutput->getFlavorParamsId() . "] is none-comply"); } else { KalturaLog::log("Flavor [" . $sourceFlavorOutput->getFlavorParamsId() . "] is valid"); } } $originalFlavorAsset->incrementVersion(); $originalFlavorAsset->setStatus(flavorAsset::FLAVOR_ASSET_STATUS_QUEUED); $originalFlavorAsset->addTags($sourceFlavor->getTagsArray()); $originalFlavorAsset->setFileExt($sourceFlavorOutput->getFileExt()); $originalFlavorAsset->save(); // save flavor params $sourceFlavorOutput->setFlavorAssetVersion($originalFlavorAsset->getVersion()); $sourceFlavorOutput->save(); kJobsManager::addFlavorConvertJob($srcSyncKey, $sourceFlavorOutput, $originalFlavorAsset->getId(), $mediaInfoId, $parentJob); return false; } $originalFlavorAsset->setStatus(flavorAsset::FLAVOR_ASSET_STATUS_READY); $originalFlavorAsset->save(); $entry->addFlavorParamsId($sourceFlavor->getId()); $entry->save(); kFlowHelper::generateThumbnailsFromFlavor($parentJob->getEntryId(), $parentJob); } if (!count($flavors)) { $shouldConvert = false; } if (!$shouldConvert) { self::bypassConversion($originalFlavorAsset, $entry, $convertProfileJob); return true; } return self::decideProfileFlavorsConvert($parentJob, $convertProfileJob, $flavors, $conversionProfileFlavorParams, $mediaInfo); }
/** * batch addMediaInfo adds a media info and updates the flavor asset * * @param mediaInfo $mediaInfoDb * @return mediaInfo */ public static function addMediaInfo(mediaInfo $mediaInfoDb) { $mediaInfoDb->save(); KalturaLog::log("Added media info [" . $mediaInfoDb->getId() . "] for flavor asset [" . $mediaInfoDb->getFlavorAssetId() . "]"); if (!$mediaInfoDb->getFlavorAssetId()) { return $mediaInfoDb; } $flavorAsset = assetPeer::retrieveById($mediaInfoDb->getFlavorAssetId()); if (!$flavorAsset) { return $mediaInfoDb; } if ($flavorAsset->getIsOriginal()) { KalturaLog::log("Media info is for the original flavor asset"); $tags = null; $profile = myPartnerUtils::getConversionProfile2ForEntry($flavorAsset->getEntryId()); if ($profile) { $tags = $profile->getInputTagsMap(); } KalturaLog::log("Flavor asset tags from profile [{$tags}]"); if (!is_null($tags)) { $tagsArray = explode(',', $tags); // support for old migrated profiles if ($profile->getCreationMode() == conversionProfile2::CONVERSION_PROFILE_2_CREATION_MODE_AUTOMATIC_BYPASS_FLV) { if (!KDLWrap::CDLIsFLV($mediaInfoDb)) { $key = array_search(flavorParams::TAG_MBR, $tagsArray); if ($key !== false) { unset($tagsArray[$key]); } } } $finalTagsArray = KDLWrap::CDLMediaInfo2Tags($mediaInfoDb, $tagsArray); $finalTags = join(',', array_unique($finalTagsArray)); KalturaLog::log("Flavor asset tags from KDL [{$finalTags}]"); //KalturaLog::log("Flavor asset tags [".print_r($flavorAsset->setTags(),1)."]"); $flavorAsset->addTags($finalTagsArray); } } else { KalturaLog::log("Media info is for the destination flavor asset"); $tags = null; $flavorParams = assetParamsPeer::retrieveByPK($flavorAsset->getFlavorParamsId()); if ($flavorParams) { $tags = $flavorParams->getTags(); } KalturaLog::log("Flavor asset tags from flavor params [{$tags}]"); if (!is_null($tags)) { $tagsArray = explode(',', $tags); $assetTagsArray = $flavorAsset->getTagsArray(); foreach ($assetTagsArray as $tag) { $tagsArray[] = $tag; } $maxMbrBitrate = 8000; if (kConf::hasParam('max_mbr_flavor_bitrate')) { $maxMbrBitrate = kConf::get('max_mbr_flavor_bitrate'); } if ($mediaInfoDb->getContainerBitRate() >= $maxMbrBitrate) { $tagsArray = array_unique($tagsArray); $key = array_search(flavorParams::TAG_MBR, $tagsArray); if ($key !== false) { unset($tagsArray[$key]); } } $finalTagsArray = $tagsArray; // bypass, KDLWrap::CDLMediaInfo2Tags doesn't support destination flavors and mobile tags // $finalTagsArray = KDLWrap::CDLMediaInfo2Tags($mediaInfoDb, $tagsArray); $finalTags = join(',', array_unique($finalTagsArray)); KalturaLog::log("Flavor asset tags from KDL [{$finalTags}]"); $flavorAsset->setTags($finalTags); } } KalturaLog::log("KDLWrap::ConvertMediainfoCdl2FlavorAsset(" . $mediaInfoDb->getId() . ", " . $flavorAsset->getId() . ");"); KDLWrap::ConvertMediainfoCdl2FlavorAsset($mediaInfoDb, $flavorAsset); $flavorAsset->save(); // if(!$flavorAsset->hasTag(flavorParams::TAG_MBR)) // return $mediaInfoDb; $entry = entryPeer::retrieveByPK($flavorAsset->getEntryId()); if (!$entry) { return $mediaInfoDb; } $contentDuration = $mediaInfoDb->getContainerDuration(); if (!$contentDuration) { $contentDuration = $mediaInfoDb->getVideoDuration(); if (!$contentDuration) { $contentDuration = $mediaInfoDb->getAudioDuration(); } } if ($contentDuration && $entry->getCalculateDuration()) { $entry->setLengthInMsecs($contentDuration); } if ($mediaInfoDb->getVideoWidth() && $mediaInfoDb->getVideoHeight()) { $entry->setDimensionsIfBigger($mediaInfoDb->getVideoWidth(), $mediaInfoDb->getVideoHeight()); } $entry->save(); return $mediaInfoDb; }
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; }
/** * batch addMediaInfo adds a media info and updates the flavor asset * * @param mediaInfo $mediaInfoDb * @return mediaInfo */ public static function addMediaInfo(mediaInfo $mediaInfoDb) { $mediaInfoDb->save(); KalturaLog::log("Added media info [" . $mediaInfoDb->getId() . "] for flavor asset [" . $mediaInfoDb->getFlavorAssetId() . "]"); if (!$mediaInfoDb->getFlavorAssetId()) { return $mediaInfoDb; } $flavorAsset = flavorAssetPeer::retrieveById($mediaInfoDb->getFlavorAssetId()); if (!$flavorAsset) { return $mediaInfoDb; } if ($flavorAsset->getIsOriginal()) { KalturaLog::log("Media info is for the original flavor asset"); $tags = null; $profile = myPartnerUtils::getConversionProfile2ForEntry($flavorAsset->getEntryId()); if ($profile) { $tags = $profile->getInputTagsMap(); } KalturaLog::log("Flavor asset tags from profile [{$tags}]"); if (!is_null($tags)) { $tagsArray = explode(',', $tags); // support for old migrated profiles if ($profile->getCreationMode() == conversionProfile2::CONVERSION_PROFILE_2_CREATION_MODE_AUTOMATIC_BYPASS_FLV) { if (!KDLWrap::CDLIsFLV($mediaInfoDb)) { $key = array_search(flavorParams::TAG_MBR, $tagsArray); unset($tagsArray[$key]); } } $finalTagsArray = KDLWrap::CDLMediaInfo2Tags($mediaInfoDb, $tagsArray); $finalTags = join(',', $finalTagsArray); KalturaLog::log("Flavor asset tags from KDL [{$finalTags}]"); $flavorAsset->setTags($finalTags); } } KalturaLog::log("KDLWrap::ConvertMediainfoCdl2FlavorAsset(" . $mediaInfoDb->getId() . ", " . $flavorAsset->getId() . ");"); KDLWrap::ConvertMediainfoCdl2FlavorAsset($mediaInfoDb, $flavorAsset); $flavorAsset->save(); // if(!$flavorAsset->hasTag(flavorParams::TAG_MBR)) // return $mediaInfoDb; $entry = entryPeer::retrieveByPK($flavorAsset->getEntryId()); if (!$entry) { return $mediaInfoDb; } $contentDuration = $mediaInfoDb->getContainerDuration(); if (!$contentDuration) { $contentDuration = $mediaInfoDb->getVideoDuration(); if (!$contentDuration) { $contentDuration = $mediaInfoDb->getAudioDuration(); } } $entry->setLengthInMsecs($contentDuration); if ($mediaInfoDb->getVideoWidth() && $mediaInfoDb->getVideoHeight()) { $entry->setDimensions($mediaInfoDb->getVideoWidth(), $mediaInfoDb->getVideoHeight()); } $entry->save(); return $mediaInfoDb; }