200, 'msg' => $data['msg'], 'data' => $data['data']]; }else{ return ['code' => 201, 'msg' => $data['msg'], 'data' => null]; } // dump($data); } //获取增量歌曲列表 public function agora_new_song_list($page, $page_limit, $lastUpdateTime = 0){ $config = get_system_config(); $agora_app_id = $config['agora_app_id'];//cc71b8df2c254c35bc96fbf591b6801f $requestId = 'df2ce922m28xy80z80i3j7tq2vbooetv'; $pageType = $page; // $pageCode = $song_code; $size = $page_limit; $agora_app_key = $config['agora_app_key']; $agora_app_secret = $config['agora_app_secret']; $credentials = $agora_app_key . ":" . $agora_app_secret; // 使用 base64 进行编码 $AuthorizationHeader = base64_encode($credentials); $postUrl = 'https://api.agora.io/cn/v1.0/projects/'.$agora_app_id.'/ktv-service/api/serv/songs-incr?requestId='.$requestId.'&lastUpdateTime='.$lastUpdateTime.'&size='.$size.'&pageType='.$pageType;//'&pageType='.$pageType.'&pageCode='.$pageCode.'&size='.$size. $headerArray =array( "Content-type:application/json", "Accept:application/json", "Authorization:Basic ".$AuthorizationHeader, ); $ch = curl_init();//初始化curl curl_setopt($ch, CURLOPT_URL, $postUrl);//抓取指定网页 // curl_setopt($ch, CURLOPT_HEADER, 1);//设置header curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上 // curl_setopt($ch, CURLOPT_POST, 1);//post提交方式 // curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);CURLOPT_RETURNTRANSFER curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray); curl_setopt($ch, CURLOPT_TIMEOUT, 20); $data = curl_exec($ch);//运行curl curl_close($ch); $data = json_decode($data, true); if($data['code'] == 0){ return ['code' => 200, 'msg' => $data['msg'], 'data' => $data['data']]; }else{ return ['code' => 201, 'msg' => $data['msg'], 'data' => null]; } } //获取指定歌曲详情 public function agora_song_info($song_code, $lyric_type){ $config = get_system_config(); $agora_app_id = $config['agora_app_id'];//cc71b8df2c254c35bc96fbf591b6801f $requestId = 'df2ce922m28xy80z80i3j7tq2vbooetv'; $songCode = $song_code; $agora_app_key = $config['agora_app_key']; $agora_app_secret = $config['agora_app_secret']; $credentials = $agora_app_key . ":" . $agora_app_secret; $lyric_type = 1; // 使用 base64 进行编码 $AuthorizationHeader = base64_encode($credentials); $postUrl = 'https://api.agora.io/cn/v1.0/projects/'.$agora_app_id.'/ktv-service/api/serv/song-url?requestId='.$requestId.'&lyricType='.$lyric_type.'&songCode='.$songCode;//'&pageType='.$pageType.'&pageCode='.$pageCode.'&size='.$size. $headerArray =array( "Content-type:application/json", "Accept:application/json", "Authorization:Basic ".$AuthorizationHeader, ); $ch = curl_init();//初始化curl curl_setopt($ch, CURLOPT_URL, $postUrl);//抓取指定网页 // curl_setopt($ch, CURLOPT_HEADER, 1);//设置header curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上 // curl_setopt($ch, CURLOPT_POST, 1);//post提交方式 // curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);CURLOPT_RETURNTRANSFER curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray); curl_setopt($ch, CURLOPT_TIMEOUT, 20); $data = curl_exec($ch);//运行curl curl_close($ch); $data = json_decode($data, true); // dump($data);exit; if($data['code'] == 0){ return ['code' => 200, 'msg' => $data['msg'], 'data' => $data['data']]; }else{ return ['code' => 201, 'msg' => $data['msg'], 'data' => null]; } } //获取声网token信息 public function agora_token_info($uid, $room_id){ $config = get_system_config(); $agora_app_id = $config['agora_app_id']; $agora_app_certificate = $config['agora_app_certificate']; $agora_app_key = $config['agora_app_key']; $agora_app_secret = $config['agora_app_secret']; $agora = new \shengwang\Shengwang(); $Rtc_token = $agora->RtcTokenBuilder($uid, $room_id, 0, $agora_app_id, $agora_app_certificate); return $Rtc_token; } //同步热门歌单 public function synchro_agora_song_hot($hot_type){ $config = get_system_config(); $agora_app_id = $config['agora_app_id'];//cc71b8df2c254c35bc96fbf591b6801f $requestId = 'df2ce922m28xy80z80i3j7tq2vbooetv'; $agora_app_key = $config['agora_app_key']; $agora_app_secret = $config['agora_app_secret']; $credentials = $agora_app_key . ":" . $agora_app_secret; // 使用 base64 进行编码 $AuthorizationHeader = base64_encode($credentials); $postUrl = 'https://api.agora.io/cn/v1.0/projects/'.$agora_app_id.'/ktv-service/api/serv/song-hot?requestId='.$requestId.'&hotType='.$hot_type; $headerArray =array( "Content-type:application/json", "Accept:application/json", "Authorization:Basic ".$AuthorizationHeader, ); $ch = curl_init();//初始化curl curl_setopt($ch, CURLOPT_URL, $postUrl);//抓取指定网页 // curl_setopt($ch, CURLOPT_HEADER, 1);//设置header curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上 // curl_setopt($ch, CURLOPT_POST, 1);//post提交方式 // curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);CURLOPT_RETURNTRANSFER curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray); curl_setopt($ch, CURLOPT_TIMEOUT, 20); $data = curl_exec($ch);//运行curl curl_close($ch); $data = json_decode($data, true); if($data['code'] == 0){ return ['code' => 200, 'msg' => $data['msg'], 'data' => $data['data']]; }else{ return ['code' => 201, 'msg' => $data['msg'], 'data' => null]; } } /************************************分 割 线***********************************************************/ //同步热门歌单 public function synchro_hot_song($hot_type){ $time = date('Y-m-d').' 5:00:00'; $time = strtotime($time); //当天是否已同步 $map = []; $map[] = ['add_time', '>=', $time]; $hot_song = db::name('agora_song_hot')->where($map)->order('hid desc')->limit(1)->find(); if($hot_song){ return ['code' => 201, 'msg' => '今日已同步过热门歌单', 'data' => null]; } //获取热门歌单 $datas = model('Agora')->synchro_agora_song_hot($hot_type); if($datas['code'] == 200){ if(empty($datas['data']['list'])){ return['code' => 201, 'msg' => '暂无歌曲数据', 'data' => null]; }else{ $data = []; $data_array = []; foreach ($datas['data']['list'] as $k => $v){ $data['song_code'] = $v['songCode']; $data['num'] = $v['num']; $data['add_time'] = time(); $data_array[] = $data; } $result = db::name('agora_song_hot')->insertAll($data_array); if($result){ return ['code' => 200, 'msg' => '同步成功', 'data' => null]; }else{ return ['code' => 201, 'msg' => '同步失败', 'data' => null]; } } }else{ return ['code' => 201, 'msg' => $datas['msg'], 'data' => null]; } } //热歌榜单 public function hot_song_list(){ $data = db::name('agora_song_hot')->alias('a')->join('yy_agora_song b','a.song_code = b.song_code')->field('a.hid,a.song_code,a.num,b.song_name,b.poster,b.singer,duration')->order('hid asc')->limit(100)->select(); return ['code' => 200, 'msg' => '获取成功', 'data' => $data]; } //获得歌曲列表 public function song_list($name, $page, $page_limit){ $map = []; if(!empty($name)){ $map[] = ['song_name|singer', 'like', '%'.$name.'%']; } $data = db::name('agora_song')->where($map)->order('aid asc')->page($page, $page_limit)->select(); return ['code' => 200, 'msg' => '获取成功', 'data' => $data]; } //点歌 public function dot_song($uid, $rid, $song_code, $is_accapella){ $user_info = db::name('user')->find($uid); if(!$user_info){ return ['code' => 201, 'msg' => '该用户不存在', 'data' => null]; } $room_info = db::name('room')->where('rid', $rid)->find(); if(!$room_info){ return ['code' => 201, 'msg' => '该房间不存在', 'data' => null]; } $song = db::name('agora_song')->where('song_code', $song_code)->find(); if(!$song){ return ['code' => 201, 'msg' => '该歌曲不存在', 'data' => null]; } $map = []; $map[] = ['rid', '=', $rid]; $map[] = ['uid', '=', $uid]; $map[] = ['song_code', '=', $song_code]; $map[] = ['is_delete', '=', 1]; $song_dot = db::name('agora_song_dot')->where($map)->find(); if($song_dot){ return ['code' => 201, 'msg' => '该歌曲已点过', 'data' => null]; } //K歌厅点歌限制 if($room_info['cate_id'] == 27){ //当前是否已进唱歌模式 $auction_info = db::name('room_song_log')->where('rid', $rid)->where('is_delete', 1)->find(); if($auction_info){ $user_song_dot_arr = explode(',', $auction_info['uid_array']); if(in_array($uid, $auction_info)){ $where = []; $where[] = ['uid', '=', $uid]; $where[] = ['rsid', '=', $auction_info['id']]; $where[] = ['status', '>', 1]; $user_song_info = db::name('room_song_user_log')->where($where)->find(); if($user_song_info){ return ['code' => 201, 'msg' => '您已过了唱歌阶段无法点歌', 'data' => null]; } }else{ return ['code' => 201, 'msg' => '当前活动进行中无法点歌', 'data' => null]; } } } //练歌房一个用户只能点一首歌 // if($room_info['cate_id'] == 27){ // $map = []; // $map[] = ['rid', '=', $rid]; // $map[] = ['uid', '=', $uid]; // $map[] = ['song_code', '=', $song_code]; // $map[] = ['is_delete', '=', 1]; // $song_dot = db::name('agora_song_dot')->where($map)->find(); // if($song_dot){ // return ['code' => 201, 'msg' => '你有点歌的尚未唱完,无法再次点歌', 'data' => null]; // } // } $map = []; $map[] = ['rid', '=', $rid]; $map[] = ['uid', '=', $uid]; $map[] = ['is_delete', '=', 1]; $user_song_dot = db::name('agora_song_dot')->where($map)->find(); if($user_song_dot){ $update = []; $update['song_code'] = $song_code; $update['is_accapella'] = $is_accapella; $update['update_time'] = time(); $result = db::name('agora_song_dot')->where('did', $user_song_dot['did'])->update($update); }else{ $data = []; $data['rid'] = $rid; $data['uid'] = $uid; $data['song_code'] = $song_code; $data['is_accapella'] = $is_accapella; $data['add_time'] = time(); $result = db::name('agora_song_dot')->insert($data); } if($result){ $map = []; $map[] = ['a.rid', '=', $rid]; $map[] = ['a.is_delete', '=', 1]; $song_data = db::name('agora_song_dot')->alias('a')->join('yy_user b','a.uid = b.uid')->join('yy_agora_song c','c.song_code = a.song_code')->field('a.did,a.rid,a.uid,a.song_code,c.song_name,c.poster,c.singer,c.duration,b.base64_nick_name,a.is_accapella')->where($map)->select(); foreach ($song_data as $k => &$v){ $v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8'); } // dump($song_data); //socket播报 $push_data = []; $push_data['code'] = 401; $push_data['msg'] = "点歌房间播报"; $push_data['data'] = $song_data; model('api/WebSocketPush')->send_to_group($rid, $push_data); model('api/room')->push_room_micro_data($rid); return ['code' => 200, 'msg' => '点歌成功', 'data' => null]; }else{ return ['code' => 201, 'msg' => '点歌失败', 'data' => null]; } } //取消点歌 public function dot_song_del($uid, $rid, $song_code){ $user_info = db::name('user')->find($uid); if(!$user_info){ return ['code' => 201, 'msg' => '该用户不存在', 'data' => null]; } $room_info = db::name('room')->where('rid', $rid)->find(); if(!$room_info){ return ['code' => 201, 'msg' => '该房间不存在', 'data' => null]; } if(empty($song_code)){ return ['code' => 201, 'msg' => '参数错误', 'data' => null]; } $song_code = explode(',', $song_code); $map = []; $map[] = ['song_code', 'in', $song_code]; $song = db::name('agora_song')->where($map)->find(); if(!$song){ return ['code' => 201, 'msg' => '该歌曲不存在', 'data' => null]; } $map = []; $map[] = ['rid', '=', $rid]; $map[] = ['song_code', 'in', $song_code]; $map[] = ['is_delete', '=', 1]; if($room_info['room_owner_uid'] != $uid){ $map[] = ['uid', '=', $uid]; $song_dot = db::name('agora_song_dot')->where($map)->find(); if(!$song_dot){ return ['code' => 201, 'msg' => '你尚未点击该首歌曲', 'data' => null]; } } $data = []; $data['is_delete'] = 2; $data['delete_time'] = time(); $result = db::name('agora_song_dot')->where($map)->update($data); if($result){ $map = []; $map[] = ['a.rid', '=', $rid]; $map[] = ['a.is_delete', '=', 1]; $song_data = db::name('agora_song_dot')->alias('a')->join('yy_user b','a.uid = b.uid')->join('yy_agora_song c','c.song_code = a.song_code')->field('a.did,a.rid,a.uid,a.song_code,c.song_name,c.poster,c.singer,c.duration,b.base64_nick_name')->where($map)->select(); foreach ($song_data as $k => &$v){ $v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8'); } //socket播报 $push_data = []; $push_data['code'] = 401; $push_data['msg'] = "点歌房间播报"; $push_data['data'] = $song_data; model('api/WebSocketPush')->send_to_group($rid, $push_data); model('api/room')->push_room_micro_data($rid); return ['code' => 200, 'msg' => '取消成功', 'data' => null]; }else{ return ['code' => 201, 'msg' => '取消失败', 'data' => null]; } } //点歌列表 public function dot_song_list($rid){ $room_info = db::name('room')->where('rid', $rid)->find(); if(!$room_info){ return ['code' => 201, 'msg' => '该房间不存在', 'data' => null]; } $map = []; $map[] = ['a.rid', '=', $rid]; $map[] = ['a.is_delete', '=', 1]; $song_data = db::name('agora_song_dot')->alias('a')->join('yy_user b','a.uid = b.uid')->join('yy_agora_song c','c.song_code = a.song_code')->field('a.did,a.rid,a.uid,a.song_code,c.song_name,c.poster,c.singer,c.duration,b.base64_nick_name')->where($map)->order('did asc')->select(); foreach ($song_data as $k => &$v){ $v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8'); } return ['code' => 200, 'msg' => '点歌成功', 'data' => $song_data]; } public function agora_rtm_token_info($uid,$room_id) { // require_once Env::get('root_path') . 'extend/shengwang/Shengwang.php'; $config = get_system_config(); $agora_app_id = $config['agora_app_id']; $agora_app_certificate = $config['agora_app_certificate']; // $agora_app_key = $config['agora_app_key']; // $agora_app_secret = $config['agora_app_secret']; $agora = new \shengwang\Shengwang(); $Rtm_token = $agora->RtmTokenBuilders($uid, $agora_app_id, $agora_app_certificate,$room_id); return $Rtm_token; } //取消用户点歌 public function user_quit_song_del($uid, $rid){ //查询当前用户在该房间所点歌曲 $map = []; $map[] = ['rid', '=', $rid]; $map[] = ['uid', '=', $uid]; $map[] = ['is_delete', '=', 1]; $user_song_list = db::name('agora_song_dot')->where($map)->select(); if($user_song_list){ $update_data = []; $update_data['is_delete'] = 2; $update_data['delete_time'] = time(); $result = db::name('agora_song_dot')->where($map)->update($update_data); if($result){ $map = []; $map[] = ['a.rid', '=', $rid]; $map[] = ['a.is_delete', '=', 1]; $song_data = db::name('agora_song_dot')->alias('a')->join('yy_user b','a.uid = b.uid')->join('yy_agora_song c','c.song_code = a.song_code')->field('a.did,a.rid,a.uid,a.song_code,a.is_accapella,c.song_name,c.poster,c.singer,c.duration,b.base64_nick_name,b.sex')->where($map)->select(); foreach ($song_data as $k => &$v){ $v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8'); } //socket播报 $push_data = []; $push_data['code'] = 401; $push_data['msg'] = "点歌房间播报"; $push_data['data'] = $song_data; model('api/WebSocketPush')->send_to_group($rid, $push_data); model('api/room')->push_room_micro_data($rid); } } return true; } }