当前位置:秋叶网络博客 前端设计 ◊ JavaScript脚本对LRC歌词折叠展开

JavaScript脚本对LRC歌词折叠展开

作者:秋叶 发表时间:2017年6月20日

使用场景:不同播放器对lrc歌词格式支持程度不一样,尤其是网页播放器,很多不支持不同时间唱同一句歌词,所有时间会折叠成一行的格式,这种歌词在网上很常见,然而有的时候我们不能使用折叠的歌词,那么我们就要一行一行的去拆开,放到对应的时间线。手动去拆解是一件很麻烦的事情,但我之前一直这么搞。。。现在写了个脚本一劳永逸,不仅能把折叠的歌词展开,还能反过来把展开的歌词折叠起来,还能规范歌词格式。解放了双手,屡试不爽。

在线歌词转换:




脚本代码:

//把歌词展开函数,参数传完整的lrc歌词字符串,需要换行
function unfoldLrc(lrc){
    var lrcArr = lrc.split("\n");
    var lrcHead = [];
    var lrcContent = [];
    lrcArr.forEach(function(n,i){
	var times = n.match(/\[(.*?)\]/g);
	if(times){
	    var leng = times.length;
	    var index = n.indexOf(times[leng-1])
	    var txt = n.substring(index).split("]")[1];
	    times.forEach(function(item,index){
		 var time = item.match(/\[(\d{2}[\:\.]\d{2}[\:\.]\d{2})\]/);
		 if(time){
		    var hsm = time[1].split(/[\:\.]/);
		    var obj = {
		        time:hsm[0]+hsm[1]+hsm[2],
			lrc:"["+hsm[0]+":"+hsm[1]+":"+hsm[2]+"]"+txt
		    };
		    lrcContent.push(obj);
		 }else{
	             lrcHead.push(n);
		 }
	    });
	}
    });
    lrcContent.sort(function(time1,time2){
	return (time1.time - time2.time)
    });

    lrcContent.forEach(function(n,i){
	lrcContent[i] = n.lrc;
    });

    checkLrcHead(lrcHead);
    var allLrc = lrcHead.concat(lrcContent);

    return allLrc.join("\n");
}

//处理歌词头部信息,检查完整度,保证歌词标准格式
function checkLrcHead(head){
    var obj = {};
    head.forEach(function(n,i){
	var key = n.match(/\[(\w+)\:/)[1];
	var value = n.match(/\:(.*?)\]/)[1];
	if(key){
	    obj[key] = value;
	}
    });
    var keys = Object.keys(obj);
    if(keys.indexOf("ti") == -1){
	obj["ti"] = "Unknown Song";
    }
    if(keys.indexOf("ar") == -1){
	obj["ar"] = "秋叶";
    }
    if(keys.indexOf("al") == -1){
	obj["al"] = "戒不掉的心跳";
    }
    if(keys.indexOf("by") == -1){
	obj["by"] = "秋叶博客";
    }
    head.length = 0;
    var sortArr = ["ti","ar","al","by"];
    sortArr.forEach(function(n,i){
	head.push(["["+n+":"+obj[n]+"]"]);
    });
    return head;
}

//把歌词折叠,参数传完整的lrc歌词字符串,需要换行
function foldLrc(lrc){
    var lrcArr = lrc.split("\n");
    var lrcObj = {};
    var lrcHead = [];
    var newLrc = [];
    lrcArr.forEach(function(n,i){
	var times = n.match(/\[(.*?)\]/g);
	if(times){
	    var leng = times.length;
	    var index = n.indexOf(times[leng-1])
	    var txt = n.substring(index).split("]")[1];
	    times.forEach(function(item,index){
		var time = item.match(/\[(\d{2}[\:\.]\d{2}[\:\.]\d{2})\]/);
		if(time){
		    var hsm = time[1].split(/[\:\.]/);
		    if(!lrcObj[txt]){
			lrcObj[txt] = [time[0]];
		    }else{
			lrcObj[txt].push(time[0]);
		    }
		}else{
		    lrcHead.push(n);
		}
	    });
	}
    });
    checkLrcHead(lrcHead);
    var allLrc = lrcHead.concat(newLrc);
    for(var i in lrcObj){
	allLrc.push(lrcObj[i].join("")+i);
    }
    return allLrc.join("\n");
}
目录: 前端设计 | 3517次阅读