Esempio n. 1
0
 /**
  * @param string                          $key
  * @param CM_Model_StreamChannel_Abstract $channel
  * @return CM_Model_Stream_Publish|null
  */
 public static function findByKeyAndChannel($key, CM_Model_StreamChannel_Abstract $channel)
 {
     $id = CM_Db_Db::select('cm_stream_publish', 'id', array('key' => (string) $key, 'channelId' => $channel->getId()))->fetchColumn();
     if (!$id) {
         return null;
     }
     return new static($id);
 }
Esempio n. 2
0
 public function synchronize()
 {
     $startStampLimit = time() - 3;
     $status = array();
     foreach (CM_Stream_Video::getInstance()->getServers() as $serverId => $wowzaServer) {
         $singleStatus = CM_Params::decode($this->_fetchStatus($wowzaServer['privateIp']), true);
         foreach ($singleStatus as $streamName => $publish) {
             $publish['serverId'] = $serverId;
             $publish['serverHost'] = $wowzaServer['privateIp'];
             $status[$streamName] = $publish;
         }
     }
     $streamChannels = $this->_getStreamChannels();
     foreach ($status as $streamName => $publish) {
         /** @var CM_Model_StreamChannel_Abstract $streamChannel */
         $streamChannel = CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamName, $this->getType());
         if (!$streamChannel || !$streamChannel->getStreamPublishs()->findKey($publish['clientId'])) {
             $this->_stopClient($publish['clientId'], $publish['serverHost']);
         }
         foreach ($publish['subscribers'] as $clientId => $subscribe) {
             if (!$streamChannel || !$streamChannel->getStreamSubscribes()->findKey($clientId)) {
                 $this->_stopClient($clientId, $publish['serverHost']);
             }
         }
     }
     /** @var CM_Model_StreamChannel_Abstract $streamChannel */
     foreach ($streamChannels as $streamChannel) {
         if (!$streamChannel->hasStreams()) {
             $streamChannel->delete();
             continue;
         }
         /** @var CM_Model_Stream_Publish $streamPublish */
         $streamPublish = $streamChannel->getStreamPublishs()->getItem(0);
         if ($streamPublish) {
             if ($streamPublish->getStart() > $startStampLimit) {
                 continue;
             }
             if (!isset($status[$streamChannel->getKey()])) {
                 $this->unpublish($streamChannel->getKey());
             }
         }
         /** @var CM_Model_Stream_Subscribe $streamSubscribe */
         foreach ($streamChannel->getStreamSubscribes() as $streamSubscribe) {
             if ($streamSubscribe->getStart() > $startStampLimit) {
                 continue;
             }
             if (!isset($status[$streamChannel->getKey()]['subscribers'][$streamSubscribe->getKey()])) {
                 $this->unsubscribe($streamChannel->getKey(), $streamSubscribe->getKey());
             }
         }
     }
 }
Esempio n. 3
0
 public function testSynchronizeMissingInWowza()
 {
     $streamChannel = CMTest_TH::createStreamChannel();
     $streamPublish = CMTest_TH::createStreamPublish(null, $streamChannel);
     $streamSubscribe = CMTest_TH::createStreamSubscribe(null, $streamChannel);
     $wowza = $this->getMock('CM_Stream_Adapter_Video_Wowza', array('_fetchStatus'));
     $json = $this->_generateWowzaData(array());
     $wowza->expects($this->any())->method('_fetchStatus')->will($this->returnValue($json));
     /** @var $wowza CM_Stream_Video */
     $wowza->synchronize();
     $this->assertEquals($streamChannel, CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamChannel->getKey(), $wowza->getType()));
     $this->assertEquals($streamPublish, CM_Model_Stream_Publish::findByKeyAndChannel($streamPublish->getKey(), $streamChannel));
     $this->assertEquals($streamSubscribe, CM_Model_Stream_Subscribe::findByKeyAndChannel($streamSubscribe->getKey(), $streamChannel));
     CMTest_TH::timeForward(5);
     $wowza->synchronize();
     $this->assertNull(CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamChannel->getKey(), $wowza->getType()));
     $this->assertNull(CM_Model_Stream_Publish::findByKeyAndChannel($streamPublish->getKey(), $streamChannel));
     $this->assertNull(CM_Model_Stream_Subscribe::findByKeyAndChannel($streamSubscribe->getKey(), $streamChannel));
 }
