jz-player
Version:
Easy-to-use music player for Vue 2.x
104 lines (96 loc) • 3.14 kB
JavaScript
/**
* Parse lrc, suppose multiple time tag
* @see https://github.com/MoePlayer/APlayer/blob/master/src/js/lrc.js#L83
* @author DIYgod(https://github.com/DIYgod)
*
* @param {String} lrc_s - Format:
* [mm:ss]lyric
* [mm:ss.xx]lyric
* [mm:ss.xxx]lyric
* [mm:ss.xx][mm:ss.xx][mm:ss.xx]lyric
* [mm:ss.xx]<mm:ss.xx>lyric
*
* @return {String} [[time, text], [time, text], [time, text], ...]
*/
export function parseLrc (lrc_s) {
if (lrc_s) {
lrc_s = lrc_s.replace(/([^\]^\n])\[/g, (match, p1) => p1 + '\n[')
const lyric = lrc_s.split('\n')
const lrc = []
const lyricLen = lyric.length
for (let i = 0; i < lyricLen; i++) {
// match lrc time
const lrcTimes = lyric[i].match(/\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/g)
// match lrc text
const lrcText = lyric[i].replace(/.*\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/g, '').replace(/<(\d{2}):(\d{2})(\.(\d{2,3}))?>/g, '').replace(/^\s+|\s+$/g, '')
if (lrcTimes) {
// handle multiple time tag
const timeLen = lrcTimes.length
for (let j = 0; j < timeLen; j++) {
const oneTime = /\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/.exec(lrcTimes[j])
const min2sec = oneTime[1] * 60
const sec2sec = parseInt(oneTime[2])
const msec2sec = oneTime[4] ? parseInt(oneTime[4]) / ((oneTime[4] + '').length === 2 ? 100 : 1000) : 0
const lrcTime = min2sec + sec2sec + msec2sec
lrc.push([lrcTime, lrcText])
}
}
}
// sort by time
lrc.sort((a, b) => a[0] - b[0])
return lrc
}
else {
return []
}
}
/**
* Compare two semantic versions(major.minor.patch)
*/
export function versionCompare (semantic1, semantic2) {
if (semantic1 === semantic2) {
return 0
}
const [major1, minor1, patch1] = semantic1.split('.').map(Number)
const [major2, minor2, patch2] = semantic2.split('.').map(Number)
if (major1 > major2) {
return 1
} else if (major1 === major2) {
if (minor1 > minor2) {
return 1
} else if (minor1 === minor2) {
if (patch1 > patch2) {
return 1
}
}
}
return -1
}
export function warn (message) {
return console.warn(`[Vue-APlayer] ${message}`)
}
export function deprecatedProp (name, sinceVersion, alternative) {
return warn(`'${name}' is deprecated since v${sinceVersion}, and will be removed in future releases, use '${alternative}' instead`)
}
export function getElementViewLeft (element) {
let actualLeft = element.offsetLeft
let current = element.offsetParent
let elementScrollLeft
while (current !== null) {
actualLeft += current.offsetLeft
current = current.offsetParent
}
elementScrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft
return actualLeft - elementScrollLeft
}
export function getElementViewTop (element) {
let actualTop = element.offsetTop
let current = element.offsetParent
let elementScrollTop
while (current !== null) {
actualTop += current.offsetTop
current = current.offsetParent
}
elementScrollTop = document.body.scrollTop + document.documentElement.scrollTop
return actualTop - elementScrollTop
}