lrc.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. /* ===================================================
  2. * jqlyric.js v0.1
  3. * shawnk@qq.com
  4. * 使用方法
  5. * var $container=$('#lyriccontainer'); //用于显示歌词的容器对象,样式自己定义
  6. * $container.jqlyric({
  7. * lyric:'\
  8. [ti:存在] \
  9. [ar:汪峰] \
  10. [al:存在] \
  11. [by:Love] \
  12. [00:00.00]汪峰 - 存在 \
  13. [00:00.68]多少人走着却困在原地 \
  14. [00:07.93]多少人活着却如同死去', // 歌词字符串,标准lrc文件格式
  15. * speed:1000, // 歌词滚动间隔 (毫秒)
  16. * getPosition:function(){ // 获取当前播放位置的函数(返回秒数), 请定义外部函数,不指定本参数则默认从调用插件开始自动播放
  17. * return position;
  18. * }
  19. * });
  20. * ===================================================
  21. *
  22. * Licensed under the Apache License, Version 2.0 (the "License");
  23. * you may not use this file except in compliance with the License.
  24. * You may obtain a copy of the License at
  25. *
  26. * http://www.apache.org/licenses/LICENSE-2.0
  27. *
  28. * Unless required by applicable law or agreed to in writing, software
  29. * distributed under the License is distributed on an "AS IS" BASIS,
  30. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  31. * See the License for the specific language governing permissions and
  32. * limitations under the License.
  33. * ========================================================== */
  34. (function($) {
  35. var gtime=0;
  36. var lyric_listener;
  37. $.fn.jqlyric = function(options) {
  38. var opts = $.extend({}, $.fn.jqlyric.defaults, options);
  39. return this.each(function(){
  40. var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
  41. var $this=$(this);
  42. var arrLyric=new Array(); //放存汉字的歌词
  43. var arrTime=new Array(); //存放时间
  44. var currentLine=0; //当前活动的歌词行号
  45. // 开始解析歌词
  46. var lyric=o.lyric;
  47. lyric=lyric.replace(/\]\n/g,'\]\n\|\|');
  48. lyric=lyric.replace(/\]\s\[/g,'\]\[');
  49. lyric=lyric.replace(/\]\[/g,'====');
  50. lyric=lyric.replace(/\[/g,'\|\|\[');
  51. lyric=lyric.replace(/====/g,'\]\[');
  52. lyric=lyric.replace(/\|\|\|\|\|\|\|\|/g,'\|\|');
  53. lyric=lyric.replace(/\|\|\|\|\|\|/g,'\|\|');
  54. lyric=lyric.replace(/\|\|\|\|/g,'\|\|');
  55. //将歌词解析成数组
  56. var arrly=lyric.split('||');
  57. for(var i=0;i<arrly.length;i++){
  58. var str=arrly[i];
  59. var left=0; //"["的个数
  60. var leftAr=new Array();
  61. for(var k=0;k<str.length;k++){
  62. if(str.charAt(k)=="["){
  63. leftAr[left]=k;
  64. left++;
  65. }
  66. }
  67. if(left!=0){
  68. for(var j=0;j<leftAr.length;j++){
  69. var tag=str.charAt(leftAr[j]+1)+str.charAt(leftAr[j]+2);
  70. if(tag=='ti'||tag=='ar'||tag=='by'||tag=='al'){
  71. // 歌曲特征字段
  72. var tmp=str.split(tag+':');
  73. tmp=tmp[1].split(']');
  74. var text=tmp[0];
  75. tag=tag.replace(/([ti|ar|al|by])/g,'');
  76. arrLyric.push(tag+text);
  77. arrTime.push(toSeconds('00:00:00')); //
  78. }else{
  79. var text=str.substring(str.lastIndexOf("]")+1);
  80. if(text==''){text='&nbsp;';}
  81. arrLyric.push(text); //放歌词
  82. arrTime.push(toSeconds(str.substring(leftAr[j]+1,leftAr[j]+6))); //放时间
  83. }
  84. }
  85. }
  86. }
  87. // 所有歌词按时间顺序排列
  88. for(var k=0;k<arrTime.length;k++){
  89. for(var j=0;j<arrTime.length-k;j++){
  90. if(arrTime[j]>arrTime[j+1]){
  91. temp=arrTime[j];
  92. arrTime[j]=arrTime[j+1];
  93. arrTime[j+1]=temp;
  94. temp=arrLyric[j];
  95. arrLyric[j]=arrLyric[j+1];
  96. arrLyric[j+1]=temp;
  97. }
  98. }
  99. }
  100. lyric='';
  101. for(var i=0;i<arrLyric.length;i++){
  102. lyric+='<li id="line-'+i+'" >'+arrLyric[i]+'</li>';
  103. }
  104. $this.html('<div class="fixed-lyric-box" style="position:relative;height:100%;overflow:hidden"><ul class="lyric-list" style="position:absolute;clear:both;display:block">'+lyric+'</ul></div>');
  105. var $box=$this.find('.fixed-lyric-box');
  106. var $list=$this.find('ul.lyric-list');
  107. var height=$box.height();
  108. var lineHeight=$list.height()/arrLyric.length;
  109. $list.css({'left':'0px','top':(height-lineHeight)/2+'px'});
  110. clearInterval(lyric_listener);
  111. lyric_listener=setInterval(function(){ // 定时检查当前播放进度,作出滚动动作
  112. var pos=o.getPosition();
  113. if(arrTime[currentLine]<=pos){ // 当前显示行号时间小于歌曲进度,需要正常向前移动
  114. for(var i=currentLine;i<arrLyric.length;i++){
  115. if(arrTime[i+1]>pos||i+1==arrLyric.length){
  116. var height=$box.height();
  117. currentLine=i;
  118. $list.find('li.active').removeClass('active');
  119. $list.find('li#line-'+currentLine).addClass('active');
  120. var topPos=(height-lineHeight)/2-(currentLine)*lineHeight;
  121. $list.animate({
  122. 'top':topPos+'px'
  123. },400,function(){
  124. });
  125. break;
  126. }
  127. }
  128. }else{
  129. for(var i=currentLine;i>0;i--){
  130. if(arrTime[i-1]<pos||i==0){
  131. var height=$box.height();
  132. currentLine=i;
  133. $list.find('li.active').removeClass('active');
  134. $list.find('li#line-'+currentLine).addClass('active');
  135. var topPos=(height-lineHeight)/2-(currentLine)*lineHeight;
  136. $list.animate({
  137. 'top':topPos+'px'
  138. },400,function(){
  139. });
  140. break;
  141. }
  142. }
  143. }
  144. },o.speed);
  145. });
  146. };
  147. $.fn.jqlyric.defaults={
  148. lyric:'[00:00.00]未找到歌词', // 歌词字符串 (lrc格式)
  149. speed:500, // 歌词进度一首歌间隔(毫秒)
  150. getPosition:function(){ // 获取播放器当前播放位置
  151. gtime+=0.5;
  152. return gtime;
  153. }
  154. }
  155. function toSeconds(t){ //把形如:01:25的时间转化成秒;
  156. var m=t.substring(0,t.indexOf(":"));
  157. var s=t.substring(t.indexOf(":")+1);
  158. s=parseInt(s.replace(/\b(0+)/gi,""));
  159. if(isNaN(s))
  160. s=0;
  161. var totalt=parseInt(m)*60+s;
  162. //alert(parseInt(s.replace(/\b(0+)/gi,"")));
  163. if(isNaN(totalt))
  164. return 0;
  165. return totalt;
  166. }
  167. })(jQuery);
  168. $(function() {
  169. var audio=document.getElementById("audio");
  170. var fun_getPosition=function(){
  171. return audio.currentTime;
  172. }
  173. var url=audio.currentSrc;
  174. var urlArr = url.split('?');
  175. var k = urlArr[0], appU = k.split('/');
  176. var srcFileExt = appU[appU.length - 1].split('.')[1];
  177. url=url.replace("."+srcFileExt,".lrc");
  178. var url = "http://122.114.50.251:8010/getJSON.php?callback=?&url="+(url);
  179. $.getJSON(url, function(data){
  180. var lrcContent=data.data;
  181. if(!lrcContent||lrcContent==""){
  182. return;
  183. }
  184. var $container=$('#lyriccontainer'); //用于显示歌词的容器对象,样式自己定义
  185. $container.jqlyric({
  186. lyric:lrcContent, // 歌词字符串,标准lrc文件格式
  187. getPosition:fun_getPosition
  188. });
  189. });
  190. });