JavaScript脚本对LRC歌词折叠展开
作者:秋了秋 发表时间:2017年06月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");
}
2
文章作者: “秋了秋”个人博客,本站鼓励原创。
转载请注明本文地址:http://netblog.cn/blog/483.html