music.action.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | FANWE 直播系统
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2011 http://www.fanwe.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: 云淡风轻(1956838968@qq.com)
  8. // +----------------------------------------------------------------------
  9. class musicModule extends baseModule
  10. {
  11. /**
  12. * 添加音乐
  13. */
  14. public function add_music(){
  15. $root = array();
  16. $root['status'] = 1;
  17. if(!$GLOBALS['user_info']){
  18. $root['error'] = "用户未登陆,请先登陆.";
  19. $root['status'] = 0;
  20. $root['user_login_status'] = 0;//有这个参数: user_login_status = 0 时,表示服务端未登陆、要求登陆,操作
  21. }else{
  22. $m_config = load_auto_cache("m_config");//初始化手机端配置
  23. $music_type = intval($m_config['music_type']);
  24. $user_id = intval($GLOBALS['user_info']['id']);//用户ID
  25. $audio_id = strim($_REQUEST['audio_id']);//音乐id ====>通过这个,比较本地音乐是否存在
  26. if($music_type == 1){
  27. $audio_data = explode('&amp;',$audio_id);
  28. $audio_id = $audio_data[0];
  29. }
  30. $sql = "select audio_id from ".DB_PREFIX."user_music where audio_id = '".$audio_id."' and user_id = ".$user_id;
  31. if (!$GLOBALS['db']->getRow($sql)){
  32. $audio_link = strim($_REQUEST['audio_link']);//音乐下载地址
  33. $lrc_link = strim($_REQUEST['lrc_link']);//歌词下载地址
  34. $audio_name = strim($_REQUEST['audio_name']);//歌曲名
  35. $artist_name = strim($_REQUEST['artist_name']);//演唱者
  36. $time_len = strim($_REQUEST['time_len']);//时长
  37. $user_music = array();
  38. $user_music['user_id'] = $user_id;
  39. $user_music['audio_id'] = $audio_id;
  40. $user_music['audio_link'] = $audio_link;
  41. $user_music['lrc_link'] = $lrc_link;
  42. $user_music['audio_name'] = $audio_name;
  43. $user_music['artist_name'] = $artist_name;
  44. $user_music['create_time'] = NOW_TIME;
  45. $user_music['time_len'] = $time_len;
  46. $user_music['api_type'] = 0;
  47. if($music_type==1){
  48. $user_music['lrc_type'] = 0;
  49. $req = $this->get_lyric($lrc_link);
  50. $user_music['lrc_content'] = $req;
  51. $user_music['music_type'] = 1;
  52. }else{
  53. $lrc = $this->get_lrc($audio_id,0);
  54. $user_music['lrc_type'] = $lrc['lrc_type'];
  55. $user_music['lrc_content'] = $lrc['lrc_content'];
  56. $user_music['music_type'] = 0;
  57. }
  58. $GLOBALS['db']->autoExecute(DB_PREFIX."user_music", $user_music,"INSERT");
  59. $root['audio_id'] = $audio_id;
  60. }else{
  61. $root['error'] = "已经存在,无需再添加";
  62. $root['status'] = 1;
  63. }
  64. }
  65. ajax_return($root);
  66. }
  67. /**
  68. * 删除音乐
  69. */
  70. public function del_music(){
  71. $root = array();
  72. $root['status'] = 1;
  73. if(!$GLOBALS['user_info']){
  74. $root['error'] = "用户未登陆,请先登陆.";
  75. $root['status'] = 0;
  76. $root['user_login_status'] = 0;//有这个参数: user_login_status = 0 时,表示服务端未登陆、要求登陆,操作
  77. }else{
  78. $m_config = load_auto_cache("m_config");//初始化手机端配置
  79. $music_type = intval($m_config['music_type']);
  80. $user_id = intval($GLOBALS['user_info']['id']);//用户ID
  81. $audio_id = strim($_REQUEST['audio_id']);//音乐id
  82. if($music_type==1){
  83. $audio_data = explode('&amp;',$audio_id);
  84. $audio_id = $audio_data[0];
  85. }
  86. $sql = "delete from ".DB_PREFIX."user_music where audio_id = '".$audio_id."' and user_id = ".$user_id;
  87. $GLOBALS['db']->query($sql);
  88. $root['status'] = 1;
  89. }
  90. ajax_return($root);
  91. }
  92. /**
  93. * 用户的音乐列表
  94. */
  95. public function user_music(){
  96. $root = array();
  97. $root['status'] = 1;
  98. if(!$GLOBALS['user_info']){
  99. $root['error'] = "用户未登陆,请先登陆.";
  100. $root['status'] = 0;
  101. $root['user_login_status'] = 0;//有这个参数: user_login_status = 0 时,表示服务端未登陆、要求登陆,操作
  102. }else{
  103. $m_config = load_auto_cache("m_config");//初始化手机端配置
  104. $music_type = intval($m_config['music_type']);
  105. $user_id = intval($GLOBALS['user_info']['id']);//用户ID
  106. $page = intval($_REQUEST['p']);//取第几页数据
  107. if($page==0)$page = 1;
  108. $page_size=20;
  109. $limit = (($page-1)*$page_size).",".$page_size;
  110. $sql = "select audio_id,audio_link,lrc_link,audio_name,artist_name,time_len,api_type,music_type from ".DB_PREFIX."user_music where user_id = ".$user_id." and music_type=".$music_type." limit ".$limit;
  111. $list = $GLOBALS['db']->getAll($sql);
  112. foreach($list as $k=>$v){
  113. if($v['music_type']==1){
  114. $list[$k]['audio_id'] = $v['audio_id'].'&'.$v['audio_link'].'&'.$v['lrc_link'];
  115. }
  116. }
  117. $root['list'] = $list;
  118. if (count($list) == $page_size)
  119. $root['has_next'] = 1;
  120. else
  121. $root['has_next'] = 0;
  122. //$sql = "select count(*) from ".DB_PREFIX."user_music where user_id = ".$user_id;
  123. //$root['count'] = $GLOBALS['db']->getOne($sql);
  124. $root['page'] = $page;//
  125. $root['status'] = 1;
  126. }
  127. ajax_return($root);
  128. }
  129. /**
  130. * 搜索音乐列表
  131. */
  132. public function search(){
  133. $m_config = load_auto_cache("m_config");//初始化手机端配置
  134. $music_type = intval($m_config['music_type']);
  135. if($music_type==1){//伴奏
  136. $root = array();
  137. $root['status'] = 1;
  138. $keyword = strim($_REQUEST['keyword']);//搜索关键字
  139. $page = intval($_REQUEST['p']);//取第几页数据
  140. $root['REQUEST'] = print_r($_REQUEST,1);
  141. if($page==0)$page = 1;
  142. $page_size=intval(10*$page);
  143. $list = $this->get_accompany($keyword,$page_size);
  144. $root['list'] = $list;
  145. $root['has_next'] = 0;
  146. $root['page'] = $page;//
  147. ajax_return($root);
  148. }else{
  149. $root = array();
  150. $root['status'] = 1;
  151. $keyword = strim($_REQUEST['keyword']);//搜索关键字
  152. $page = intval($_REQUEST['p']);//取第几页数据
  153. //$root['REQUEST'] = print_r($_REQUEST,1);
  154. if($page==0)$page = 1;
  155. $page_size=2;
  156. $limit = (($page-1)*$page_size).",".$page_size;
  157. $url = "http://tingapi.ting.baidu.com/v1/restserver/ting";//?method=baidu.ting.search.catalogSug&query=%E5%A4%A7
  158. fanwe_require(APP_ROOT_PATH .'mapi/lib/core/transport.php');
  159. $params = array();
  160. $my_header = array();
  161. $my_header['Connection'] = 'keep-alive';
  162. $my_header['Origin'] = 'http://music.baidu.com';
  163. $my_header['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0';
  164. $my_header['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
  165. $my_header['Referer'] = 'http://music.baidu.com/';
  166. $my_header['Accept-Encoding'] = 'gzip, deflate, sdch';
  167. $my_header['Accept-Language'] = 'zh-CN,zh;q=0.8';
  168. $my_header['Host'] = 'tingapi.ting.baidu.com';
  169. $params['method'] = 'baidu.ting.search.catalogSug';
  170. $params['query'] = urlencode($keyword);
  171. $trans = new transport();
  172. $req = $trans->request($url,$params,'GET',$my_header);
  173. $req = json_decode($req['body'],1);
  174. $list = array();
  175. foreach ( $req['song'] as $k => $v )
  176. {
  177. $song = array();
  178. $song['api_type'] = 0;//http://tingapi.ting.baidu.com
  179. $song['audio_id'] = $v['songid'];
  180. $song['audio_name'] = $v['songname'];
  181. $song['artist_name'] = $v['artistname'];
  182. $song['audio_link'] = '';
  183. $song['lrc_link'] = '';
  184. $song['time_len'] = 0;
  185. $list[] = $song;
  186. }
  187. $root['list'] = $list;
  188. $root['has_next'] = 0;
  189. $root['page'] = $page;//
  190. ajax_return($root);
  191. }
  192. }
  193. /**
  194. * 返回下载音乐地址1
  195. */
  196. function get_lrc($audio_id,$api_type){
  197. $url = "http://tingapi.ting.baidu.com/v1/restserver/ting";//?method=baidu.ting.search.catalogSug&query=%E5%A4%A7
  198. fanwe_require(APP_ROOT_PATH .'mapi/lib/core/transport.php');
  199. $params = array();
  200. $my_header = array();
  201. $my_header['Connection'] = 'keep-alive';
  202. $my_header['Origin'] = 'http://music.baidu.com';
  203. $my_header['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0';
  204. $my_header['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
  205. $my_header['Referer'] = 'http://music.baidu.com/';
  206. $my_header['Accept-Encoding'] = 'gzip, deflate, sdch';
  207. $my_header['Accept-Language'] = 'zh-CN,zh;q=0.8';
  208. $my_header['Host'] = 'tingapi.ting.baidu.com';
  209. $params['method'] = 'baidu.ting.song.lry';
  210. $params['songid'] = $audio_id;
  211. $trans = new transport();
  212. $req = $trans->request($url,$params,'GET',$my_header);
  213. $req = json_decode($req['body'],1);
  214. $lrc = array();
  215. $lrc['audio_id'] = $audio_id;
  216. $lrc['api_type'] = $api_type;
  217. $lrc['lrc_type'] = 0;
  218. $lrc['lrc_title'] = $req['title'];
  219. $lrc['lrc_content'] = $req['lrcContent'];
  220. if ($lrc['lrc_content'] != ''){
  221. $lrc['status'] = 1;
  222. }else{
  223. $lrc['status'] = 0;
  224. }
  225. return $lrc;
  226. }
  227. /**
  228. * 获得歌词3
  229. */
  230. public function getlrc(){
  231. $root = array();
  232. $root['status'] = 1;
  233. $user_id = intval($GLOBALS['user_info']['id']);//用户ID
  234. $audio_id = strim($_REQUEST['audio_id']);//
  235. $api_type = intval($_REQUEST['api_type']);//
  236. $sql = "select audio_id,api_type,lrc_type,audio_name from ".DB_PREFIX."user_music where audio_id = '".$audio_id."' and user_id = '".$user_id."'";
  237. $user_music = $GLOBALS['db']->getRow($sql);
  238. if ($user_music && $user_music['lrc_content'] != ''){
  239. $lrc = array();
  240. $lrc['audio_id'] = $audio_id;
  241. $lrc['api_type'] = $user_music['api_type'];
  242. $lrc['lrc_type'] = $user_music['lrc_type'];
  243. $lrc['lrc_title'] = $user_music['audio_name'];
  244. $lrc['lrc_content'] = $user_music['lrc_content'];
  245. }else{
  246. $lrc = $this->get_lrc($audio_id,$api_type);
  247. if ($GLOBALS['user_info']['id'] && $lrc['status'] == 1){
  248. $user_music = array();
  249. $user_music['lrc_type'] = $lrc['lrc_type'];
  250. $user_music['lrc_content'] = $lrc['lrc_content'];
  251. $GLOBALS['db']->autoExecute(DB_PREFIX."user_music", $user_music,"UPDATE","audio_id = '".$audio_id."' and user_id = '".$user_id."'");
  252. }
  253. }
  254. $root['lrc'] = $lrc;
  255. ajax_return($root);
  256. }
  257. /**
  258. * 返回下载音乐地址
  259. */
  260. public function downurl(){
  261. $root = array();
  262. $root['status'] = 1;
  263. $m_config = load_auto_cache("m_config");//初始化手机端配置
  264. $music_type = intval($m_config['music_type']);
  265. if($music_type == 1){
  266. //$user_id = intval($GLOBALS['user_info']['id']);//用户ID
  267. $audio_id = strim($_REQUEST['audio_id']);//
  268. $audio_data = explode('&amp;',$audio_id);
  269. $url = $audio_data[2];
  270. $req = $this->get_lyric($url);
  271. $audio['audio_link'] = $audio_data[1];
  272. $audio['audio_ext'] = 'mp3';
  273. $audio['lrc_content'] = $req;
  274. $audio['lrc_link'] = $audio_data[2];
  275. $root['audio'] = $audio;
  276. //}
  277. ajax_return($root);
  278. }else{
  279. $audio_id = strim($_REQUEST['audio_id']);//
  280. $api_type = intval($_REQUEST['api_type']);//
  281. //http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.song.downWeb&songid=262765491&bit=128&_t=1466082469621
  282. $url = "http://tingapi.ting.baidu.com/v1/restserver/ting";//?method=baidu.ting.search.catalogSug&query=%E5%A4%A7
  283. fanwe_require(APP_ROOT_PATH .'mapi/lib/core/transport.php');
  284. $my_header = array();
  285. $my_header['Connection'] = 'keep-alive';
  286. $my_header['Origin'] = 'http://music.baidu.com';
  287. $my_header['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0';
  288. $my_header['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
  289. $my_header['Referer'] = 'http://music.baidu.com/';
  290. $my_header['Accept-Encoding'] = 'gzip, deflate, sdch';
  291. $my_header['Accept-Language'] = 'zh-CN,zh;q=0.8';
  292. $my_header['Host'] = 'tingapi.ting.baidu.com';
  293. $params = array();
  294. $params['method'] = 'baidu.ting.song.downWeb';
  295. $params['songid'] = $audio_id;
  296. $params['bit'] = 128;
  297. $params['_t'] = NOW_TIME * 1000 + rand(1,999);
  298. //echo 'sss';exit; 1466082469 621
  299. $trans = new transport();
  300. $req = $trans->request($url,$params,'GET',$my_header);
  301. $req = json_decode($req['body'],1);
  302. if ($req['bitrate']){
  303. $bitrate = $req['bitrate'][0];
  304. //print_r($req['bitrate']);
  305. //exit;
  306. $audio['audio_link'] = $bitrate['file_link'];
  307. if($audio['audio_link']==''){
  308. log_err_file(array(__FILE__,__LINE__,__METHOD__,$audio_id,$bitrate));
  309. }
  310. $audio['audio_ext'] = $bitrate['file_extension'];
  311. $audio['audio_size'] = $bitrate['file_size'];
  312. $audio['time_len'] = $bitrate['file_duration'];
  313. //====================获得歌词===================
  314. $lrc = $this->get_lrc($audio_id,$api_type);
  315. $audio['lrc_type'] = 0;
  316. $audio['lrc_title'] = $lrc['lrc_title'];
  317. $audio['lrc_content'] = $lrc['lrc_content'];
  318. $root['audio'] = $audio;
  319. }else{
  320. //log_err_file(array(__FILE__,__LINE__,__METHOD__,$req));
  321. $root = $this->downurl2(array('audio_id'=>$audio_id,'api_type'=>$api_type));
  322. // $root['error'] = "无法下载该音乐";
  323. // $root['status'] = 0;
  324. }
  325. ajax_return($root);
  326. }
  327. }
  328. /**
  329. * 返回下载音乐地址3
  330. */
  331. public function get_lyric($lrc_link){
  332. $url = $lrc_link;//?method=baidu.ting.search.catalogSug&query=%E5%A4%A7
  333. $ch = curl_init();
  334. curl_setopt ($ch, CURLOPT_URL, $url );
  335. curl_setopt ($ch, CURLOPT_RETURNTRANSFER,1);
  336. curl_setopt ($ch, CURLOPT_POST, 1 ); //启用POST提交
  337. curl_setopt ($ch, CURLOPT_POSTFIELDS,$lrc_link);
  338. $result = curl_exec ($ch);
  339. curl_close($ch);
  340. $result = preg_replace('/<.{1,7},.{1,7}>/','',$result);
  341. return $result;
  342. }
  343. /**
  344. * 返回下载音乐地址2
  345. */
  346. public function downurl2($req){
  347. $root = array();
  348. $root['status'] = 1;
  349. $audio_id = strim($req['audio_id']);//
  350. $api_type = intval($req['api_type']);//
  351. //$url = "http://music.baidu.com/data/music/links?songIds=".$audio_id;
  352. $url = "http://music.baidu.com/data/music/fmlink?songIds=".$audio_id."&xcode=66dac391e76aa9c07994aa2c4fb9".rand(1000,9999);
  353. $url = "http://music.baidu.com/data/music/fmlink?songIds=".$audio_id;
  354. //log_err_file(array(__FILE__,__LINE__,__METHOD__,$audio_id,$url));
  355. $opts = array('http'=> array('method'=>"GET",'timeout'=>10));
  356. $context = stream_context_create($opts);
  357. $html =file_get_contents($url, false, $context);
  358. //log_err_file(array(__FILE__,__LINE__,__METHOD__,$audio_id,$html));
  359. $req = json_decode($html,1);
  360. //log_err_file(array(__FILE__,__LINE__,__METHOD__,$audio_id,$req));
  361. if ($req['data']){
  362. $songList = $req['data']['songList'][0];
  363. $audio['audio_link'] = $songList['songLink'];
  364. if($audio['audio_link']==''){
  365. log_err_file(array(__FILE__,__LINE__,__METHOD__,$audio_id,$songList));
  366. }
  367. $audio['audio_ext'] = $songList['format'];
  368. $audio['audio_size'] = $songList['size'];
  369. $audio['time_len'] = $songList['time'];
  370. //====================获得歌词===================
  371. $lrc = $this->get_lrc($audio_id,$api_type);
  372. $audio['lrc_type'] = 0;
  373. $audio['lrc_title'] = $lrc['lrc_title'];
  374. $audio['lrc_content'] = $lrc['lrc_content'];
  375. $root['audio'] = $audio;
  376. }else{
  377. log_err_file(array(__FILE__,__LINE__,__METHOD__,$req));
  378. $root['error'] = "无法下载该音乐";
  379. $root['status'] = 0;
  380. }
  381. return $root;
  382. }
  383. /**
  384. * 获取伴奏
  385. */
  386. public function get_accompany($keyword,$page_size){
  387. if(0){
  388. $url = "http://search.aichang.cn/aichang/search/search.php";
  389. fanwe_require(APP_ROOT_PATH .'mapi/lib/core/transport.php');
  390. $params = array();
  391. $my_header = array();
  392. $my_header['Connection'] = 'keep-alive';
  393. $my_header['Origin'] = 'http://www.aichang.cn/';
  394. $my_header['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0';
  395. $my_header['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
  396. $my_header['Referer'] = 'http://www.aichang.cn/';
  397. $my_header['Accept-Encoding'] = 'gzip, deflate, sdch';
  398. $my_header['Accept-Language'] = 'zh-CN,zh;q=0.8';
  399. $my_header['Host'] = 'search.aichang.cn';
  400. //$params['method'] = 'baidu.ting.search.catalogSug';
  401. $params['query'] = urlencode($keyword);
  402. $trans = new transport();
  403. $req = $trans->request($url,$params,'GET',$my_header);
  404. //$root[json] = $json;
  405. $req = json_decode($req['body'],1);
  406. }else{
  407. $url = "http://api.mengliaoba.cn/apiv5/banzou/searchv2.php";
  408. $params = array();
  409. $params['keyword'] = $keyword;
  410. $params['count'] = $page_size;
  411. $req = $this->curl_https($url,$params);
  412. $req = json_decode($req,1);
  413. }
  414. //echo 'sss';exit;
  415. if(isset($req['song']['other'])){
  416. $req['song'] = array_merge($req['song']['songs'],$req['song']['other']['songs']);
  417. }else{
  418. $req['song'] = $req['song']['songs'];
  419. }
  420. $list = array();
  421. foreach ( $req['song'] as $k => $v )
  422. {
  423. $song = array();
  424. $song['api_type'] = 0;
  425. $song['audio_id'] = $v['bzid'].'&'.$v['fullpath'].'&'.$v['fulllrcpath'];
  426. $song['audio_name'] = $v['name'];
  427. $song['artist_name'] = $v['singer'];
  428. $song['audio_link'] = $v['fullpath'];
  429. $song['lrc_link'] = $v['fulllrcpath'];
  430. $song['time_len'] = 0;
  431. $list[] = $song;
  432. }
  433. return $list;
  434. }
  435. /**
  436. * https 方法
  437. */
  438. public function curl_https($url, $data=array(), $header=array(), $timeout=30){
  439. $ch = curl_init();
  440. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
  441. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
  442. curl_setopt($ch, CURLOPT_URL, $url);
  443. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  444. curl_setopt($ch, CURLOPT_POST, false);
  445. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
  446. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  447. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  448. $response = curl_exec($ch);
  449. if($error=curl_error($ch)){
  450. die($error);
  451. }
  452. curl_close($ch);
  453. return $response;
  454. }
  455. }