public function toObject($dbObject = null, $skip = array()) { parent::toObject($dbObject, $skip); $mrssParams = $dbObject->getMrssParameters(); if (!$mrssParams) { $mrssParams = new kMrssParameters(); } if ($this->itemXpathsToExtend) { $itemXpathsToExtend = $this->itemXpathsToExtend->toObjectsArray(); $mrssParams->setItemXpathsToExtend($itemXpathsToExtend); } $dbObject->setMrssParameters($mrssParams); }
public function toObject($dbObject = null, $skip = array()) { parent::toObject($dbObject, $skip); $mrssParams = $dbObject->getMrssParameters(); if (!$mrssParams) { $mrssParams = new kMrssParameters(); } if ($this->itemXpathsToExtend) { $itemXpathsToExtend = array(); foreach ($this->itemXpathsToExtend as $curXpath) { $itemXpathsToExtend[] = $curXpath->value; } $mrssParams->setItemXpathsToExtend($itemXpathsToExtend); } $dbObject->setMrssParameters($mrssParams); }
/** * @param $entry * @param $syndicationFeed * @return string */ private static function getMrssEntryXml(entry $entry, syndicationFeed $syndicationFeed = null, $link = null) { if ($syndicationFeed->getMrssParameters()) { $mrssParams = clone $syndicationFeed->getMrssParameters(); } else { $mrssParams = new kMrssParameters(); } $mrssParams->setLink($link); $mrssParams->setFilterByFlavorParams($syndicationFeed->getFlavorParamId()); $mrssParams->setIncludePlayerTag(true); $mrssParams->setPlayerUiconfId($syndicationFeed->getPlayerUiconfId()); $mrssParams->setStorageId($syndicationFeed->getStorageId()); $mrss = kMrssManager::getEntryMrssXml($entry, null, $mrssParams); if (!$mrss) { KalturaLog::err("No MRSS returned for entry [" . $entry->getId() . "]"); return null; } return $mrss->asXML(); }
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; }
/** * Get MRSS by entry id * XML will return as an escaped string * * @action getMrss * @param string $entryId Entry id * @param KalturaExtendingItemMrssParameterArray $extendingItemsArray * @return string * @throws KalturaErrors::ENTRY_ID_NOT_FOUND */ function getMrssAction($entryId, KalturaExtendingItemMrssParameterArray $extendingItemsArray = null) { $dbEntry = entryPeer::retrieveByPKNoFilter($entryId); if (!$dbEntry || $dbEntry->getType() != KalturaEntryType::MEDIA_CLIP) { throw new KalturaAPIException(KalturaErrors::ENTRY_ID_NOT_FOUND, $entryId); } $mrssParams = new kMrssParameters(); if ($extendingItemsArray) { $coreExtendingItemArray = $extendingItemsArray->toObjectsArray(); $mrssParams->setItemXpathsToExtend($coreExtendingItemArray); } /* @var $mrss SimpleXMLElement */ $mrss = kMrssManager::getEntryMrssXml($dbEntry, null, $mrssParams); return $mrss->asXML(); }
/** * @param kMrssParameters $mrssParams */ public function setMrssParameters(kMrssParameters $mrssParams) { if (is_array($mrssParams->getItemXpathsToExtend())) { $this->putInCustomData(self::CUSTOM_DATA_MRSS_PARAMETERS, $mrssParams); } }
<?php if ($argc != 4) { echo "Arguments missing.\n\n"; echo "Usage: php " . __FILE__ . " {feed id} {encoding} {realrun / dryrun}\n"; exit; } $feedId = $argv[1]; $encoding = $argv[2]; $dryRun = $argv[3] != 'realrun'; require_once __DIR__ . '/../bootstrap.php'; KalturaStatement::setDryRun($dryRun); $feed = syndicationFeedPeer::retrieveByPK($feedId); $mrssParameters = $feed->getMrssParameters(); if (!$mrssParameters) { $mrssParameters = new kMrssParameters(); $mrssParameters->setItemXpathsToExtend(array()); } $mrssParameters->setEncoding($encoding); $feed->setMrssParameters($mrssParameters); $feed->save(); KalturaLog::debug('Done');
/** * @return string path value * @param entry $entry * @param string $xslStr */ protected function getPathValue(entry $entry, $xslStr) { // 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', $entry->getPartnerId(), true); $mrss = null; $mrssParams = new kMrssParameters(); $mrssParams->setStatuses(array(flavorAsset::ASSET_STATUS_READY, flavorAsset::ASSET_STATUS_EXPORTING)); $mrss = kMrssManager::getEntryMrssXml($entry, $mrss, $mrssParams); $mrssStr = $mrss->asXML(); // 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 = trim($xslStr); if (!$xslObj->loadXML($xslStr)) { KalturaLog::err('Error loading XSL'); return null; } $proc = new XSLTProcessor(); $proc->registerPHPFunctions(kXml::getXslEnabledPhpFunctions()); $proc->importStyleSheet($xslObj); $resultXmlObj = $proc->transformToDoc($mrssObj); if (!$resultXmlObj) { KalturaLog::err('Error transforming XML for entry id [' . $entry->getId() . ']'); return null; } /* DEBUG logs KalturaLog::log('entry mrss = '.$mrssStr); KalturaLog::log('profile xslt = '.$xslStr); */ KalturaLog::debug('Result XML: ' . $resultXmlObj->saveXML()); $xpath = new DOMXPath($resultXmlObj); $fieldElement = $xpath->query("//path_value")->item(0); if (!$fieldElement) { KalturaLog::err('Cannot find element <path_value> in XML'); return null; } $fieldValue = $fieldElement->nodeValue; return $fieldValue; }
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; }
/** * Function goes over finished MRSS XML and adds the required extending items in the appropriate slots * @param SimpleXMLElement $mrss * @param kMrssParameters $mrssParams * @return SimpleXMLElement */ protected static function addExtendingItemsToMrss(SimpleXMLElement $mrss, kMrssParameters $mrssParams) { foreach ($mrssParams->getItemXpathsToExtend() as $itemXPathToExtend) { /* @var $itemXPathToExtend KExtendingItemMrssParameter */ $xmlNodesToExtend = $mrss->xpath($itemXPathToExtend->getXpath()); //metdata/entryIdX /entry/customMetadata/metadata/entryIdY foreach ($xmlNodesToExtend as $xmlNodeToExtend) { /* @var $xmlNodeToExtend SimpleXMLElement */ $identifierValue = strval($xmlNodeToExtend[0]); $extendingObject = $itemXPathToExtend->getIdentifier()->retrieveByIdentifier($identifierValue); if ($extendingObject) { $mrssParams->setItemXpathsToExtend(array()); $featuresArray = strlen($itemXPathToExtend->getIdentifier()->getExtendedFeatures()) ? explode(',', $itemXPathToExtend->getIdentifier()->getExtendedFeatures()) : null; if ($itemXPathToExtend->getExtensionMode() == MrssExtensionMode::APPEND) { $parents = $xmlNodeToExtend->xpath("parent::*"); self::addExtendingItemNode($extendingObject, $identifierValue, $parents[0], $xmlNodeToExtend->getName(), $mrssParams, $featuresArray); } else { $xmlNodeToExtend[0] = null; self::addExtendingItemNode($extendingObject, $identifierValue, $xmlNodeToExtend, $xmlNodeToExtend->getName(), $mrssParams, $featuresArray); } } } } return $mrss; }
/* * Before running the script please insert the following two parameters */ //------------------------------------------------------------------------------------------------------------- $syndicationFeedId = null; // TODO: insert valid syndication feed Id $metadataFieldNames = array('FIRST_FIELD', 'SECOND_FIELD'); //------------------------------------------------------------------------------------------------------------- require_once dirname(__FILE__) . '/../bootstrap.php'; KAutoloader::addClassPath(KAutoloader::buildPath(KALTURA_ROOT_PATH, "plugins", "*")); KAutoloader::setClassMapFilePath(kConf::get("cache_root_path") . '/scripts/' . basename(__FILE__) . '.cache'); KAutoloader::register(); // don't add to database if one of the parameters is missing or is an empty string if (!$syndicationFeedId) { die('ERROR - Missing syndication feed id'); } $syndicationFeed = syndicationFeedPeer::retrieveByPK($syndicationFeedId); if (!$syndicationFeed) { die("ERROR - No such syndication feed with id [{$syndicationFeedId}]." . PHP_EOL); } //setting custom data fields of the syndication feed $itemXpathsToExtend = array(); foreach ($metadataFieldNames as $fieldName) { $itemXpathsToExtend[] = "/*[local-name()='metadata']/*[local-name()='" . $fieldName . "']"; } $mrssParams = new kMrssParameters(); $mrssParams->setItemXpathsToExtend($itemXpathsToExtend); $syndicationFeed->setMrssParameters($mrssParams); $syndicationFeed->save(); echo "Done.";
/** * @param entry $entry * @param SimpleXMLElement $mrss * @param kMrssParameters $mrssParams * @return SimpleXMLElement */ public static function getEntryMrssXml(entry $entry, SimpleXMLElement $mrss = null, kMrssParameters $mrssParams = null) { if ($mrss === null) { $mrss = new SimpleXMLElement('<item/>'); } $mrss->addChild('entryId', $entry->getId()); if ($entry->getReferenceID()) { $mrss->addChild('referenceID', $entry->getReferenceID()); } $mrss->addChild('createdAt', $entry->getCreatedAt(null)); $mrss->addChild('updatedAt', $entry->getUpdatedAt(null)); $mrss->addChild('title', self::stringToSafeXml($entry->getName())); if ($mrssParams && !is_null($mrssParams->getLink())) { $mrss->addChild('link', $mrssParams->getLink() . $entry->getId()); } $mrss->addChild('type', $entry->getType()); $mrss->addChild('licenseType', $entry->getLicenseType()); $mrss->addChild('userId', $entry->getPuserId(true)); $mrss->addChild('name', self::stringToSafeXml($entry->getName())); $mrss->addChild('status', self::stringToSafeXml($entry->getStatus())); $mrss->addChild('description', self::stringToSafeXml($entry->getDescription())); $thumbnailUrl = $mrss->addChild('thumbnailUrl'); $thumbnailUrl->addAttribute('url', $entry->getThumbnailUrl()); if (trim($entry->getTags(), " \r\n\t")) { $tags = $mrss->addChild('tags'); foreach (explode(',', $entry->getTags()) as $tag) { $tags->addChild('tag', self::stringToSafeXml($tag)); } } $categories = explode(',', $entry->getCategories()); foreach ($categories as $category) { $category = trim($category); if ($category) { $categoryNode = $mrss->addChild('category', self::stringToSafeXml($category)); if (strrpos($category, '>') > 0) { $categoryNode->addAttribute('name', self::stringToSafeXml(substr($category, strrpos($category, '>') + 1))); } else { $categoryNode->addAttribute('name', self::stringToSafeXml($category)); } } } $mrss->addChild('partnerData', self::stringToSafeXml($entry->getPartnerData())); if ($entry->getAccessControlId()) { $mrss->addChild('accessControlId', $entry->getAccessControlId()); } if ($entry->getConversionProfileId()) { $mrss->addChild('conversionProfileId', $entry->getConversionProfileId()); } if ($entry->getStartDate(null)) { $mrss->addChild('startDate', $entry->getStartDate(null)); } if ($entry->getEndDate(null)) { $mrss->addChild('endDate', $entry->getEndDate(null)); } switch ($entry->getType()) { case entryType::MEDIA_CLIP: self::appendMediaEntryMrss($entry, $mrss); break; case entryType::MIX: self::appendMixEntryMrss($entry, $mrss); break; case entryType::PLAYLIST: self::appendPlaylistEntryMrss($entry, $mrss); break; case entryType::DATA: self::appendDataEntryMrss($entry, $mrss); break; case entryType::LIVE_STREAM: self::appendLiveStreamEntryMrss($entry, $mrss); break; default: break; } $assets = assetPeer::retrieveReadyByEntryId($entry->getId()); foreach ($assets as $asset) { if ($mrssParams && !is_null($mrssParams->getFilterByFlavorParams()) && $asset->getFlavorParamsId() != $mrssParams->getFilterByFlavorParams()) { continue; } if ($asset instanceof flavorAsset) { self::appendFlavorAssetMrss($asset, $mrss, $mrssParams); } if ($asset instanceof thumbAsset) { self::appendThumbAssetMrss($asset, $mrss); } } $mrssContributors = self::getMrssContributors(); if (count($mrssContributors)) { foreach ($mrssContributors as $mrssContributor) { $mrssContributor->contribute($entry, $mrss, $mrssParams); } } if ($mrssParams && $mrssParams->getIncludePlayerTag()) { $uiconfId = !is_null($mrssParams->getPlayerUiconfId()) ? '/ui_conf_id/' . $mrssParams->getPlayerUiconfId() : ''; $playerUrl = 'http://' . kConf::get('www_host') . '/kwidget/wid/_' . $entry->getPartnerId() . '/entry_id/' . $entry->getId() . '/ui_conf' . ($uiconfId ? "/{$uiconfId}" : ''); $player = $mrss->addChild('player'); $player->addAttribute('url', $playerUrl); } return $mrss; }
/** * @param $entry * @param $syndicationFeed * @return string */ private function getMrssEntryXml(entry $entry, syndicationFeed $syndicationFeed = null, $link = null) { if ($syndicationFeed->getMrssParameters()) { $mrssParams = clone $syndicationFeed->getMrssParameters(); } else { $mrssParams = new kMrssParameters(); } $mrssParams->setLink($link); $mrssParams->setFilterByFlavorParams($syndicationFeed->getFlavorParamId()); $mrssParams->setIncludePlayerTag(true); $mrssParams->setPlayerUiconfId($syndicationFeed->getPlayerUiconfId()); $mrssParams->setStorageId($syndicationFeed->getStorageId()); $mrssParams->setServePlayManifest($syndicationFeed->getServePlayManifest()); $mrssParams->setPlayManifestClientTag('feed:' . $syndicationFeed->getId()); $features = null; if ($syndicationFeed->getUseCategoryEntries()) { KalturaLog::info("Getting entry's associated categories from the category_entry table"); $features = array(ObjectFeatureType::CATEGORY_ENTRIES); } $mrss = kMrssManager::getEntryMrssXml($entry, null, $mrssParams, $features); if (!$mrss) { KalturaLog::err("No MRSS returned for entry [" . $entry->getId() . "]"); return null; } return $mrss->asXML(); }