Esempio n. 4
0
 public function __construct(CM_Model_StreamChannel_Abstract $streamChannel)
 {
     $source = new CM_PagingSource_Sql('DISTINCT `userId`', 'cm_stream_publish', '`channelId` = ' . $streamChannel->getId());
     $source->enableCache();
     parent::__construct($source);
 }
Esempio n. 5
0
 /**
  * @param CM_Model_StreamChannel_Abstract $streamChannel
  * @return boolean
  */
 public function contains(CM_Model_StreamChannel_Abstract $streamChannel)
 {
     return in_array(array('id' => $streamChannel->getId(), 'type' => $streamChannel->getType()), $this->getItemsRaw());
 }
Esempio n. 6
0
 /**
  * @return CM_Model_StreamChannel_Abstract
  */
 public function getStreamChannel()
 {
     return CM_Model_StreamChannel_Abstract::factory($this->_get('channelId'));
 }
Esempio n. 7
0
File: TH.php Progetto: aladin1394/CM
 /**
  * @param int|null $type
  * @param int|null $adapterType
  * @return CM_Model_StreamChannel_Abstract
  */
 public static function createStreamChannel($type = null, $adapterType = null)
 {
     if (null === $type) {
         $type = CM_Model_StreamChannel_Video::getTypeStatic();
     }
     if (null === $adapterType) {
         $adapterType = CM_Stream_Adapter_Video_Wowza::getTypeStatic();
     }
     $data = array('key' => rand(1, 10000) . '_' . rand(1, 100));
     if (CM_Model_StreamChannel_Video::getTypeStatic() == $type) {
         $data['width'] = 480;
         $data['height'] = 720;
         $data['serverId'] = 1;
         $data['thumbnailCount'] = 0;
         $data['adapterType'] = $adapterType;
     }
     return CM_Model_StreamChannel_Abstract::createType($type, $data);
 }
Esempio n. 8
0
 protected function _onDelete()
 {
     CM_Db_Db::delete('cm_streamChannel_video', array('id' => $this->getId()));
     parent::_onDelete();
 }
Esempio n. 9
0
 public function testCreate()
 {
     $streamChannel = CM_Model_StreamChannel_Abstract::createType(CM_Model_StreamChannel_Message::getTypeStatic(), array('key' => 'foo1', 'adapterType' => CM_MessageStream_Adapter_SocketRedis::getTypeStatic()));
     $this->assertInstanceOf('CM_Model_StreamChannel_Message', $streamChannel);
     try {
         CM_Model_StreamChannel_Abstract::createType(CM_Model_StreamChannel_Message::getTypeStatic(), array('key' => 'foo1', 'adapterType' => CM_MessageStream_Adapter_SocketRedis::getTypeStatic()));
         $this->fail();
     } catch (CM_Db_Exception $e) {
         $this->assertContains('Duplicate entry', $e->getMessage());
     }
     CM_Model_StreamChannel_Abstract::createType(CM_Model_StreamChannel_Message::getTypeStatic(), array('key' => 'foo1', 'adapterType' => 2));
 }
