PageRenderTime 24ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/package/app/app/plugins/content_distribution/providers/dailymotion/lib/DailymotionDistributionEngine.php

https://bitbucket.org/pandaos/kaltura
PHP | 278 lines | 179 code | 48 blank | 51 comment | 26 complexity | e6ad6e58921891d9ecc7fa24ab6017b9 MD5 | raw file
Possible License(s): AGPL-3.0, GPL-3.0, BSD-3-Clause, LGPL-2.1, GPL-2.0, LGPL-3.0, JSON, MPL-2.0-no-copyleft-exception, Apache-2.0
  1. <?php
  2. require_once 'DailymotionImpl.php';
  3. /**
  4. * @package plugins.dailymotionDistribution
  5. * @subpackage lib
  6. */
  7. class DailymotionDistributionEngine extends DistributionEngine implements
  8. IDistributionEngineSubmit,
  9. IDistributionEngineCloseSubmit,
  10. IDistributionEngineUpdate,
  11. IDistributionEngineDelete,
  12. IDistributionEngineReport,
  13. IDistributionEngineEnable,
  14. IDistributionEngineDisable
  15. {
  16. protected $tempXmlPath;
  17. protected $requestTimeout = 10;
  18. protected $connectTimeout = 15;
  19. protected $fieldValues;
  20. /* (non-PHPdoc)
  21. * @see DistributionEngine::configure()
  22. */
  23. public function configure(KSchedularTaskConfig $taskConfig)
  24. {
  25. if($taskConfig->params->tempXmlPath)
  26. {
  27. $this->tempXmlPath = $taskConfig->params->tempXmlPath;
  28. if(!is_dir($this->tempXmlPath))
  29. mkdir($this->tempXmlPath, 0777, true);
  30. }
  31. else
  32. {
  33. KalturaLog::err("params.tempXmlPath configuration not supplied");
  34. $this->tempXmlPath = sys_get_temp_dir();
  35. }
  36. if (isset($taskConfig->params->dailymotion))
  37. {
  38. if (isset($taskConfig->params->dailymotion->requestTimeout))
  39. $this->requestTimeout = $taskConfig->params->dailymotion->requestTimeout;
  40. if (isset($taskConfig->params->dailymotion->connectTimeout))
  41. $this->connectTimeout = $taskConfig->params->dailymotion->connectTimeout;
  42. }
  43. }
  44. /* (non-PHPdoc)
  45. * @see IDistributionEngineSubmit::submit()
  46. */
  47. public function submit(KalturaDistributionSubmitJobData $data)
  48. {
  49. if(!$data->distributionProfile || !($data->distributionProfile instanceof KalturaDailymotionDistributionProfile))
  50. throw new Exception("Distribution profile must be of type KalturaDailymotionDistributionProfile");
  51. return $this->doSubmit($data, $data->distributionProfile);
  52. }
  53. /**
  54. * @param KalturaDistributionJobData $data
  55. * @param KalturaDailymotionDistributionProfile $distributionProfile
  56. * @return array()
  57. */
  58. public function getDailymotionProps($enabled = null)
  59. {
  60. $props = array();
  61. $props['tags'] = str_replace(',', ' , ', $this->getValueForField(KalturaDailymotionDistributionField::VIDEO_TAGS));
  62. $props['title'] = $this->getValueForField(KalturaDailymotionDistributionField::VIDEO_TITLE);
  63. $props['channel'] = $this->translateCategory($this->getValueForField(KalturaDailymotionDistributionField::VIDEO_CHANNEL));
  64. $props['description'] = $this->getValueForField(KalturaDailymotionDistributionField::VIDEO_DESCRIPTION);
  65. //$props['date'] = time();
  66. $props['language'] = $this->getValueForField(KalturaDailymotionDistributionField::VIDEO_LANGUAGE);
  67. $props['published']= true;
  68. if(!is_null($enabled))
  69. $props['private']= !$enabled;
  70. return $props;
  71. }
  72. /**
  73. * Tries to transalte the friendly name of the category to the api value, if not found the same value will be returned (as a fallback)
  74. * @param string $category
  75. */
  76. protected function translateCategory($category)
  77. {
  78. foreach(DailyMotionImpl::getCategoriesMap() as $id => $name)
  79. {
  80. if ($name == $category)
  81. return $id;
  82. }
  83. return $category;
  84. }
  85. public function doSubmit(KalturaDistributionSubmitJobData $data, KalturaDailymotionDistributionProfile $distributionProfile)
  86. {
  87. $this->fieldValues = unserialize($data->providerData->fieldValues);
  88. $enabled = false;
  89. if($data->entryDistribution->sunStatus == KalturaEntryDistributionSunStatus::AFTER_SUNRISE)
  90. $enabled = true;
  91. $needDel = false;
  92. $props = $this->getDailymotionProps($enabled);
  93. if($data->entryDistribution->remoteId)
  94. {
  95. $dailyMotionImpl = new DailyMotionImpl($distributionProfile->user, $distributionProfile->password);
  96. $this->configureTimeouts($dailyMotionImpl);
  97. $dailyMotionImpl->update($data->remoteId, $props);
  98. $data->remoteId = $data->entryDistribution->remoteId;
  99. return true;
  100. }
  101. $videoFilePath = $data->providerData->videoAssetFilePath;
  102. if (!$videoFilePath)
  103. throw new KalturaException('No video asset to distribute, the job will fail');
  104. if (!file_exists($videoFilePath))
  105. throw new KalturaDistributionException('The file ['.$videoFilePath.'] was not found (probably not synced yet), the job will retry');
  106. if (FALSE === strstr($videoFilePath, "."))
  107. {
  108. $videoFilePathNew = $this->tempXmlPath . "/" . uniqid() . ".dme";
  109. /* try
  110. {
  111. KalturaLog::debug("DM : before " . $videoFilePathNew);
  112. @symlink ($videoFilePath, $videoFilePathNew);
  113. KalturaLog::debug("DM : after");
  114. }
  115. catch(Exception $ex)
  116. {
  117. KalturaLog::debug("DM : exception");
  118. }*/
  119. if (!file_exists($videoFilePathNew))
  120. {
  121. copy($videoFilePath,$videoFilePathNew);
  122. $needDel = true;
  123. }
  124. $videoFilePath = $videoFilePathNew;
  125. }
  126. $dailyMotionImpl = new DailyMotionImpl($distributionProfile->user, $distributionProfile->password);
  127. $this->configureTimeouts($dailyMotionImpl);
  128. $remoteId = $dailyMotionImpl->upload($videoFilePath);
  129. $dailyMotionImpl->update($remoteId, $props);
  130. if ($needDel == true)
  131. {
  132. unlink($videoFilePath);
  133. }
  134. $data->remoteId = $remoteId;
  135. return false;
  136. }
  137. /* (non-PHPdoc)
  138. * @see IDistributionEngineCloseSubmit::closeSubmit()
  139. */
  140. public function closeSubmit(KalturaDistributionSubmitJobData $data)
  141. {
  142. $distributionProfile = $data->distributionProfile;
  143. $dailyMotionImpl = new DailyMotionImpl($distributionProfile->user, $distributionProfile->password);
  144. $this->configureTimeouts($dailyMotionImpl);
  145. $status = $dailyMotionImpl->getStatus($data->remoteId);
  146. switch($status)
  147. {
  148. case 'encoding_error':
  149. throw new Exception("Dailymotion error encoding");
  150. case 'waiting':
  151. case 'processing':
  152. case 'rejected':
  153. return false;
  154. case 'deleted':
  155. case 'ready':
  156. case 'published':
  157. return true;
  158. }
  159. }
  160. /* (non-PHPdoc)
  161. * @see IDistributionEngineUpdate::update()
  162. */
  163. public function update(KalturaDistributionUpdateJobData $data)
  164. {
  165. if(!$data->distributionProfile || !($data->distributionProfile instanceof KalturaDailymotionDistributionProfile))
  166. throw new Exception("Distribution profile must be of type KalturaDailymotionDistributionProfile");
  167. return $this->doUpdate($data, $data->distributionProfile);
  168. }
  169. /* (non-PHPdoc)
  170. * @see IDistributionEngineDisable::disable()
  171. */
  172. public function disable(KalturaDistributionDisableJobData $data)
  173. {
  174. if(!$data->distributionProfile || !($data->distributionProfile instanceof KalturaDailymotionDistributionProfile))
  175. throw new Exception("Distribution profile must be of type KalturaDailymotionDistributionProfile");
  176. return $this->doUpdate($data, $data->distributionProfile, false);
  177. }
  178. /* (non-PHPdoc)
  179. * @see IDistributionEngineEnable::enable()
  180. */
  181. public function enable(KalturaDistributionEnableJobData $data)
  182. {
  183. if(!$data->distributionProfile || !($data->distributionProfile instanceof KalturaDailymotionDistributionProfile))
  184. throw new Exception("Distribution profile must be of type KalturaDailymotionDistributionProfile");
  185. return $this->doUpdate($data, $data->distributionProfile, true);
  186. }
  187. public function doUpdate(KalturaDistributionUpdateJobData $data, KalturaDailymotionDistributionProfile $distributionProfile, $enabled = null)
  188. {
  189. $this->fieldValues = unserialize($data->providerData->fieldValues);
  190. $props = $this->getDailymotionProps($enabled);
  191. $dailyMotionImpl = new DailyMotionImpl($distributionProfile->user, $distributionProfile->password);
  192. $this->configureTimeouts($dailyMotionImpl);
  193. $dailyMotionImpl->update($data->remoteId, $props);
  194. // $data->sentData = $dailymotionMediaService->request;
  195. // $data->results = $dailymotionMediaService->response;
  196. return true;
  197. }
  198. /* (non-PHPdoc)
  199. * @see IDistributionEngineDelete::delete()
  200. */
  201. public function delete(KalturaDistributionDeleteJobData $data)
  202. {
  203. $distributionProfile = $data->distributionProfile;
  204. $dailyMotionImpl = new DailyMotionImpl($distributionProfile->user, $distributionProfile->password);
  205. $this->configureTimeouts($dailyMotionImpl);
  206. $dailyMotionImpl->delete($data->remoteId);
  207. return true;
  208. }
  209. /* (non-PHPdoc)
  210. * @see IDistributionEngineReport::fetchReport()
  211. */
  212. public function fetchReport(KalturaDistributionFetchReportJobData $data)
  213. {
  214. // TODO
  215. }
  216. protected function configureTimeouts(DailyMotionImpl $dailyMotionImpl)
  217. {
  218. KalturaLog::info('Setting connection timeout to ' . $this->connectTimeout . ' seconds');
  219. $dailyMotionImpl->setOption('connectionTimeout', $this->connectTimeout);
  220. KalturaLog::info('Setting request timeout to ' . $this->requestTimeout . ' seconds');
  221. $dailyMotionImpl->setOption('timeout', $this->requestTimeout);
  222. }
  223. private function getValueForField($fieldName)
  224. {
  225. if (isset($this->fieldValues[$fieldName])) {
  226. return $this->fieldValues[$fieldName];
  227. }
  228. return null;
  229. }
  230. }