浏览代码

增加滚动歌词功能

ecd\tbw_1357250783514014 4 年之前
父节点
当前提交
0199d80c98
共有 5 个文件被更改,包括 252 次插入7 次删除
  1. 2 2
      book.toml
  2. 10 5
      src/chanting/evening_chanting_A.md
  3. 15 0
      theme/mycss/lrc.css
  4. 1 0
      theme/myjs/jquery-1.12.3.min.js
  5. 224 0
      theme/myjs/lrc.js

+ 2 - 2
book.toml

@@ -7,9 +7,9 @@ title = "教理部口袋书学习手册范例"
 
 
 [output.html]
-additional-js = ["theme/myjs/mermaid.min.js", "theme/myjs/mermaid-init.js"]
+additional-js = ["theme/myjs/mermaid.min.js", "theme/myjs/mermaid-init.js","theme/myjs/jquery-1.12.3.min.js","theme/myjs/lrc.js"]
 mathjax-support = true
-additional-css = ["theme/mycss/tai-tham-kh-new-v3.ttf","theme/mycss/font.css"] 
+additional-css = ["theme/mycss/tai-tham-kh-new-v3.ttf","theme/mycss/font.css","theme/mycss/lrc.css"] 
 
 [output.html.fold]
 enable = true

+ 10 - 5
src/chanting/evening_chanting_A.md

@@ -1,9 +1,13 @@
 # **晚 课**<br>**大金塔课诵本**<br>**傣调试用版**
-
-<audio controls>
-  <source src="http://122.114.50.251:8010/jly/audio/大金塔早课(傣调).mp3" type="audio/mpeg">
+<div>
+<audio id="audio" controls>
+  <source src="http://122.114.50.251:8010/jly/audio/大金塔晚课(礼敬洁地)1031.mp3" type="audio/mpeg">
 </audio>
-
+</div>
+<div class="live" id="lyriccontainer" style="height:300px;width:100%;over-flow:scroll">
+     
+</div>
+<div>
 ## Ratanattaya vandanā(礼拜三宝)
 
 拉答那答亚 万达那
@@ -2292,4 +2296,5 @@ Sādhu! Sādhu! Sādhu!
 
 (注音)
 
-善哉!善哉!善哉!
+善哉!善哉!善哉!
+</div>

+ 15 - 0
theme/mycss/lrc.css

@@ -0,0 +1,15 @@
+
+.live .active {
+  background: rgb(202,234,206);
+  font-weight:bold
+}
+.live ul{
+	list-style-type:none;
+	padding:0 0 0 0;
+}
+
+.live ul{
+	font-family:"Times New Roman",Georgia,Serif;
+}
+
+

文件差异内容过多而无法显示
+ 1 - 0
theme/myjs/jquery-1.12.3.min.js


+ 224 - 0
theme/myjs/lrc.js

