/** * @param EntryDistribution $entryDistribution * @param $action * @param array $validationErrors * since entry distribution and entry are validated in the parent of validateForSubmission we will not add an error for them */ private function validateReferenceId(EntryDistribution $entryDistribution, $action, array &$validationErrors) { if ($entryDistribution && $entryDistribution->getEntryId()) { $entry = entryPeer::retrieveByPK($entryDistribution->getEntryId()); if ($entry && !$entry->getReferenceID()) { $validationError = $this->createValidationError($action, DistributionErrorType::MISSING_METADATA, "Reference ID", "is a mandatory field"); $validationError->setValidationErrorType(DistributionValidationErrorType::STRING_EMPTY); $validationError->setValidationErrorParam("Reference ID is a mandatory field"); $validationErrors[] = $validationError; } } }
public function validateMetadataForSubmission(EntryDistribution $entryDistribution, $action, array $validationErrors) { if (!class_exists('MetadataProfile')) { return $validationErrors; } $metadataProfileId = $this->getMetadataProfileId(); if (!$metadataProfileId) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_METADATA, self::METADATA_FIELD_MEDIAKEY, ''); return $validationErrors; } $metadata = MetadataPeer::retrieveByObject($metadataProfileId, MetadataObjectType::ENTRY, $entryDistribution->getEntryId()); if (!$metadata) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_METADATA, self::METADATA_FIELD_MEDIAKEY); return $validationErrors; } $values = $this->findMetadataValue(array($metadata), self::METADATA_FIELD_MEDIAKEY); if (!count($values)) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_METADATA, self::METADATA_FIELD_MEDIAKEY, ''); } return $validationErrors; }
/** * @param EntryDistribution $entryDistribution * @param entry $entry * @param DistributionProfile $distributionProfile * @return boolean */ public static function assignAssets(EntryDistribution $entryDistribution, entry $entry, DistributionProfile $distributionProfile) { $submittingStatuses = array(EntryDistributionStatus::PENDING, EntryDistributionStatus::QUEUED, EntryDistributionStatus::SUBMITTING, EntryDistributionStatus::IMPORT_SUBMITTING, EntryDistributionStatus::ERROR_SUBMITTING); // if not in first submmiting status then it's an update and need to check if update is supported. if (!in_array($entryDistribution->getStatus(), $submittingStatuses)) { $distributionProvider = $distributionProfile->getProvider(); if (!$distributionProvider) { KalturaLog::log("Entry distribution [" . $entryDistribution->getId() . "] provider not found"); return false; } if (!$distributionProvider->isUpdateEnabled() || !$distributionProvider->isMediaUpdateEnabled()) { KalturaLog::log("Entry distribution [" . $entryDistribution->getId() . "] provider [" . $distributionProvider->getName() . "] does not support update"); return false; } } $requiredAssetsConditions = $distributionProfile->getRequiredAssetDistributionRules(); $optionalAssetsConditions = $distributionProfile->getOptionalAssetDistributionRules(); $assetDistributionRules = array_merge($requiredAssetsConditions, $optionalAssetsConditions); if (!is_array($assetDistributionRules)) { return false; } $assetIds = array(); $originalList = $entryDistribution->getAssetIds(); $entryAssets = assetPeer::retrieveReadyByEntryId($entryDistribution->getEntryId()); foreach ($assetDistributionRules as $assetDistributionRule) { /* @var $assetDistributionRule kAssetDistributionRule */ foreach ($entryAssets as $asset) { /* @var $asset asset */ if ($assetDistributionRule->fulfilled($asset)) { $assetIds[] = $asset->getId(); } } } $entryDistribution->setAssetIds($assetIds); return $originalList != $entryDistribution->getAssetIds(); }
/** * @param EntryDistribution $entryDistribution * @param int $action enum from DistributionAction * @return array<kDistributionValidationError> */ public function validateForSubmission(EntryDistribution $entryDistribution, $action) { $validationErrors = array(); $requiredFlavorParamsIds = $this->getRequiredFlavorParamsIdsArray(); KalturaLog::log("Required Flavor Params Ids [" . print_r($requiredFlavorParamsIds, true) . "]"); $entryFlavorAssets = flavorAssetPeer::retreiveReadyByEntryId($entryDistribution->getEntryId()); $requiredFlavorParamsIdsKeys = array_flip($requiredFlavorParamsIds); foreach ($entryFlavorAssets as $entryFlavorAsset) { $flavorParamsId = $entryFlavorAsset->getFlavorParamsId(); if (isset($requiredFlavorParamsIdsKeys[$flavorParamsId])) { unset($requiredFlavorParamsIds[$requiredFlavorParamsIdsKeys[$flavorParamsId]]); } } foreach ($requiredFlavorParamsIds as $requiredFlavorParamsId) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_FLAVOR, $requiredFlavorParamsId); } $requiredThumbDimensions = $this->getRequiredThumbDimensionsObjects(); KalturaLog::log("Required Thumb Dimensions [" . print_r($requiredThumbDimensions, true) . "]"); $entryThumbAssets = thumbAssetPeer::retreiveReadyByEntryId($entryDistribution->getEntryId()); $requiredThumbDimensionsWithKeys = array(); foreach ($requiredThumbDimensions as $requiredThumbDimension) { $key = $requiredThumbDimension->getKey(); $requiredThumbDimensionsWithKeys[$key] = $requiredThumbDimension; } foreach ($entryThumbAssets as $entryThumbAsset) { $key = $entryThumbAsset->getWidth() . 'x' . $entryThumbAsset->getHeight(); if (isset($requiredThumbDimensionsWithKeys[$key])) { unset($requiredThumbDimensionsWithKeys[$key]); } } foreach ($requiredThumbDimensionsWithKeys as $key => $requiredThumbDimension) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_THUMBNAIL, $key); } return $validationErrors; }
public function getEntryMrssDoc(EntryDistribution $entryDistribution) { $entry = entryPeer::retrieveByPK($entryDistribution->getEntryId()); // set the default criteria to use the current entry distribution partner id (it is restored later) // this is needed for related entries under kMetadataMrssManager which is using retrieveByPK without the correct partner id filter $oldEntryCriteria = entryPeer::getCriteriaFilter()->getFilter(); entryPeer::setDefaultCriteriaFilter(); entryPeer::addPartnerToCriteria($this->getPartnerId(), true); try { $mrss = null; $mrssParams = new kMrssParameters(); if ($this->getItemXpathsToExtend()) { $mrssParams->setItemXpathsToExtend($this->getItemXpathsToExtend()); } $mrss = kMrssManager::getEntryMrssXml($entry, $mrss, $mrssParams); $mrssStr = $mrss->asXML(); } catch (Exception $e) { // restore the original criteria so it will not get stuck due to the exception entryPeer::getCriteriaFilter()->setFilter($oldEntryCriteria); throw $e; } // restore the original criteria entryPeer::getCriteriaFilter()->setFilter($oldEntryCriteria); $mrssObj = new DOMDocument(); if (!$mrssObj->loadXML($mrssStr)) { throw new Exception('Entry mrss xml is not valid'); } return $mrssObj; }
/** * @param EntryDistribution $entryDistribution * @param int $action enum from DistributionAction * @param array $validationErrors * @param bool $validateDescription * @param bool $validateTags * @return array */ public function validateMetadataForSubmission(EntryDistribution $entryDistribution, $action, array $validationErrors, &$validateDescription, &$validateTags) { $validateDescription = true; $validateTags = true; if (!class_exists('MetadataProfile')) { return $validationErrors; } $metadataProfileId = $this->getMetadataProfileId(); if (!$metadataProfileId) { return $validationErrors; } $metadata = MetadataPeer::retrieveByObject($metadataProfileId, Metadata::TYPE_ENTRY, $entryDistribution->getEntryId()); if (!$metadata) { return $validationErrors; } $metadataProfileCategoryField = MetadataProfileFieldPeer::retrieveByMetadataProfileAndKey($metadataProfileId, self::METADATA_FIELD_DESCRIPTION); if ($metadataProfileCategoryField) { $values = $this->findMetadataValue(array($metadata), self::METADATA_FIELD_DESCRIPTION); if (count($values)) { foreach ($values as $value) { if (!strlen($value)) { continue; } $validateDescription = false; // validate entry description minumum length of 1 character if (strlen($value) < self::ENTRY_DESCRIPTION_MINIMUM_LENGTH) { $validationError = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_DESCRIPTION, 'YouTube description is too short'); $validationError->setValidationErrorType(DistributionValidationErrorType::STRING_TOO_SHORT); $validationError->setValidationErrorParam(self::ENTRY_DESCRIPTION_MINIMUM_LENGTH); $validationErrors[] = $validationError; } // validate entry description maximum length of 60 characters if (strlen($value) > self::ENTRY_DESCRIPTION_MAXIMUM_LENGTH) { $validationError = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_DESCRIPTION, 'YouTube description is too long'); $validationError->setValidationErrorType(DistributionValidationErrorType::STRING_TOO_LONG); $validationError->setValidationErrorParam(self::ENTRY_DESCRIPTION_MAXIMUM_LENGTH); $validationErrors[] = $validationError; } } } } $metadataProfileCategoryField = MetadataProfileFieldPeer::retrieveByMetadataProfileAndKey($metadataProfileId, self::METADATA_FIELD_TAGS); if ($metadataProfileCategoryField) { $values = $this->findMetadataValue(array($metadata), self::METADATA_FIELD_TAGS); if (count($values)) { foreach ($values as $value) { if (!strlen($value)) { continue; } $validateTags = false; // validate entry tags minumum length of 1 character if (strlen($value) < self::ENTRY_TAGS_MINIMUM_LENGTH) { $validationError = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_TAGS, 'YouTube tags is too short'); $validationError->setValidationErrorType(DistributionValidationErrorType::STRING_TOO_SHORT); $validationError->setValidationErrorParam(self::ENTRY_TAGS_MINIMUM_LENGTH); $validationErrors[] = $validationError; } // validate entry tags maximum length of 60 characters if (strlen($value) > self::ENTRY_TAGS_MAXIMUM_LENGTH) { $validationError = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_TAGS, 'YouTube tags is too long'); $validationError->setValidationErrorType(DistributionValidationErrorType::STRING_TOO_LONG); $validationError->setValidationErrorParam(self::ENTRY_TAGS_MAXIMUM_LENGTH); $validationErrors[] = $validationError; } } } } return $validationErrors; }
/** * @param EntryDistribution $entryDistribution * @param int $action enum from DistributionAction * @return array<kDistributionValidationError> */ public function validateForSubmission(EntryDistribution $entryDistribution, $action) { $validationErrors = array(); $distributionProvider = $this->getProvider(); if (!$distributionProvider) { KalturaLog::err("Entry distribution [" . $entryDistribution->getId() . "] provider [" . $this->getProviderType() . "] not found"); return $validationErrors; } if ($action == DistributionAction::UPDATE || $entryDistribution->getStatus() == EntryDistributionStatus::READY || $entryDistribution->getStatus() == EntryDistributionStatus::ERROR_UPDATING) { if (!$distributionProvider->isUpdateEnabled() || !$distributionProvider->isMediaUpdateEnabled()) { KalturaLog::log("Entry distribution [" . $entryDistribution->getId() . "] provider [" . $distributionProvider->getName() . "] does not support update"); return $validationErrors; } } $requiredFlavorParamsIds = $this->getRequiredFlavorParamsIdsArray(); KalturaLog::log("Required Flavor Params Ids [" . print_r($requiredFlavorParamsIds, true) . "]"); $entryFlavorAssets = assetPeer::retrieveReadyFlavorsByEntryId($entryDistribution->getEntryId()); $requiredFlavorParamsIdsKeys = array_flip($requiredFlavorParamsIds); foreach ($entryFlavorAssets as $entryFlavorAsset) { $flavorParamsId = $entryFlavorAsset->getFlavorParamsId(); if (isset($requiredFlavorParamsIdsKeys[$flavorParamsId])) { unset($requiredFlavorParamsIds[$requiredFlavorParamsIdsKeys[$flavorParamsId]]); } } foreach ($requiredFlavorParamsIds as $requiredFlavorParamsId) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_FLAVOR, $requiredFlavorParamsId); } $requiredThumbDimensions = $this->getRequiredThumbDimensionsObjects(); KalturaLog::log("Required Thumb Dimensions [" . print_r($requiredThumbDimensions, true) . "]"); $entryThumbAssets = assetPeer::retrieveReadyThumbnailsByEntryId($entryDistribution->getEntryId()); $requiredThumbDimensionsWithKeys = array(); foreach ($requiredThumbDimensions as $requiredThumbDimension) { $key = $requiredThumbDimension->getKey(); $requiredThumbDimensionsWithKeys[$key] = $requiredThumbDimension; } foreach ($entryThumbAssets as $entryThumbAsset) { $key = $entryThumbAsset->getWidth() . 'x' . $entryThumbAsset->getHeight(); if (isset($requiredThumbDimensionsWithKeys[$key])) { unset($requiredThumbDimensionsWithKeys[$key]); } } foreach ($requiredThumbDimensionsWithKeys as $key => $requiredThumbDimension) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_THUMBNAIL, $key); } $entryAssets = assetPeer::retrieveReadyByEntryId($entryDistribution->getEntryId()); $requiredAssetDistributionRules = $this->getRequiredAssetDistributionRules(); foreach ($requiredAssetDistributionRules as $entryAssetDistributionRule) { $foundMatchingAsset = false; /* @var $entryAssetDistributionRule kAssetDistributionRule */ foreach ($entryAssets as $entryAsset) { /* @var $entryAsset asset */ if ($entryAssetDistributionRule->fulfilled($entryAsset)) { $foundMatchingAsset = true; break; } } if (!$foundMatchingAsset) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_ASSET, $entryAssetDistributionRule->getValidationError()); } } return $validationErrors; }
protected function getFieldValuesXml(EntryDistribution $entryDistribution, $fieldName = null) { $entry = entryPeer::retrieveByPKNoFilter($entryDistribution->getEntryId()); if (!$entry) { KalturaLog::err('Entry not found with ID [' . $entryDistribution->getEntryId() . ']'); return null; } // set the default criteria to use the current entry distribution partner id (it is restored later) // this is needed for related entries under kMetadataMrssManager which is using retrieveByPK without the correct partner id filter $oldEntryCriteria = entryPeer::getCriteriaFilter()->getFilter(); myPartnerUtils::resetPartnerFilter('entry'); myPartnerUtils::addPartnerToCriteria('entry', $entryDistribution->getPartnerId(), true); try { $mrss = null; $mrssParams = new kMrssParameters(); if ($this->getItemXpathsToExtend()) { $mrssParams->setItemXpathsToExtend($this->getItemXpathsToExtend()); } $mrss = kMrssManager::getEntryMrssXml($entry, $mrss, $mrssParams); $mrssStr = $mrss->asXML(); } catch (Exception $e) { // restore the original criteria so it will not get stuck due to the exception entryPeer::getCriteriaFilter()->setFilter($oldEntryCriteria); throw $e; } // restore the original criteria entryPeer::getCriteriaFilter()->setFilter($oldEntryCriteria); if (!$mrssStr) { KalturaLog::err('No MRSS returned for entry [' . $entry->getId() . ']'); return null; } $mrssObj = new DOMDocument(); if (!$mrssObj->loadXML($mrssStr)) { KalturaLog::err('Error loading MRSS XML object for entry [' . $entry->getId() . ']'); return null; } $xslObj = new DOMDocument(); $xslStr = $this->getFieldValuesXslt($entryDistribution, $fieldName); $xslStr = trim($xslStr); if (!$xslObj->loadXML($xslStr)) { KalturaLog::err('Error loading distribution profile XSLT for profile ID [' . $this->getId() . ']'); return null; } $proc = new XSLTProcessor(); $proc->registerPHPFunctions(kXml::getXslEnabledPhpFunctions()); $proc->importStyleSheet($xslObj); $resultXml = $proc->transformToXml($mrssObj); //in order to keep the UTF-8 encoding we transformToXml http://www.php.net/manual/en/xsltprocessor.transformtodoc.php#69305 $resultXmlObj = new DOMDocument(); $resultXmlObj->loadXML($resultXml); if (!$resultXmlObj) { KalturaLog::err('Error transforming XML for distribution profile [' . $this->getId() . '] and entry id [' . $entry->getId() . ']'); return null; } /* DEBUG logs KalturaLog::log('entry mrss = '.$mrssStr); KalturaLog::log('profile xslt = '.$xslStr); */ KalturaLog::debug('Result XML: ' . $resultXmlObj->saveXML()); return $resultXmlObj; }
/** * @param EntryDistribution $entryDistribution * @param int $action enum from DistributionAction * @param array $validationErrors * @param bool $validateDescription * @param bool $validateTags * @return array */ public function validateMetadataForSubmission(EntryDistribution $entryDistribution, $action, array $validationErrors, &$validateDescription, &$validateTags) { $validateDescription = true; $validateTags = true; if (!class_exists('MetadataProfile')) { return $validationErrors; } $metadataProfileId = $this->getMetadataProfileId(); if (!$metadataProfileId) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_METADATA, self::METADATA_FIELD_CATEGORY, ''); return $validationErrors; } $metadataProfileCategoryField = MetadataProfileFieldPeer::retrieveByMetadataProfileAndKey($metadataProfileId, self::METADATA_FIELD_CATEGORY); if (!$metadataProfileCategoryField) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_METADATA, self::METADATA_FIELD_CATEGORY, ''); return $validationErrors; } $metadata = MetadataPeer::retrieveByObject($metadataProfileId, Metadata::TYPE_ENTRY, $entryDistribution->getEntryId()); if (!$metadata) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_METADATA, self::METADATA_FIELD_CATEGORY); return $validationErrors; } $values = $this->findMetadataValue(array($metadata), self::METADATA_FIELD_CATEGORY); if (!count($values)) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::MISSING_METADATA, self::METADATA_FIELD_CATEGORY, ''); } foreach ($values as $value) { if (!strlen($value)) { $validationErrors[] = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_CATEGORY, ''); return $validationErrors; } } $metadataProfileCategoryField = MetadataProfileFieldPeer::retrieveByMetadataProfileAndKey($metadataProfileId, self::METADATA_FIELD_DESCRIPTION); if ($metadataProfileCategoryField) { $values = $this->findMetadataValue(array($metadata), self::METADATA_FIELD_DESCRIPTION); if (count($values)) { foreach ($values as $value) { if (!strlen($value)) { continue; } $validateDescription = false; // validate entry description minumum length of 1 character if (strlen($value) < self::ENTRY_DESCRIPTION_MINIMUM_LENGTH) { $validationError = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_DESCRIPTION, 'Dailymotion description is too short'); $validationError->setValidationErrorType(DistributionValidationErrorType::STRING_TOO_SHORT); $validationError->setValidationErrorParam(self::ENTRY_DESCRIPTION_MINIMUM_LENGTH); $validationErrors[] = $validationError; } // validate entry description minumum length of 1 character if (strlen($value) > self::ENTRY_DESCRIPTION_MAXIMUM_LENGTH) { $validationError = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_DESCRIPTION, 'Dailymotion description is too long'); $validationError->setValidationErrorType(DistributionValidationErrorType::STRING_TOO_LONG); $validationError->setValidationErrorParam(self::ENTRY_DESCRIPTION_MAXIMUM_LENGTH); $validationErrors[] = $validationError; } } } } $metadataProfileCategoryField = MetadataProfileFieldPeer::retrieveByMetadataProfileAndKey($metadataProfileId, self::METADATA_FIELD_TAGS); if ($metadataProfileCategoryField) { $values = $this->findMetadataValue(array($metadata), self::METADATA_FIELD_TAGS); if (count($values) && strlen(implode('', $values))) { $tags = implode(',', $values); $tags = explode(',', $tags); $tagsStr = implode(' , ', $tags); $validateTags = false; if (strlen($tagsStr) > self::ENTRY_TAGS_MAXIMUM_LENGTH) { $validationError = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_TAGS, 'Dailymotion tags is too long'); $validationError->setValidationErrorType(DistributionValidationErrorType::STRING_TOO_LONG); $validationError->setValidationErrorParam(self::ENTRY_TAGS_MAXIMUM_LENGTH); $validationErrors[] = $validationError; } if (count($tags) < self::ENTRY_TAGS_MINIMUM_COUNT) { $validationError = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_TAGS, 'Dailymotion tags must contain at least ' . self::ENTRY_TAGS_MINIMUM_COUNT . ' tags'); $validationError->setValidationErrorType(DistributionValidationErrorType::CUSTOM_ERROR); $validationError->setValidationErrorParam('Dailymotion tags must contain at least ' . self::ENTRY_TAGS_MINIMUM_COUNT . ' tags'); $validationErrors[] = $validationError; } foreach ($tags as $tag) { if (strlen($tag) < self::ENTRY_TAG_MINIMUM_LENGTH) { $validationError = $this->createValidationError($action, DistributionErrorType::INVALID_DATA, self::METADATA_FIELD_TAGS, 'Dailymotion tag [$tag] must contain at least ' . self::ENTRY_TAG_MINIMUM_LENGTH . ' characters'); $validationError->setValidationErrorType(DistributionValidationErrorType::CUSTOM_ERROR); $validationError->setValidationErrorParam('Dailymotion tag [$tag] must contain at least ' . self::ENTRY_TAG_MINIMUM_LENGTH . ' characters'); $validationErrors[] = $validationError; } } } } return $validationErrors; }
/** * @param EntryDistribution $entryDistribution * @param DistributionProfile $distributionProfile * @return BatchJob */ protected static function addSubmitDeleteJob(EntryDistribution $entryDistribution, DistributionProfile $distributionProfile) { $jobData = new kDistributionDeleteJobData(); $jobData->setDistributionProfileId($entryDistribution->getDistributionProfileId()); $jobData->setEntryDistributionId($entryDistribution->getId()); $jobData->setProviderType($distributionProfile->getProviderType()); $jobData->setRemoteId($entryDistribution->getRemoteId()); $batchJob = new BatchJob(); $batchJob->setEntryId($entryDistribution->getEntryId()); $batchJob->setPartnerId($entryDistribution->getPartnerId()); $jobType = ContentDistributionPlugin::getBatchJobTypeCoreValue(ContentDistributionBatchJobType::DISTRIBUTION_DELETE); $jobSubType = $distributionProfile->getProviderType(); return kJobsManager::addJob($batchJob, $jobData, $jobType, $jobSubType); }