/** * @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); }
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()); } } } }
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)); }
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); }
/** * @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()); }
/** * @return CM_Model_StreamChannel_Abstract */ public function getStreamChannel() { return CM_Model_StreamChannel_Abstract::factory($this->_get('channelId')); }
/** * @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); }
protected function _onDelete() { CM_Db_Db::delete('cm_streamChannel_video', array('id' => $this->getId())); parent::_onDelete(); }
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)); }
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()); }
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)); }
/** * @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(); } }
/** * @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); }
/** * @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); }
/** * @return CM_Model_StreamChannel_Abstract|null */ public function findStreamChannel() { return CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($this->getKey(), $this->getAdapterType()); }
public function __construct(CM_Model_StreamChannel_Abstract $streamChannel) { $pagings = array($streamChannel->getPublishers(), $streamChannel->getSubscribers()); $source = new CM_PagingSource_Pagings($pagings, true); parent::__construct($source); }
/** * @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(); }