lyric-parser icon indicating copy to clipboard operation
lyric-parser copied to clipboard

使用网易云音乐API返回的歌词,调用play()后歌词不会滚动

Open AriesZzzz opened this issue 5 years ago • 1 comments

lyric.js

this.lines.push({
time: parseInt(result[1]) * 60 * 1000 +
        parseInt(result[2]) * 1000 +
        (parseInt(result[3]) || 0),
txt: txt
});

这个插件的针对网易云音乐API的返回歌词格式的时间计算有bug,本来JS字符串遇到 * 会自动转换成数字,但是在这里自动转换会有bug,需要将源码中的上述转换 时分秒 到 毫秒 的代码,全部手动parseInt()转换成数字

该bug可导致: play() 函数调用后,歌词好像不会滚动

看了源码之后: 和我之前猜想的一样,内部的计时器setTimeout,并不是没有调用,而是因为歌词间隔时间计算bug,导致delay--间隔时间很大,毫秒转换多了一个或几个 0 ,导致短时间内看不到滚动

AriesZzzz avatar Jan 08 '20 09:01 AriesZzzz

上述bug描述有误,跟自动转换没有关系,请看最新的

在lyric.js更改

this.lines.push({
time: result[1] * 60 * 1000 +
        result[2] * 1000 +
        (parseInt(result[3]) || 0),
txt: txt
});

这个插件的针对网易云音乐API的返回歌词格式的时间计算有 bug,JS 字符串遇到 * 会自动转换成数字,但源码中最后一个加数没有遇到*,最后一个数会被当成字符串拼接在前面数字后面,所以计算错误。需要将源码中的上述转换 时分秒 到 毫秒 的代码的最后一个加数转换成数字

此处parseInt()也有坑

parseInt('011') === 11 // true
parseInt(011) ===  9 // true

// 因为实参是字符串才能正确转换,并且自动转换和parseInt表现一致

AriesZzzz avatar Jan 14 '20 08:01 AriesZzzz