love_php/app/Http/Controllers/Server/App/LiveController.php
2026-04-02 09:20:51 +08:00

131 lines
4.6 KiB
PHP

<?php
namespace App\Http\Controllers\Server\App;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Live\Anchor;
use App\Models\Server\MerchantLive;
use App\Models\Server\MerchantLiveBanLog;
use App\Models\Server\MerchantLiveLog;
use App\Models\User;
use App\Models\WangYiYunUser;
use App\Services\IMService;
use Illuminate\Support\Facades\Redis;
class LiveController extends Controller
{
//直播列表
public function liveList(Request $request)
{
$merchant_id = $request->account_id;
$status = $request->status;
$lives = MerchantLive::where('merchant_id', $merchant_id)
->where('is_show',1)
->wherein('status',$status)
->orderBy('is_top','desc')
->orderBy('top_time','desc')
->orderBy('id','desc')
->paginate();
foreach ($lives as $key => $value) {
$value->channel;
}
return $this->success('ok',$lives);
}
// 开始直播
public function live(Request $request,$id)
{
$merchant_id = $request->account_id;
$accid = 1000000+$merchant_id;
$live = MerchantLive::where('id',$id)->first();
if(!$live) return $this->failure('直播不存在');
//创建主播直播流
$channel_name = env('APP_ENV').'_bussiness_live_id_'.$live->id;
$channel = $live->createLiveChannel($channel_name);
if (empty($channel))
return $this->failure('创建直播流失败。');
//创建互动直播
$room = $live->channelRoom();
$im = new IMService();
if (empty($room) || !in_array($room['stats'] , [1,2,3])) {
$result = $im->createChannelV2($live->title, $accid);
if(!isset($result['cid']))
return $this->failure('创建音视频房间失败');
$live->channel_id = $result['cid'];
$live->save();
// 增加房间推流任务
$result = $live->addRtmpTask($accid);
if (empty($result)) return $this->failure('房间推流失败。');
}
$live->status = 1;
$live->save();
$live->addLiveLog();
$anchor = Anchor::select('name','pic')->where('m_id',$live->merchant->id)->first();
$live->pic = $anchor->pic??User::DefaultAvatar;
$live->name = $anchor->name??'匿名用户';
$live->pv = Redis::zscore('merchantLive',$id)??0;
$live->uid = 1000000+$merchant_id;
$url = urlencode(env('APP_URL').'/pu/#/ordinaryWatchLive/'.$id);
$live->share_url = env('APP_URL').'/api/official/live/wechat/FamilyAuth?from_openid='.$anchor->openid.'&merchant_id='.$merchant_id.'&url='.$url;
unset($live->merchant);
unset( $live->channel);
$live->channel = $channel;
$live->chat_token = WangYiYunUser::where('accid',$accid)->value('token');
$data = ['channel_name'=>$live->title,'uid'=>$live->uid];
$curl_result = $im->getTokenV2($data);
if($curl_result['code'] == 200 && !empty($curl_result['token'])){
$live->live_token = $curl_result['token'];
}
return $this->success('ok',$live);
}
// 直播详情
public function liveDetail(Request $request,$id)
{
$live = MerchantLive::select('id','title')->where('id',$id)->first();
$live['pv'] = Redis::zscore('merchantLive',$id)?:0;
return $this->success('ok',$live);
}
// 结束直播
public function offLive(Request $request,$id)
{
$live = MerchantLive::where('id',$id)->first();
if(!$live) return $this->failure('直播不存在');
$live->status =2;
$live->save();
MerchantLiveLog::where('live_id',$id)->update(['end_time'=>now()]);
return $this->success('ok');
}
/**获取聊天室的地址 */
public function getChatroomAddress(Request $request){
$merchant_id = $request->account_id;
$accid = 1000000+$merchant_id;
$im = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
$url = $im->getChatroomAddress($request->roomid,$accid,$request->clienttype);
return $this->success('ok', ['chatroomAddress'=>$url]);
}
// 禁言
public function mute(Request $request)
{
# code...
$mute = new MerchantLiveBanLog();
$mute->merchant_id = $request->merchant_id;
$mute->m_user_id = $request->m_user_id;
$mute->start_time = $request->start_time;
$mute->end_time = $request->end_time;
$mute->live_id = $request->live_id;
$mute->Operator = $request->Operator;
$mute->reason = $request->reason;
$mute->save();
return $this->success('ok');
}
}