Files

147 lines
4.8 KiB
PHP

<?php
namespace app\api\controller\live;
use app\common\controller\Api;
/**
* 直播间
*/
class Room extends Api
{
// 无需登录的接口,*表示全部
protected $noNeedLogin = [];
protected $noNeedRight = '*';
protected $modal;
public function _initialize()
{
parent::_initialize();
$this->modal = new \app\api\model\live\Message;
$this->playbackModal = new \app\api\model\live\Playback;
}
/**
* 获取直播间详情
* @return void
*/
public function getRoomDetail(){
$courseId = input("course_id");
//判断是否已订阅
if(!\app\common\model\user\Subscription::getSubscriptionAuth($this->auth->id,$courseId)){
$this->error("暂未订阅该课程");
}
$data = (new \app\common\model\live\Room)->courseGetRoom($courseId);
if(!$data){
$this->error("获取直播间信息异常,请刷新重试");
}
try{
$data['status'] = (new \app\common\model\live\Room)->getRoomStatus($courseId);
}catch (\Exception $e){
$data['status'] = 'offline';
}
$data['status_text'] = __($data['status']);
$data['message_pubkey'] = \app\common\model\config\System::getConfig('aodianyun')['pubkey'];
// 直播间使用的消息服务商统一由全局配置决定,历史直播间也随全局切换生效
$data['message_provider'] = \app\common\library\live\message\Manager::getGlobalProviderName();
// 消息服务是否已开启(管理员可在后台关闭)
$data['message_enabled'] = \app\common\library\live\message\Manager::isMessageEnabled() ? 1 : 0;
// 阿里云模式下,额外返回客户端 SDK 所需的 AppId 与 AppSign
if ($data['message_provider'] === 'aliyun') {
$aliyunMessageConfig = \app\common\model\config\System::getConfig('aliyun_message');
$data['aliyun_app_id'] = (is_array($aliyunMessageConfig) && isset($aliyunMessageConfig['app_id'])) ? $aliyunMessageConfig['app_id'] : '';
$data['aliyun_app_sign'] = (is_array($aliyunMessageConfig) && isset($aliyunMessageConfig['app_sign'])) ? $aliyunMessageConfig['app_sign'] : '';
}
$data['user_count'] = (new \app\common\model\user\Study)->where([
'course_id'=>$courseId
])->group('user_id')->count();
return $this->success("操作成功",$data);
}
/**
* 获取回放视频
* @return void
*/
public function getPlaybackList(){
$courseId = input("course_id");
//判断是否已订阅
if(!\app\common\model\user\Subscription::getSubscriptionAuth($this->auth->id,$courseId)){
$this->error("暂未订阅该课程");
}
$data = $this->playbackModal->getVideoList($courseId);
return $this->success("获取成功",$data);
}
/**
* 获取直播间状态
* @return void
*/
public function getRoomStatus(){
$courseId = input("course_id");
//判断是否已订阅
if(!\app\common\model\user\Subscription::getSubscriptionAuth($this->auth->id,$courseId)){
$this->error("暂未订阅该课程");
}
$data = (new \app\common\model\live\Room)->getRoomStatus($courseId);
return $this->success("获取成功",$data);
}
/**
* 获取在线观看人数
* 数据来源为消息服务(奥点云/阿里云)的在线用户数
* 前端在开启"观看人数"且消息服务已开启时轮询此接口
* @return void
*/
public function getOnlineUserNum(){
$courseId = input("course_id");
//判断是否已订阅
if(!\app\common\model\user\Subscription::getSubscriptionAuth($this->auth->id,$courseId)){
$this->error("暂未订阅该课程");
}
// 消息服务未开启时直接返回 0
if(!\app\common\library\live\message\Manager::isMessageEnabled()){
return $this->success("获取成功", 0);
}
$roomData = (new \app\common\model\live\Room)->courseGetRoom($courseId);
if(!$roomData || !$roomData['message_topic']){
return $this->success("获取成功", 0);
}
$provider = \app\common\library\live\message\Manager::getGlobalProviderName();
$onlineData = \app\common\library\live\Message::getOnlineUserByProvider($provider, $roomData['message_topic']);
if($onlineData && isset($onlineData['total'])){
return $this->success("获取成功", $onlineData['total']);
}
// 阿里云超级大群等场景无法获取具体数量时返回 0,保持接口可用
if($provider === 'aliyun'){
return $this->success("获取成功", 0);
}
return $this->success("获取成功", 0);
}
}