Video.php 9.46 KB
<?php

namespace common\models;

use Yii;
use common\lib\QcloudApi\Client as QcloudApiClient;
use common\lib\QcloudApi\QcloudApi as Qapi;
use common\lib\YohonowApi\Request as YHNowApiReq;

/**
 * This is the model class for table "{{%video}}".
 *
 * @property string  $id
 * @property string  $title
 * @property string  $pic
 * @property string  $url
 * @property integer $app
 * @property integer $task_id
 * @property string  $live_title
 * @property string  $live_start_time
 * @property string  $live_end_time
 * @property string  $master_id
 * @property string  $room_id
 * @property integer $status
 * @property integer $create_time
 * @property string  $update_time
 */
class Video extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%video}}';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['task_id', 'live_start_time', 'live_end_time', 'master_id', 'room_id', 'status', 'like_num', 'audience_num', 'replay_num', 'create_time', 'update_time'], 'integer'],
            [['title', 'live_title'], 'string', 'max' => 100],
            [['pic', 'url'], 'string', 'max' => 255],
            [['app'], 'string', 'max' => 50],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'title' => 'Title',
            'pic' => 'Pic',
            'url' => 'Url',
            'app' => 'App',
            'task_id' => 'Task ID',
            'live_title' => 'Live Title',
            'live_start_time' => 'Live Start Time',
            'live_end_time' => 'Live End Time',
            'master_id' => 'Master ID',
            'room_id' => 'Room ID',
            'status' => 'Status',
            'like_num' => 'Like Num',
            'audience_num' => 'Audience Num',
            'replay_num' => 'Replay Num',
            'create_time' => 'Create Time',
            'update_time' => 'Update Time',
        ];
    }
    
    public function behaviors() {
        return [
            [
                'class' => \yii\behaviors\TimestampBehavior::className(),
                'createdAtAttribute' => 'create_time',
                'updatedAtAttribute' => 'update_time',
            ]
        ];
    }

    /**
     * 关联表-主播
     * @return type
     */
    public function getMaster()
    {
        return $this->hasOne(Master::className(), ['master_id' => 'master_id']);
    }

    /**
     * 关联表-主播
     * @return type
     */
    public function getRoom()
    {
        return $this->hasOne(Room::className(), ['room_id' => 'room_id']);
    }

    /**
     * 关联表-计数
     * @return type
     */
    public function getRoomNums()
    {
        return $this->hasOne(RoomNums::className(), ['room_id' => 'room_id']);
    }

    public function setVideoStart($room_id)
    {
        $transaction = $this->getDb()->beginTransaction();
        try {
            /*$qchannel = (new \yii\db\Query())
                ->select('channel_id')
                ->from('tbl_room_qchannel')
                ->where(['room_id' => $room_id])
                ->one();*/
            $room = (new \yii\db\Query())
                ->select('app,title,master_id')
                ->from('tbl_room')
                ->where(['room_id' => $room_id])
                ->one();
            $time = time();
            //此处有bug,channel_id必须要转成字符串,不然底层会转换成科学计数法的格式
            //$ret = QcloudApiClient::self()->CreateRecord(strval($qchannel['channel_id']), date('Y-m-d H:i:s',time()+120), '');
            //file_put_contents("/tmp/live.log",date('Y-m-d H:i:s')."|start ".var_export($ret,true),FILE_APPEND)."\n";
            if (1) {//$ret['code'] == 0
                $this->setAttributes([
                    'app'             => $room['app'],
                    'task_id'         => 0,//$ret['task_id']
                    'live_title'      => $room['title'],
                    'live_start_time' => $time,
                    'live_end_time'   => 0,
                    'master_id'       => $room['master_id'],
                    'room_id'         => $room_id,
                ]);
                //插入视频表
                if (!$this->insert()) {
                    throw new \Exception(current($this->getFirstErrors()));
                }
                //更新房间主表直播状态
                $result = Yii::$app->db->createCommand()
                    ->update('{{%room}}', ['living' => 1,'update_time'=>time()], ['room_id' => $room_id])
                    ->execute();
                if (!$result) {
                    throw new \Exception('tbl_room update error');
                }

                //该房间如果包含资讯业务线,那么要更新资讯那边状态
                if(in_array(\common\config\Params::YOHONOW,explode(',',$room['app']))){
                    $news_ret = YHNowApiReq::getInstance()->setLiveStat($room_id,1);
                    if(!$news_ret){
                        throw new \Exception(YHNowApiReq::getInstance()->errors);
                    }
                }

                /*------------清除弹幕相关redis--------------*/
                $cache_prefix = Yii::$app->params['cache_prefix'];
                //##主播app 向弹幕服务器发送开始命令时也清除,这里也清除是为了防止弹幕服务器连不上没有清掉
                //清掉在线马甲数
                Yii::$app->redisIm->del(sprintf($cache_prefix . ":vestnum_%s", $room_id));
                //清在线观看数
                Yii::$app->redisIm->del(sprintf($cache_prefix . ":audience_nums_room_%s", $room_id));
                //清点赞数
                Yii::$app->redisIm->del(sprintf($cache_prefix . ":like_numbers_room_%s", $room_id));
                //清直播状态
                Yii::$app->redisIm->del(sprintf($cache_prefix . ":play_stat_room_%s", $room_id));
                /*------------清除弹幕相关redis--------------*/
                $transaction->commit();
                return true;
            } else {
                throw new \Exception(QcloudApiClient::self()->error());
            }
        } catch (\Exception $e) {
            $transaction->rollBack();
            return false;
        }
    }

    public function setVideoStop($room_id)
    {
        $transaction = $this->getDb()->beginTransaction();
        try {
            /*$qchannel = (new \yii\db\Query())
                ->select('channel_id')
                ->from('tbl_room_qchannel')
                ->where(['room_id' => $room_id])
                ->one();*/
            $video = $this->find()
                ->where(['room_id' => $room_id, 'live_end_time' => 0])
                ->orderBy(['live_start_time' => SORT_DESC])
                ->one();
            if ($video) {
                //此处有bug,channel_id必须要转成字符串,不然底层会转换成科学计数法的格式
                //$ret = QcloudApiClient::self()->StopRecord(strval($qchannel['channel_id']), $video['task_id']);
                //file_put_contents("/tmp/live.log",date('Y-m-d H:i:s')."|stop ".var_export($ret,true),FILE_APPEND)."\n";
                $room = (new \yii\db\Query())
                    ->select('app,title,master_id')
                    ->from('tbl_room')
                    ->where(['room_id' => $room_id])
                    ->one();
                if (1) {//$ret['code'] == 0
                    $video->setAttributes([
                        'live_end_time' => time(),
                    ]);
                    if (!$video->update()) {
                        throw new \Exception(current($this->getFirstErrors()));
                    }
                    $living_status = $room['starting_time'] > time() ? 0:2;
                    //更新房间主表直播状态
                    $result = Yii::$app->db->createCommand()
                        ->update('{{%room}}', ['living' => $living_status,'update_time'=>time()], ['room_id' => $room_id])
                        ->execute();

                    if (!$result) {
                        throw new \Exception('tbl_room update error');
                    }
                    //该房间如果包含资讯业务线,那么要更新资讯那边状态
                    if(in_array(\common\config\Params::YOHONOW,explode(',',$room['app']))){
                        $news_ret = YHNowApiReq::getInstance()->setLiveStat($room_id,0);
                        if(!$news_ret){
                            throw new \Exception(YHNowApiReq::getInstance()->errors);
                        }
                    }
                    $transaction->commit();
                    return true;
                } else {
                    throw new \Exception(QcloudApiClient::self()->error());
                    return false;
                }
            }else{
                throw new \Exception("没有找到相应视频信息");
                return false;
            }
        } catch (\Exception $e) {
            $transaction->rollBack();
            throw new \Exception($e->getMessage());
            return false;
        }
    }

    /**
     * 获取当前正在直播的视频
     * @param $room_id
     * @return array|null|\yii\db\ActiveRecord
     */
    public function getCurrentLivingVideo($room_id)
    {
        $video = $this->find()
            ->where(['room_id' => $room_id, 'live_end_time' => 0])
            ->orderBy(['live_start_time' => SORT_DESC])
            ->one();
        return $video;
    }
}