首先需要知道lrc歌词的一版格式,然后才能继续下去。
lrc歌词格式
[00:00.88]习惯一个人
[00:07.95]作词;刘崇健
[00:14.39]作曲;刘崇健
[00:21.56]演唱;刘崇健
[00:32.43]亲爱的 谢谢你还记得好久不见
[00:39.39]分开了以后 不是说好了 请勿挂念
[00:46.62]我已经习惯 冷眼看人生的 感慨万千
[00:53.87]我不再贪心 也不再想念 那过去的疲倦
[01:00.93]爱已经走远 我又回到了 一个人的空间
由上可知道由时间和正文两部分构成,所以接下来就好办了;
思路
因为lrc是gbk格式,而node不支持这个格式,所以需要第三方插件iconv-lite。
源码:
const iconv = require('iconv-lite');
const fs = require('fs');
fs.readFile('./xiguan.lrc', (err, data) => {
if (err) {
console.error(err);
} else {
let lrc = iconv.decode(data, 'UTF8').split('\n');
let regx = /\[(\d{2}):(\d{2})\.(\d{2})](.*)/;
let newregx = /\[\w{2}:(.*)]/;
//因为lrc分为两部分,所以我们需要正则表达式提取这两部分,特别是对时间的提取。
//转换成数组,然后通过foreach遍历
let start = new Date().getTime();
lrc.forEach((value) => {
let str = regx.exec(value);
if (str) {
// regx中的{2}是因为时,分,秒都会存在两位数,不会只有一位数。下面的newregx // 是 对歌词开头的一些其他部分的处理。可以忽略!
//下面是时间的处理,需要将时分秒转换为ms。所以有以下代码的存在
let minute = parseFloat(str[1]);
let second = parseFloat(str[2]);
let millisecond = parseFloat(str[3]);
let content = str[4];
let end = new Date().getTime();
let time = minute * 60 * 1000 + second * 1000 + millisecond - (end - start);
setTimeout(() => {
console.log("[" + minute + ":" + second + ":" + millisecond + "]",content);
}, time);
} else {
let deputy = newregx.exec(value);
if (deputy) {
console.log(deputy[1]);
}
}
});
}
});
注意lrc文件和js文件在同一目录下。
运行图: