lyric.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**************************************************
  2. * MKOnlinePlayer v2.31
  3. * 歌词解析及滚动模块
  4. * 编写:mengkun(http://mkblog.cn)
  5. * 时间:2017-9-13
  6. *************************************************/
  7. var lyricArea = $("#lyric"); // 歌词显示容器
  8. // 在歌词区显示提示语(如歌词加载中、无歌词等)
  9. function lyricTip(str) {
  10. lyricArea.html("<li class='lyric-tip'>"+str+"</li>"); // 显示内容
  11. }
  12. // 歌曲加载完后的回调函数
  13. // 参数:歌词源文件
  14. function lyricCallback(str, id) {
  15. if(id !== musicList[rem.playlist].item[rem.playid].id) return; // 返回的歌词不是当前这首歌的,跳过
  16. rem.lyric = parseLyric(str); // 解析获取到的歌词
  17. if(rem.lyric === '') {
  18. lyricTip('没有歌词');
  19. return false;
  20. }
  21. lyricArea.html(''); // 清空歌词区域的内容
  22. lyricArea.scrollTop(0); // 滚动到顶部
  23. rem.lastLyric = -1;
  24. // 显示全部歌词
  25. var i = 0;
  26. for(var k in rem.lyric){
  27. var txt = rem.lyric[k];
  28. if(!txt) txt = "&nbsp;";
  29. var li = $("<li data-no='"+i+"' class='lrc-item'>"+txt+"</li>");
  30. lyricArea.append(li);
  31. i++;
  32. }
  33. }
  34. // 强制刷新当前时间点的歌词
  35. // 参数:当前播放时间(单位:秒)
  36. function refreshLyric(time) {
  37. if(rem.lyric === '') return false;
  38. time = parseInt(time); // 时间取整
  39. var i = 0;
  40. for(var k in rem.lyric){
  41. if(k >= time) break;
  42. i = k; // 记录上一句的
  43. }
  44. scrollLyric(i);
  45. }
  46. // 滚动歌词到指定句
  47. // 参数:当前播放时间(单位:秒)
  48. function scrollLyric(time) {
  49. if(rem.lyric === '') return false;
  50. time = parseInt(time); // 时间取整
  51. if(rem.lyric === undefined || rem.lyric[time] === undefined) return false; // 当前时间点没有歌词
  52. if(rem.lastLyric == time) return true; // 歌词没发生改变
  53. var i = 0; // 获取当前歌词是在第几行
  54. for(var k in rem.lyric){
  55. if(k == time) break;
  56. i ++;
  57. }
  58. rem.lastLyric = time; // 记录方便下次使用
  59. $(".lplaying").removeClass("lplaying"); // 移除其余句子的正在播放样式
  60. $(".lrc-item[data-no='" + i + "']").addClass("lplaying"); // 加上正在播放样式
  61. var scroll = (lyricArea.children().height() * i) - ($(".lyric").height() / 2);
  62. lyricArea.stop().animate({scrollTop: scroll}, 1000); // 平滑滚动到当前歌词位置(更改这个数值可以改变歌词滚动速度,单位:毫秒)
  63. }
  64. // 解析歌词
  65. // 这一函数来自 https://github.com/TivonJJ/html5-music-player
  66. // 参数:原始歌词文件
  67. function parseLyric(lrc) {
  68. if(lrc === '') return '';
  69. var lyrics = lrc.split("\n");
  70. var lrcObj = {};
  71. for(var i=0;i<lyrics.length;i++){
  72. var lyric = decodeURIComponent(lyrics[i]);
  73. var timeReg = /\[\d*:\d*((\.|\:)\d*)*\]/g;
  74. var timeRegExpArr = lyric.match(timeReg);
  75. if(!timeRegExpArr)continue;
  76. var clause = lyric.replace(timeReg,'');
  77. for(var k = 0,h = timeRegExpArr.length;k < h;k++) {
  78. var t = timeRegExpArr[k];
  79. var min = Number(String(t.match(/\[\d*/i)).slice(1)),
  80. sec = Number(String(t.match(/\:\d*/i)).slice(1));
  81. var time = min * 60 + sec;
  82. lrcObj[time] = clause;
  83. }
  84. }
  85. return lrcObj;
  86. }