ajax.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. /**************************************************
  2. * MKOnlinePlayer v2.4
  3. * Ajax 后台数据交互请求模块
  4. * 编写:mengkun(https://mkblog.cn)
  5. * 时间:2018-3-11
  6. *************************************************/
  7. // ajax加载搜索结果
  8. function ajaxSearch() {
  9. if(rem.wd === ""){
  10. layer.msg('搜索内容不能为空', {anim:6});
  11. return false;
  12. }
  13. if(rem.loadPage == 1) { // 弹出搜索提示
  14. var tmpLoading = layer.msg('搜索中', {icon: 16,shade: 0.01});
  15. }
  16. $.ajax({
  17. type: mkPlayer.method,
  18. url: mkPlayer.api,
  19. data: "types=search&count=" + mkPlayer.loadcount + "&source=" + rem.source + "&pages=" + rem.loadPage + "&name=" + rem.wd,
  20. dataType : "jsonp",
  21. complete: function(XMLHttpRequest, textStatus) {
  22. if(tmpLoading) layer.close(tmpLoading); // 关闭加载中动画
  23. }, // complete
  24. success: function(jsonData){
  25. // 调试信息输出
  26. if(mkPlayer.debug) {
  27. console.debug("搜索结果数:" + jsonData.length);
  28. }
  29. if(rem.loadPage == 1) // 加载第一页,清空列表
  30. {
  31. if(jsonData.length === 0) // 返回结果为零
  32. {
  33. layer.msg('没有找到相关歌曲', {anim:6});
  34. return false;
  35. }
  36. musicList[0].item = [];
  37. rem.mainList.html(''); // 清空列表中原有的元素
  38. addListhead(); // 加载列表头
  39. } else {
  40. $("#list-foot").remove(); //已经是加载后面的页码了,删除之前的“加载更多”提示
  41. }
  42. if(jsonData.length === 0)
  43. {
  44. addListbar("nomore"); // 加载完了
  45. return false;
  46. }
  47. var tempItem = [], no = musicList[0].item.length;
  48. for (var i = 0; i < jsonData.length; i++) {
  49. no ++;
  50. tempItem = {
  51. id: jsonData[i].id, // 音乐ID
  52. name: jsonData[i].name, // 音乐名字
  53. artist: jsonData[i].artist[0], // 艺术家名字
  54. album: jsonData[i].album, // 专辑名字
  55. source: jsonData[i].source, // 音乐来源
  56. url_id: jsonData[i].url_id, // 链接ID
  57. pic_id: jsonData[i].pic_id, // 封面ID
  58. lyric_id: jsonData[i].lyric_id, // 歌词ID
  59. pic: null, // 专辑图片
  60. url: null // mp3链接
  61. };
  62. musicList[0].item.push(tempItem); // 保存到搜索结果临时列表中
  63. addItem(no, tempItem.name, tempItem.artist, tempItem.album); // 在前端显示
  64. }
  65. rem.dislist = 0; // 当前显示的是搜索列表
  66. rem.loadPage ++; // 已加载的列数+1
  67. dataBox("list"); // 在主界面显示出播放列表
  68. refreshList(); // 刷新列表,添加正在播放样式
  69. if(no < mkPlayer.loadcount) {
  70. addListbar("nomore"); // 没加载满,说明已经加载完了
  71. } else {
  72. addListbar("more"); // 还可以点击加载更多
  73. }
  74. if(rem.loadPage == 2) listToTop(); // 播放列表滚动到顶部
  75. }, //success
  76. error: function(XMLHttpRequest, textStatus, errorThrown) {
  77. layer.msg('搜索结果获取失败 - ' + XMLHttpRequest.status);
  78. console.error(XMLHttpRequest + textStatus + errorThrown);
  79. } // error
  80. });//ajax
  81. }
  82. // 完善获取音乐信息
  83. // 音乐所在列表ID、音乐对应ID、回调函数
  84. function ajaxUrl(music, callback)
  85. {
  86. // 已经有数据,直接回调
  87. if(music.url !== null && music.url !== "err" && music.url !== "") {
  88. callback(music);
  89. return true;
  90. }
  91. // id为空,赋值链接错误。直接回调
  92. if(music.id === null) {
  93. music.url = "err";
  94. updateMinfo(music); // 更新音乐信息
  95. callback(music);
  96. return true;
  97. }
  98. $.ajax({
  99. type: mkPlayer.method,
  100. url: mkPlayer.api,
  101. data: "types=url&id=" + music.id + "&source=" + music.source,
  102. dataType : "jsonp",
  103. success: function(jsonData){
  104. // 调试信息输出
  105. if(mkPlayer.debug) {
  106. console.debug("歌曲链接:" + jsonData.url);
  107. }
  108. // 解决网易云音乐部分歌曲无法播放问题
  109. if(music.source == "netease") {
  110. if(jsonData.url === "") {
  111. jsonData.url = "https://music.163.com/song/media/outer/url?id=" + music.id + ".mp3";
  112. } else {
  113. jsonData.url = jsonData.url.replace(/m7c.music./g, "m7.music.");
  114. jsonData.url = jsonData.url.replace(/m8c.music./g, "m8.music.");
  115. }
  116. } else if(music.source == "baidu") { // 解决百度音乐防盗链
  117. jsonData.url = jsonData.url.replace(/http:\/\/zhangmenshiting.qianqian.com/g, "https://gss0.bdstatic.com/y0s1hSulBw92lNKgpU_Z2jR7b2w6buu");
  118. }
  119. if(jsonData.url === "") {
  120. music.url = "err";
  121. } else {
  122. music.url = jsonData.url; // 记录结果
  123. }
  124. updateMinfo(music); // 更新音乐信息
  125. callback(music); // 回调函数
  126. return true;
  127. }, //success
  128. error: function(XMLHttpRequest, textStatus, errorThrown) {
  129. layer.msg('歌曲链接获取失败 - ' + XMLHttpRequest.status);
  130. console.error(XMLHttpRequest + textStatus + errorThrown);
  131. } // error
  132. }); //ajax
  133. }
  134. // 完善获取音乐封面图
  135. // 包含音乐信息的数组、回调函数
  136. function ajaxPic(music, callback)
  137. {
  138. // 已经有数据,直接回调
  139. if(music.pic !== null && music.pic !== "err" && music.pic !== "") {
  140. callback(music);
  141. return true;
  142. }
  143. // pic_id 为空,赋值链接错误。直接回调
  144. if(music.pic_id === null) {
  145. music.pic = "err";
  146. updateMinfo(music); // 更新音乐信息
  147. callback(music);
  148. return true;
  149. }
  150. $.ajax({
  151. type: mkPlayer.method,
  152. url: mkPlayer.api,
  153. data: "types=pic&id=" + music.pic_id + "&source=" + music.source,
  154. dataType : "jsonp",
  155. success: function(jsonData){
  156. // 调试信息输出
  157. if(mkPlayer.debug) {
  158. console.log("歌曲封面:" + jsonData.url);
  159. }
  160. if(jsonData.url !== "") {
  161. music.pic = jsonData.url; // 记录结果
  162. } else {
  163. music.pic = "err";
  164. }
  165. updateMinfo(music); // 更新音乐信息
  166. callback(music); // 回调函数
  167. return true;
  168. }, //success
  169. error: function(XMLHttpRequest, textStatus, errorThrown) {
  170. layer.msg('歌曲封面获取失败 - ' + XMLHttpRequest.status);
  171. console.error(XMLHttpRequest + textStatus + errorThrown);
  172. } // error
  173. }); //ajax
  174. }
  175. // ajax加载用户歌单
  176. // 参数:歌单网易云 id, 歌单存储 id,回调函数
  177. function ajaxPlayList(lid, id, callback) {
  178. if(!lid) return false;
  179. // 已经在加载了,跳过
  180. if(musicList[id].isloading === true) {
  181. return true;
  182. }
  183. musicList[id].isloading = true; // 更新状态:列表加载中
  184. $.ajax({
  185. type: mkPlayer.method,
  186. url: mkPlayer.api,
  187. data: "types=playlist&id=" + lid,
  188. dataType : "jsonp",
  189. complete: function(XMLHttpRequest, textStatus) {
  190. musicList[id].isloading = false; // 列表已经加载完了
  191. }, // complete
  192. success: function(jsonData){
  193. // 存储歌单信息
  194. var tempList = {
  195. id: lid, // 列表的网易云 id
  196. name: jsonData.playlist.name, // 列表名字
  197. cover: jsonData.playlist.coverImgUrl, // 列表封面
  198. creatorName: jsonData.playlist.creator.nickname, // 列表创建者名字
  199. creatorAvatar: jsonData.playlist.creator.avatarUrl, // 列表创建者头像
  200. item: []
  201. };
  202. if(jsonData.playlist.coverImgUrl !== '') {
  203. tempList.cover = jsonData.playlist.coverImgUrl + "?param=200y200";
  204. } else {
  205. tempList.cover = musicList[id].cover;
  206. }
  207. if(typeof jsonData.playlist.tracks !== undefined || jsonData.playlist.tracks.length !== 0) {
  208. // 存储歌单中的音乐信息
  209. for (var i = 0; i < jsonData.playlist.tracks.length; i++) {
  210. tempList.item[i] = {
  211. id: jsonData.playlist.tracks[i].id, // 音乐ID
  212. name: jsonData.playlist.tracks[i].name, // 音乐名字
  213. artist: jsonData.playlist.tracks[i].ar[0].name, // 艺术家名字
  214. album: jsonData.playlist.tracks[i].al.name, // 专辑名字
  215. source: "netease", // 音乐来源
  216. url_id: jsonData.playlist.tracks[i].id, // 链接ID
  217. pic_id: null, // 封面ID
  218. lyric_id: jsonData.playlist.tracks[i].id, // 歌词ID
  219. pic: jsonData.playlist.tracks[i].al.picUrl + "?param=300y300", // 专辑图片
  220. url: null // mp3链接
  221. };
  222. }
  223. }
  224. // 歌单用户 id 不能丢
  225. if(musicList[id].creatorID) {
  226. tempList.creatorID = musicList[id].creatorID;
  227. if(musicList[id].creatorID === rem.uid) { // 是当前登录用户的歌单,要保存到缓存中
  228. var tmpUlist = playerReaddata('ulist'); // 读取本地记录的用户歌单
  229. if(tmpUlist) { // 读取到了
  230. for(i=0; i<tmpUlist.length; i++) { // 匹配歌单
  231. if(tmpUlist[i].id == lid) {
  232. tmpUlist[i] = tempList; // 保存歌单中的歌曲
  233. playerSavedata('ulist', tmpUlist); // 保存
  234. break;
  235. }
  236. }
  237. }
  238. }
  239. }
  240. // 存储列表信息
  241. musicList[id] = tempList;
  242. // 首页显示默认列表
  243. if(id == mkPlayer.defaultlist) loadList(id);
  244. if(callback) callback(id); // 调用回调函数
  245. // 改变前端列表
  246. $(".sheet-item[data-no='" + id + "'] .sheet-cover").attr('src', tempList.cover); // 专辑封面
  247. $(".sheet-item[data-no='" + id + "'] .sheet-name").html(tempList.name); // 专辑名字
  248. // 调试信息输出
  249. if(mkPlayer.debug) {
  250. console.debug("歌单 [" +tempList.name+ "] 中的音乐获取成功");
  251. }
  252. }, //success
  253. error: function(XMLHttpRequest, textStatus, errorThrown) {
  254. layer.msg('歌单读取失败 - ' + XMLHttpRequest.status);
  255. console.error(XMLHttpRequest + textStatus + errorThrown);
  256. $(".sheet-item[data-no='" + id + "'] .sheet-name").html('<span style="color: #EA8383">读取失败</span>'); // 专辑名字
  257. } // error
  258. });//ajax
  259. }
  260. // ajax加载歌词
  261. // 参数:音乐ID,回调函数
  262. function ajaxLyric(music, callback) {
  263. lyricTip('歌词加载中...');
  264. if(!music.lyric_id) callback(''); // 没有歌词ID,直接返回
  265. $.ajax({
  266. type: mkPlayer.method,
  267. url: mkPlayer.api,
  268. data: "types=lyric&id=" + music.lyric_id + "&source=" + music.source,
  269. dataType : "jsonp",
  270. success: function(jsonData){
  271. // 调试信息输出
  272. if (mkPlayer.debug) {
  273. console.debug("歌词获取成功");
  274. }
  275. if (jsonData.lyric) {
  276. callback(jsonData.lyric, music.lyric_id); // 回调函数
  277. } else {
  278. callback('', music.lyric_id); // 回调函数
  279. }
  280. }, //success
  281. error: function(XMLHttpRequest, textStatus, errorThrown) {
  282. layer.msg('歌词读取失败 - ' + XMLHttpRequest.status);
  283. console.error(XMLHttpRequest + textStatus + errorThrown);
  284. callback('', music.lyric_id); // 回调函数
  285. } // error
  286. });//ajax
  287. }
  288. // ajax加载用户的播放列表
  289. // 参数 用户的网易云 id
  290. function ajaxUserList(uid)
  291. {
  292. var tmpLoading = layer.msg('加载中...', {icon: 16,shade: 0.01});
  293. $.ajax({
  294. type: mkPlayer.method,
  295. url: mkPlayer.api,
  296. data: "types=userlist&uid=" + uid,
  297. dataType : "jsonp",
  298. complete: function(XMLHttpRequest, textStatus) {
  299. if(tmpLoading) layer.close(tmpLoading); // 关闭加载中动画
  300. }, // complete
  301. success: function(jsonData){
  302. if(jsonData.code == "-1" || jsonData.code == 400){
  303. layer.msg('用户 uid 输入有误');
  304. return false;
  305. }
  306. if(jsonData.playlist.length === 0 || typeof(jsonData.playlist.length) === "undefined")
  307. {
  308. layer.msg('没找到用户 ' + uid + ' 的歌单');
  309. return false;
  310. }else{
  311. var tempList,userList = [];
  312. $("#sheet-bar").remove(); // 移除登陆条
  313. rem.uid = uid; // 记录已同步用户 uid
  314. rem.uname = jsonData.playlist[0].creator.nickname; // 第一个列表(喜欢列表)的创建者即用户昵称
  315. layer.msg('欢迎您 '+rem.uname);
  316. // 记录登录用户
  317. playerSavedata('uid', rem.uid);
  318. playerSavedata('uname', rem.uname);
  319. for (var i = 0; i < jsonData.playlist.length; i++)
  320. {
  321. // 获取歌单信息
  322. tempList = {
  323. id: jsonData.playlist[i].id, // 列表的网易云 id
  324. name: jsonData.playlist[i].name, // 列表名字
  325. cover: jsonData.playlist[i].coverImgUrl + "?param=200y200", // 列表封面
  326. creatorID: uid, // 列表创建者id
  327. creatorName: jsonData.playlist[i].creator.nickname, // 列表创建者名字
  328. creatorAvatar: jsonData.playlist[i].creator.avatarUrl, // 列表创建者头像
  329. item: []
  330. };
  331. // 存储并显示播放列表
  332. addSheet(musicList.push(tempList) - 1, tempList.name, tempList.cover);
  333. userList.push(tempList);
  334. }
  335. playerSavedata('ulist', userList);
  336. // 显示退出登录的提示条
  337. sheetBar();
  338. }
  339. // 调试信息输出
  340. if(mkPlayer.debug) {
  341. console.debug("用户歌单获取成功 [用户网易云ID:" + uid + "]");
  342. }
  343. }, //success
  344. error: function(XMLHttpRequest, textStatus, errorThrown) {
  345. layer.msg('歌单同步失败 - ' + XMLHttpRequest.status);
  346. console.error(XMLHttpRequest + textStatus + errorThrown);
  347. } // error
  348. });//ajax
  349. return true;
  350. }