PageRenderTime 26ms CodeModel.GetById 33ms RepoModel.GetById 1ms app.codeStats 0ms

/package/app/app/alpha/apps/kaltura/lib/myKshowMetadataCreator.class.php

https://github.com/richhl/kalturaCE
PHP | 437 lines | 269 code | 88 blank | 80 comment | 39 complexity | a5fd5fad22bfae767c4ef9e40d6fbbea MD5 | raw file
  1. <?php
  2. require_once ( "requestUtils.class.php");
  3. class extendedEntryMediaType
  4. {
  5. public $asset_type = NULL;
  6. public $type = "";
  7. }
  8. class urlName
  9. {
  10. public $url = "";
  11. public $name = "";
  12. }
  13. class myKshowMetadataCreator
  14. {
  15. private static $IMAGE_EXT = array ( "jpg" , "gif" , "bmp" , "png" );
  16. private static $VIDEO_EXT = array ( "flv" );
  17. private static $SWF_EXT = array ( "swf" );
  18. private static $AUDIO_EXT = array ( "mp3" );
  19. private static $RTMP_PREFIX = array ( "rtmp" , "rtmpt" );
  20. const TYPE_RTMP = "RTMP";
  21. const TYPE_PD = "VIDEO";
  22. const TYPE_SWF = "SWF";
  23. const TYPE_FVSS = "FVSS";
  24. const TYPE_IMG = "IMG";
  25. const TYPE_EMPTY = "EMPTY";
  26. const TYPE_UNKNOWN = "?";
  27. const VIDEO_ASSET = 1;
  28. const VOICE_ASSET = 2;
  29. const AUDIO_ASSET = 3;
  30. const OBJECT_ASSET = 4;
  31. private $m_video_assets = NULL;
  32. private $m_audio_assets = NULL;
  33. private $m_voice_assets = NULL;
  34. private $m_object_assets = NULL;
  35. private $m_seq_play_time = 0;
  36. private $m_video_seq_play_time = 0;
  37. private $m_audio_seq_play_time = 0;
  38. private $m_voice_seq_play_time = 0;
  39. private $m_object_seq_play_time = 0;
  40. public function createMetadata ( $kshow_id )
  41. {
  42. // echo ( "createMetadata for [$kshow_id]\n" );
  43. $kshow = kshowPeer::retrieveByPK( $kshow_id );
  44. $show_entry_id = $kshow->getShowEntryId();
  45. $intro_id = $kshow->getIntroId();
  46. // fetch all entries for a kshow without the kshow entry or the intro
  47. // the order is ascending by creation date of the entry
  48. // if ordering by ascending ID - the intro will always be first
  49. $c = new Criteria ();
  50. $c->add ( entryPeer::KSHOW_ID , $kshow_id );
  51. $c->add ( entryPeer::ID , array ( $show_entry_id , $intro_id ) , Criteria::NOT_IN );
  52. // $c->addDescendingOrderByColumn('(' . entryPeer::ID . '=' . $intro_id . ')');
  53. $c->addAscendingOrderByColumn( entryPeer::ID );
  54. // $c->add ( entryPeer::STATUS , entryStatus::READY );
  55. // $c->addAscendingOrderByColumn( entryPeer::CREATED_AT );
  56. $entry_list = entryPeer::doSelect( $c );
  57. // echo ( "kshow [$kshow_id] has " . count ( $entry_list ) . " entries\n" );
  58. return $this->createMetadataForList ( $entry_list );
  59. }
  60. // creates the XML for all the entries in the list
  61. private function createMetadataForList ( $entry_list )
  62. {
  63. if ( $entry_list == NULL )
  64. {
  65. return "<xml></xml>";
  66. }
  67. $xml = "<xml>";
  68. $xml .= $this->beginAssetLists ();
  69. foreach ( $entry_list as $entry )
  70. {
  71. $extended_type = self::getEntryType ( $entry );
  72. $type = $extended_type->asset_type;
  73. if ( self::VIDEO_ASSET == $type )
  74. {
  75. $this->addVideoAsset ( $entry , $extended_type);
  76. }
  77. elseif (self::AUDIO_ASSET == $type )
  78. {
  79. $this->addAudioAsset ( $entry , $extended_type);
  80. }
  81. elseif ( self::OBJECT_ASSET == $type )
  82. {
  83. $this->addObjectAsset ( $entry , $extended_type);
  84. }
  85. else
  86. {
  87. $this->addObjectAsset ( $entry , $extended_type);
  88. }
  89. }
  90. $this->finalizeAssetLists ();
  91. $xml .= $this->m_video_assets;
  92. $xml .= $this->m_audio_assets;
  93. $xml .= $this->m_voice_assets;
  94. $xml .= $this->m_object_assets;
  95. $xml .= "</xml>";
  96. return $xml;
  97. }
  98. private function addVideoAsset ( entry $entry , $extended_type)
  99. {
  100. /*
  101. * OLD:
  102. <vidAsset seqPlayTime="0" type="RTMP" name="dugag" url="rtmp://8.6.95.164:1935/kplayer/_definst_">
  103. <StreamInfo file_name="dugag" posX="0" posY="0" start_byte="0" end_byte="0" start_time="3.5" len_time="3.5" volume="0" pan="0" />
  104. <EndTransition property="alpha" type="smoothEaseOut" length="1" />
  105. <!--<Effect type="" length="" specialElements="" />-->
  106. </vidAsset>
  107. <vidAsset k_id="3" type="IMAGE" name="Deanna Wilkinson entry" url="http://localhost/images/templates/entry/data/13.jpg">
  108. <StreamInfo file_name="http://localhost/images/templates/entry/data/13.jpg" posX="0" posY="0" start_byte="-1" end_byte="-1" start_time="0" len_time="1" volume="0" pan="0" isSingleFrame="0"/>
  109. <EndTransition type="None" StartTime="1" length="0"/>
  110. </vidAsset>
  111. <vidAsset k_id="1402" type="VIDEO" name="Gina Mattila entry" url="http://localhost/images/templates/entry/data/9.flv" fix_status="Missing file or invalid FLV structure">
  112. <StreamInfo file_name="http://localhost/images/templates/entry/data/9.flv" posX="0" posY="0" start_byte="-1" end_byte="-1" start_time="103.24" len_time="45.97000000000001" volume="1" pan="0" isSingleFrame="0"/>
  113. <EndTransition type="None" StartTime="45.97000000000001" length="0"/>
  114. </vidAsset>
  115. */
  116. // create EMPTY filler (if needed)
  117. $asset = $this->createEmptyAsset ( "vidAsset" , $this->m_video_seq_play_time );
  118. $url_name = self::getUrlAndName ( $entry );
  119. $url = $url_name->url;
  120. $name = str_replace ( '"' , "&quot;" ,$url_name->name ) ;
  121. // stub
  122. $len_time = ((int)($entry->getLengthInMsecs()/100)) /10;
  123. $start_time = 0;
  124. $volume = 0.5;
  125. $start_time = max ( 0 , $len_time - 1 );
  126. $length = $len_time - $start_time;
  127. $asset .= self::createEntryComment( $entry );
  128. $is_ready = $entry->getStatus() == entryStatus::READY;
  129. // if the entry is not ready - comment out the whole element and DON"T increment the $this->m_seq_play_time !!
  130. if ( ! $is_ready )
  131. {
  132. $asset .= "<!-- faild to convert. see conversion log for entry_id " . $entry->getId() . "\n" ;
  133. }
  134. $asset .= '<vidAsset k_id="' . $entry->getId() . '" seqPlayTime="' . $this->m_seq_play_time . '" type="' . $extended_type->type . '" name="' . $url_name->name . '" url="' . $url_name->url . '">' . "\n" .
  135. '<StreamInfo file_name="' . $name . '" posX="0" posY="0" start_byte="-1" end_byte="-1" start_time="' .$start_time . '" len_time="'. $len_time. '" volume="'. $volume .'" pan="0" />' . "\n" .
  136. '<EndTransition type="none" StartTime="' . $start_time . '" length="' . $length . '" />' . "\n" .
  137. '</vidAsset>' . "\n";
  138. if ( ! $is_ready )
  139. {
  140. $asset .= "-->" . "\n";
  141. }
  142. else
  143. {
  144. // increment the counter only if ready
  145. $this->m_seq_play_time += $len_time;
  146. }
  147. $this->m_video_assets .= $asset;
  148. $this->m_video_seq_play_time = $this->m_seq_play_time;
  149. }
  150. /*
  151. private function addVideoEmpty ( $entry , $len_time )
  152. {
  153. $asset = self::createEntryComment( $entry );
  154. $asset .= self::createEmptyAsset( "vidAsset" , $this->m_seq_play_time , $len_time );
  155. $this->m_video_assets .= $asset;
  156. }
  157. */
  158. private function addAudioAsset ( $entry , $extended_type)
  159. {
  160. /*
  161. <AudAsset seqPlayTime="0" type="FLV" name="savage" url="rtmp://8.6.95.164:1935/kplayer/_definst_">
  162. <StreamInfo file_name="savage" start_time="5" len_time="4" volume="0.3" pan="0" />
  163. </AudAsset>
  164. */
  165. // create EMPTY filler (if needed)
  166. $asset = $this->createEmptyAsset ( "AudAsset" , $this->m_audio_seq_play_time );
  167. $url_name = self::getUrlAndName ( $entry );
  168. // stub
  169. $len_time = 8;
  170. $start_time = 2;
  171. $volume = 0.5;
  172. $asset .= self::createEntryComment( $entry );
  173. $asset .= '<AudAsset seqPlayTime="' . $this->m_seq_play_time . '" type="' . $extended_type->type . '" name="' . $url_name->name . '" url="' . $url_name->url . '">' . "\n" .
  174. '<StreamInfo file_name="' . $name . '" start_time="' .$start_time . '" len_time="'. $len_time. '" volume="'. $volume .'" pan="0" />' . "\n" .
  175. '</AudAsset>' . "\n" ;
  176. $this->m_audio_assets .= $asset;
  177. // make sure there is an EMPTY in the video asset list
  178. // $this->addVideoEmpty( $entry, $len_time);
  179. $this->m_seq_play_time += $len_time;
  180. $this->m_audio_seq_play_time = $this->m_seq_play_time;
  181. }
  182. private function addObjectAsset ( $entry , $extended_type )
  183. {
  184. /*
  185. <ldrAsset seqPlayTime="0" type="SWF" name="levLevitated" url="swf_n_img">
  186. <StreamInfo file_name="levLevitated.swf" posX="30" posY="50" len_time="2.5" sizeW="200" sizeH="120" />
  187. <!--<EndTransition property="alpha" type="smoothEaseOut" length="1" />
  188. <Effect type="" length="" specialElements="" />-->
  189. </ldrAsset>
  190. */
  191. // create EMPTY filler )if needed)
  192. $asset = "" ; //$this->createEmptyAsset ( "ldrAsset" , $this->m_object_seq_play_time );
  193. $url_name = self::getUrlAndName ( $entry );
  194. // stub
  195. $len_time = 4;
  196. $start_time = 0;
  197. $volume = 0.5;
  198. $asset .= self::createEntryComment( $entry );
  199. if ( $extended_type->type == self::TYPE_UNKNOWN ) $asset .= "<!-- " . "\n" ;
  200. $asset .= '<ldrAsset seqPlayTime="' . $this->m_seq_play_time . '" type="' . $extended_type->type . '" name="' . $url_name->name . '" url="' . $url_name->url . '">' . "\n" .
  201. '<StreamInfo file_name="' . $url_name->name . '" len_time="'. $len_time . '" posX="30" posY="50" sizeW="200" sizeH="120" />' . "\n" .
  202. '</ldrAsset>' . "\n" ;
  203. if ( $extended_type->type == self::TYPE_UNKNOWN ) $asset .= " --> ". "\n";
  204. $this->m_object_assets .= $asset;
  205. // make sure there is an EMPTY in the video asset list
  206. // $this->addVideoEmpty( $entry,$len_time);
  207. $this->m_seq_play_time += $len_time;
  208. $this->m_object_seq_play_time = $this->m_seq_play_time;
  209. }
  210. private function createEmptyAsset( $asset_tag , &$seq_play_time)
  211. {
  212. $str = "";
  213. $len_time = $this->m_seq_play_time - $seq_play_time ;
  214. if ( $len_time > 0 )
  215. {
  216. // have to fill the gap
  217. $str = self::createEmptyAssetImpl ( $asset_tag , $seq_play_time , $len_time );
  218. $str .= "\n";
  219. $seq_play_time = $this->m_seq_play_time ;
  220. }
  221. return $str;
  222. }
  223. private static function createEmptyAssetImpl ( $asset_tag , $seq_play_time , $len_time )
  224. {
  225. /*
  226. *
  227. <vidAsset seqPlayTime="10.7" type="EMPTY" >
  228. <StreamInfo len_time="2.3" />
  229. </vidAsset>
  230. *
  231. */
  232. $str = "<$asset_tag seqPlayTime=\"$seq_play_time\" type=\"EMPTY\">". "\n" .
  233. "<StreamInfo len_time=\"$len_time\" />" . "\n" .
  234. "</$asset_tag>" . "\n";
  235. return $str;
  236. }
  237. private static function createEntryComment ( $entry )
  238. {
  239. return "<!-- id:" . $entry->getId() . "-->\n";
  240. }
  241. // check the entry type - but more importatn - check the extension of the data
  242. private static function getEntryType ( $entry )
  243. {
  244. $extended_entry_type = new extendedEntryMediaType();
  245. $entry_type = $entry->getMediaType(); // this is assumed to be correct
  246. $data = kFileSyncUtils::getReadyLocalFilePathForKey($entry->getSyncKey(entry::FILE_SYNC_ENTRY_SUB_TYPE_DATA)); // replaced__getDataPath
  247. $ext = pathinfo($data, PATHINFO_EXTENSION );
  248. if ( $ext == NULL || $ext == "" )
  249. {
  250. // if tehre is no extensio - ASSUME : entry::ENTRY_MEDIA_TYPE_VIDEO
  251. $extended_entry_type->asset_type = self::VIDEO_ASSET;
  252. if ( kString::beginsWith( $data , self::$RTMP_PREFIX ) )
  253. {
  254. $extended_entry_type->type = self::TYPE_RTMP;
  255. }
  256. else
  257. {
  258. $extended_entry_type->type = self::TYPE_PD ;// assume progressive download
  259. }
  260. }
  261. else
  262. {
  263. // there is an extension -
  264. if ( in_array ( $ext , self::$IMAGE_EXT ))
  265. {
  266. $extended_entry_type->asset_type = self::VIDEO_ASSET;
  267. $extended_entry_type->type = self::TYPE_IMG;
  268. }
  269. elseif ( in_array( $ext , self::$VIDEO_EXT ))
  270. {
  271. $extended_entry_type->asset_type = self::VIDEO_ASSET;
  272. $extended_entry_type->type = self::TYPE_PD;
  273. // for now - use RTMP as the download method for video
  274. //$extended_entry_type->type = self::TYPE_RTMP;
  275. }
  276. elseif ( in_array( $ext , self::$SWF_EXT ))
  277. {
  278. $extended_entry_type->asset_type = self::OBJECT_ASSET;
  279. $extended_entry_type->type = self::TYPE_SWF;
  280. }
  281. elseif ( in_array( $ext , self::$AUDIO_EXT ))
  282. {
  283. $extended_entry_type->asset_type = self::AUDIO_ASSET;
  284. $extended_entry_type->type = self::TYPE_PD;
  285. }
  286. else
  287. {
  288. // choose some default for unknown extensions
  289. $extended_entry_type->asset_type = self::OBJECT_ASSET;
  290. $extended_entry_type->type = self::TYPE_UNKNOWN;
  291. }
  292. }
  293. return $extended_entry_type;
  294. }
  295. private static function getUrlAndName ( $entry )
  296. {
  297. $data = kFileSyncUtils::getReadyLocalFilePathForKey($entry->getSyncKey(entry::FILE_SYNC_ENTRY_SUB_TYPE_DATA)); // replaced__getDataPath
  298. $entry_type = self::getEntryType ( $entry );
  299. if ( $entry_type->type == self::TYPE_RTMP )
  300. {
  301. // the url should be where the RTMP service is
  302. $url = self::getRTMPPath ();
  303. // the name should start with the content directory
  304. // and should not include the file extension !
  305. $name = pathinfo($data, PATHINFO_DIRNAME) . "/" . kFile::getFileNameNoExtension( $data );
  306. }
  307. else
  308. {
  309. $url = requestUtils::getHost() . $data ;
  310. $name = pathinfo($data, PATHINFO_BASENAME);
  311. }
  312. $url_name = new urlName ();
  313. $url_name->url = $url;
  314. $url_name->name = $name;
  315. return $url_name;
  316. }
  317. private function beginAssetLists ()
  318. {
  319. if ( $this->m_video_assets == NULL ) $this->m_video_assets .= "<VideoAssets>" . "\n";
  320. if ( $this->m_audio_assets == NULL ) $this->m_audio_assets .= "<AudioAssets>" . "\n" ;
  321. if ( $this->m_voice_assets == NULL ) $this->m_voice_assets .= "<VoiceAssets>" . "\n" ;
  322. if ( $this->m_object_assets == NULL ) $this->m_object_assets .= "<LoaderObjectAssets>" . "\n";
  323. }
  324. private function finalizeAssetLists ()
  325. {
  326. if ( $this->m_video_assets != NULL ) $this->m_video_assets .= "</VideoAssets>" . "\n" ;
  327. if ( $this->m_audio_assets != NULL ) $this->m_audio_assets .= "</AudioAssets>" . "\n" ;
  328. if ( $this->m_voice_assets != NULL ) $this->m_voice_assets .= "</VoiceAssets>" . "\n" ;
  329. if ( $this->m_object_assets != NULL ) $this->m_object_assets .= "</LoaderObjectAssets>" . "\n";
  330. }
  331. private static function getContentPath ()
  332. {
  333. return requestUtils::getHost () ;
  334. }
  335. private static function getRTMPPath ()
  336. {
  337. $url = "rtmp://";
  338. $url .= $_SERVER['HTTP_HOST'];
  339. // add herd-coded the kplayer service
  340. $url .= ":1935/kplayer/_definst_";
  341. return $url;
  342. }
  343. }
  344. ?>