@@ -0,0 +1,224 @@
+/* ===================================================
+ * jqlyric.js v0.1
+ * shawnk@qq.com
+
+ * 使用方法
+ * var $container=$('#lyriccontainer'); //用于显示歌词的容器对象,样式自己定义
+ * $container.jqlyric({
+ *      lyric:'\
+            [ti:存在] \
+            [ar:汪峰] \
+            [al:存在] \
+            [by:Love] \
+            [00:00.00]汪峰 - 存在 \
+            [00:00.68]多少人走着却困在原地 \
+            [00:07.93]多少人活着却如同死去',   // 歌词字符串,标准lrc文件格式
+ *      speed:1000,                  // 歌词滚动间隔 (毫秒)
+ *      getPosition:function(){      // 获取当前播放位置的函数(返回秒数), 请定义外部函数,不指定本参数则默认从调用插件开始自动播放
+ *          return position;
+ *      }
+ * });
+
+ * ===================================================
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+(function($) {
+    var gtime=0;
+    var lyric_listener;
+    $.fn.jqlyric = function(options) {
+        var opts = $.extend({}, $.fn.jqlyric.defaults, options);
+
+        return this.each(function(){
+            var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
+            var $this=$(this);
+
+            var arrLyric=new Array();   //放存汉字的歌词
+            var arrTime=new Array();    //存放时间
+            var currentLine=0;          //当前活动的歌词行号
+
+            // 开始解析歌词
+            var lyric=o.lyric;
+            lyric=lyric.replace(/\]\n/g,'\]\n\|\|');
+            lyric=lyric.replace(/\]\s\[/g,'\]\[');
+            lyric=lyric.replace(/\]\[/g,'====');
+            lyric=lyric.replace(/\[/g,'\|\|\[');
+            lyric=lyric.replace(/====/g,'\]\[');
+
+            lyric=lyric.replace(/\|\|\|\|\|\|\|\|/g,'\|\|');
+            lyric=lyric.replace(/\|\|\|\|\|\|/g,'\|\|');
+            lyric=lyric.replace(/\|\|\|\|/g,'\|\|');
+
+            
+            //将歌词解析成数组
+            var arrly=lyric.split('||');
+
+            for(var i=0;i<arrly.length;i++){
+                var str=arrly[i];
+
+                var left=0; //"["的个数
+                var leftAr=new Array();
+                for(var k=0;k<str.length;k++){
+                    if(str.charAt(k)=="["){
+                        leftAr[left]=k;
+                        left++;
+                    }
+                }
+
+                if(left!=0){
+                    for(var j=0;j<leftAr.length;j++){
+                        var tag=str.charAt(leftAr[j]+1)+str.charAt(leftAr[j]+2);
+
+                        if(tag=='ti'||tag=='ar'||tag=='by'||tag=='al'){
+                            // 歌曲特征字段
+                            var tmp=str.split(tag+':');
+                            tmp=tmp[1].split(']');
+                            var text=tmp[0];
+                            tag=tag.replace(/([ti|ar|al|by])/g,'');
+                            arrLyric.push(tag+text);
+                            arrTime.push(toSeconds('00:00:00'));   //
+                        }else{
+                            var text=str.substring(str.lastIndexOf("]")+1);
+                            if(text==''){text='&nbsp;';}
+                            arrLyric.push(text);              //放歌词
+                            arrTime.push(toSeconds(str.substring(leftAr[j]+1,leftAr[j]+6)));   //放时间       
+							
+                        }
+                    }
+                }
+            }
+
+            // 所有歌词按时间顺序排列
+            for(var k=0;k<arrTime.length;k++){
+                for(var j=0;j<arrTime.length-k;j++){
+                    if(arrTime[j]>arrTime[j+1]){
+                        temp=arrTime[j];
+                        arrTime[j]=arrTime[j+1];
+                        arrTime[j+1]=temp;
+
+                        temp=arrLyric[j];
+                        arrLyric[j]=arrLyric[j+1];
+                        arrLyric[j+1]=temp;
+                    }
+                }
+            }
+            lyric='';
+            for(var i=0;i<arrLyric.length;i++){
+                lyric+='<li id="line-'+i+'" >'+arrLyric[i]+'</li>';
+            }
+
+            $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>');
+
+            var $box=$this.find('.fixed-lyric-box');
+            var $list=$this.find('ul.lyric-list');
+
+            var height=$box.height();
+            var lineHeight=$list.height()/arrLyric.length;
+
+            $list.css({'left':'0px','top':(height-lineHeight)/2+'px'});
+            
+            clearInterval(lyric_listener);
+            lyric_listener=setInterval(function(){     // 定时检查当前播放进度,作出滚动动作
+                var pos=o.getPosition();
+                if(arrTime[currentLine]<=pos){  // 当前显示行号时间小于歌曲进度,需要正常向前移动
+                    for(var i=currentLine;i<arrLyric.length;i++){
+                        if(arrTime[i+1]>pos||i+1==arrLyric.length){
+                            var height=$box.height();
+                            currentLine=i;
+
+                            $list.find('li.active').removeClass('active');
+                            $list.find('li#line-'+currentLine).addClass('active');
+
+                            var topPos=(height-lineHeight)/2-(currentLine)*lineHeight;
+
+                            $list.animate({
+                                'top':topPos+'px'
+                            },400,function(){
+
+                            });
+                            break;
+                        }
+                    }
+                }else{
+                    for(var i=currentLine;i>0;i--){
+                        if(arrTime[i-1]<pos||i==0){
+                            var height=$box.height();
+                            currentLine=i;
+
+                            $list.find('li.active').removeClass('active');
+                            $list.find('li#line-'+currentLine).addClass('active');
+
+                            var topPos=(height-lineHeight)/2-(currentLine)*lineHeight;
+
+                            $list.animate({
+                                'top':topPos+'px'
+                            },400,function(){
+
+                            });
+                            break;
+                        }
+                    }                    
+                }
+            },o.speed);
+        });
+    };
+
+    $.fn.jqlyric.defaults={
+        lyric:'[00:00.00]未找到歌词',   // 歌词字符串 (lrc格式)
+        speed:500,                      // 歌词进度一首歌间隔(毫秒)
+        getPosition:function(){         // 获取播放器当前播放位置
+            gtime+=0.5;
+            return gtime;
+        }
+    }
+
+    function toSeconds(t){     //把形如:01:25的时间转化成秒;
+        var m=t.substring(0,t.indexOf(":"));
+        var s=t.substring(t.indexOf(":")+1);
+        s=parseInt(s.replace(/\b(0+)/gi,""));
+        if(isNaN(s))
+            s=0;
+        var totalt=parseInt(m)*60+s;
+        //alert(parseInt(s.replace(/\b(0+)/gi,"")));
+        if(isNaN(totalt))
+            return 0;
+        return totalt;
+    }
+
+})(jQuery);
+
+$(function() { 
+  var audio=document.getElementById("audio");
+  var fun_getPosition=function(){
+	return audio.currentTime;
+  } 
+  var url=audio.currentSrc;
+  var urlArr = url.split('?');
+  var k = urlArr[0], appU = k.split('/');
+  var srcFileExt = appU[appU.length - 1].split('.')[1];
+  url=url.replace("."+srcFileExt,".lrc");
+  var url = "http://122.114.50.251:8010/getJSON.php?callback=?&url="+(url);  
+  
+  $.getJSON(url, function(data){  
+	var lrcContent=data.data;
+	if(!lrcContent||lrcContent==""){
+		return;
+	}
+	var $container=$('#lyriccontainer'); //用于显示歌词的容器对象,样式自己定义
+	$container.jqlyric({
+		  lyric:lrcContent,   // 歌词字符串,标准lrc文件格式
+		  getPosition:fun_getPosition
+	});
+  }); 	
+});

部分文件因为文件数量过多而无法显示