像音乐播放器一样,可以把歌词文件解析为方便使用的对象

效果如下:
解析效果

代码如下:
用法:

/***** 用法 ******/
const lrc = `
        [ti:沙漠骆驼]
[ar:展展与罗罗]
[al:]
[by:芥末]

[00:00.00]沙漠骆驼 - 展展与罗罗
[00:03.00]作词:展展与罗罗
[00:06.00]作曲:展展与罗罗
[00:09.00]歌词编辑:果果
[00:18.00]
[00:26.21]我要穿越这片沙漠
[00:28.24]找寻真的自我
[00:30.39]身边只有一匹骆驼陪我
[00:34.75]这片风儿吹过
[00:36.92]那片云儿飘过
[00:39.15]突然之间出现爱的小河
[00:43.60]我跨上沙漠之舟
[00:45.77]背上烟斗和沙漏
[00:47.88]手里还握着一壶烈酒
[05:24.97]END `;
const result = parseLyric(lrc)
console.log(result);
/***** 用法 ******/
const result = parseLyric(lrc)
console.log(result);
function parseLyric(lyric) {
    const lrcObj = {
        ti: '',
        ar: '',
        al: '',
        by: '',
        lrc: []
    };
    /*
        [ar:艺人名]
        [ti:曲名]
        [al:专辑名]
        [by:编者(指编辑LRC歌词的人)]
        [offset:时间补偿值] 其单位是毫秒,正值表示整体提前,负值相反。这是用于总体
    */
    const lrcArr = lyric.split("\n").filter(function (value) {
        // 1.通过回车去分割歌词每一行,遍历数组,去除空行空格
        return value.trim() !== ''
    }).map(function (value) {
        // 2.解析歌词
        const line = parseLyricLine(value.trim())
        // console.log(line);
        if (line.type === 'lyric') {
            lrcObj.lrc.push(line.data)
        } else {
            lrcObj[line.type] = line.data
        }
        return value.trim();
    })
    function parseLyricLine(line) {
        const tiArAlByExp = /^\[(ti|ar|al|by):(.*)\]$/
        const lyricExp = /^\[(\d{2}):(\d{2}).(\d{2})\](.*)/
        let result
        if ((result = line.match(tiArAlByExp)) !== null) {
            return {
                type: result[1],
                data: result[2]
            }
        } else if ((result = line.match(lyricExp)) !== null) {
            return {
                type: 'lyric',
                data: {
                    time: {
                        m: result[1],
                        s: result[2],
                        ms: result[3]
                    },
                    lyric: result[4].trim()
                }
            }
        }
    }
    return lrcObj;
}
上一篇 下一篇