Esempio n. 10
0
 public function testCreate()
 {
     /** @var CM_Model_StreamChannel_Abstract $streamChannel */
     $streamChannel = CM_Model_StreamChannel_Abstract::createType(CM_Model_StreamChannel_Message::getTypeStatic(), array('key' => 'foo1', 'adapterType' => CM_MessageStream_Adapter_SocketRedis::getTypeStatic()));
     $this->assertInstanceOf('CM_Model_StreamChannel_Message', $streamChannel);
     $this->assertSame('foo1', $streamChannel->getKey());
     $this->assertEquals(CM_MessageStream_Adapter_SocketRedis::getTypeStatic(), $streamChannel->getAdapterType());
     $this->assertSame(time(), $streamChannel->getCreateStamp());
     /** @var CM_Model_StreamChannel_Abstract $channel1 */
     $channel1 = CM_Model_StreamChannel_Abstract::createType(CM_Model_StreamChannel_Message::getTypeStatic(), ['key' => 'foo', 'adapterType' => CM_MessageStream_Adapter_SocketRedis::getTypeStatic()]);
     /** @var CM_Model_StreamChannel_Abstract $channel2 */
     $channel2 = CM_Model_StreamChannel_Abstract::createType(CM_Model_StreamChannel_Message::getTypeStatic(), ['key' => 'foo', 'adapterType' => CM_MessageStream_Adapter_SocketRedis::getTypeStatic()]);
     $this->assertInstanceOf('CM_Model_StreamChannel_Message', $channel1);
     $this->assertInstanceOf('CM_Model_StreamChannel_Message', $channel2);
     $this->assertSame($channel1->getId(), $channel2->getId());
     $this->assertSame($channel1->getCreateStamp(), $channel2->getCreateStamp());
 }
Esempio n. 11
0
 public function testSynchronizeMissingInJanus()
 {
     $streamChannel = CMTest_TH::createStreamChannel(null, CM_Janus_Service::getTypeStatic());
     $streamPublish = CMTest_TH::createStreamPublish(null, $streamChannel);
     $streamSubscribe = CMTest_TH::createStreamSubscribe(null, $streamChannel);
     $existingStreamChannel = CMTest_TH::createStreamChannel(null, CM_Janus_Service::getTypeStatic());
     $existingStreamPublish = CMTest_TH::createStreamPublish(null, $existingStreamChannel);
     $existingStreamSubscribe = CMTest_TH::createStreamSubscribe(null, $existingStreamChannel);
     $emptyStreamChannel = CMTest_TH::createStreamChannel(null, CM_Janus_Service::getTypeStatic());
     $location = $this->mockClass('CM_Geo_Point')->newInstanceWithoutConstructor();
     $server1 = $this->mockClass('CM_Janus_Server')->newInstance([1, 'key', 'http://mock', 'ws://mock', [], $location]);
     /** @var CM_Janus_ServerList|\Mocka\AbstractClassTrait $serverList */
     $serverList = $this->mockObject('CM_Janus_ServerList');
     $serverList->mockMethod('getAll')->set([$server1]);
     /** @var CM_Janus_HttpApiClient|\Mocka\AbstractClassTrait $httpApiClient */
     $httpApiClient = $this->mockClass('CM_Janus_HttpApiClient')->newInstanceWithoutConstructor();
     $httpApiClient->mockMethod('fetchStatus')->set([['id' => $existingStreamPublish->getKey(), 'channelName' => $existingStreamChannel->getKey(), 'isPublish' => true], ['id' => $existingStreamSubscribe->getKey(), 'channelName' => $existingStreamChannel->getKey(), 'isPublish' => false]]);
     $janus = new CM_Janus_Service($serverList, $httpApiClient);
     $janus->synchronize();
     $this->assertEquals($streamChannel, CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamChannel->getKey(), $janus->getType()));
     $this->assertEquals($streamPublish, CM_Model_Stream_Publish::findByKeyAndChannel($streamPublish->getKey(), $streamChannel));
     $this->assertEquals($streamSubscribe, CM_Model_Stream_Subscribe::findByKeyAndChannel($streamSubscribe->getKey(), $streamChannel));
     $this->assertEquals($existingStreamChannel, CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($existingStreamChannel->getKey(), $janus->getType()));
     $this->assertEquals($existingStreamPublish, CM_Model_Stream_Publish::findByKeyAndChannel($existingStreamPublish->getKey(), $existingStreamChannel));
     $this->assertEquals($existingStreamSubscribe, CM_Model_Stream_Subscribe::findByKeyAndChannel($existingStreamSubscribe->getKey(), $existingStreamChannel));
     $this->assertNull(CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($emptyStreamChannel->getKey(), $janus->getType()));
     CMTest_TH::timeForward(5);
     $janus->synchronize();
     $this->assertNull(CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamChannel->getKey(), $janus->getType()));
     $this->assertNull(CM_Model_Stream_Publish::findByKeyAndChannel($streamPublish->getKey(), $streamChannel));
     $this->assertNull(CM_Model_Stream_Subscribe::findByKeyAndChannel($streamSubscribe->getKey(), $streamChannel));
     $this->assertEquals($existingStreamChannel, CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($existingStreamChannel->getKey(), $janus->getType()));
     $this->assertEquals($existingStreamPublish, CM_Model_Stream_Publish::findByKeyAndChannel($existingStreamPublish->getKey(), $existingStreamChannel));
     $this->assertEquals($existingStreamSubscribe, CM_Model_Stream_Subscribe::findByKeyAndChannel($existingStreamSubscribe->getKey(), $existingStreamChannel));
 }
Esempio n. 12
0
 /**
  * @param string $streamName
  * @param string $clientKey
  */
 public function unsubscribe($streamName, $clientKey)
 {
     $streamName = (string) $streamName;
     $clientKey = (string) $clientKey;
     /** @var CM_Model_StreamChannel_Abstract $streamChannel */
     $streamChannel = CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamName, $this->getType());
     if (!$streamChannel) {
         return;
     }
     $streamSubscribe = $streamChannel->getStreamSubscribes()->findKey($clientKey);
     if ($streamSubscribe) {
         $streamSubscribe->delete();
     }
     if (!$streamChannel->hasStreams()) {
         $streamChannel->delete();
     }
 }
Esempio n. 13
0
 /**
  * @param CM_Model_StreamChannel_Abstract $streamChannel
  */
 public function __construct(CM_Model_StreamChannel_Abstract $streamChannel)
 {
     $source = new CM_PagingSource_Sql('`id`', 'cm_stream_subscribe', '`channelId` = ' . $streamChannel->getId());
     $source->enableCache();
     return parent::__construct($source);
 }
Esempio n. 14
0
File: TH.php Progetto: cargomedia/cm
 /**
  * @param int|null    $type
  * @param int|null    $adapterType
  * @param string|null $mediaId
  * @return CM_Model_StreamChannel_Abstract
  */
 public static function createStreamChannel($type = null, $adapterType = null, $mediaId = null)
 {
     if (null === $type) {
         $type = CM_Model_StreamChannel_Media::getTypeStatic();
     }
     if (null === $adapterType) {
         $adapterType = CM_Janus_Service::getTypeStatic();
     }
     $data = array('key' => rand(1, 10000) . '_' . rand(1, 100));
     $className = CM_Model_Abstract::getClassName($type);
     if ('CM_Model_StreamChannel_Media' === $className || is_subclass_of($className, 'CM_Model_StreamChannel_Media')) {
         $mediaId = null !== $mediaId ? (string) $mediaId : null;
         $data['width'] = 480;
         $data['height'] = 720;
         $data['serverId'] = 1;
         $data['adapterType'] = $adapterType;
         $data['mediaId'] = $mediaId;
     }
     return CM_Model_StreamChannel_Abstract::createType($type, $data);
 }
Esempio n. 15
0
 /**
  * @return CM_Model_StreamChannel_Abstract|null
  */
 public function findStreamChannel()
 {
     return CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($this->getKey(), $this->getAdapterType());
 }
Esempio n. 16
0
 public function __construct(CM_Model_StreamChannel_Abstract $streamChannel)
 {
     $pagings = array($streamChannel->getPublishers(), $streamChannel->getSubscribers());
     $source = new CM_PagingSource_Pagings($pagings, true);
     parent::__construct($source);
 }
Esempio n. 17
0
 /**
  * @param CM_Model_StreamChannel_Abstract $streamChannel
  */
 public function removeStreamChannel(CM_Model_StreamChannel_Abstract $streamChannel)
 {
     foreach ($streamChannel->getStreamSubscribes() as $streamSubscribe) {
         $streamSubscribe->delete();
     }
     foreach ($streamChannel->getStreamPublishs() as $streamPublish) {
         $streamPublish->delete();
     }
     $streamChannel->delete();
 }