lx-music-desktop/src/renderer/core/useApp/usePlayer/useLyric.js

145 lines
4.7 KiB
JavaScript

import { onBeforeUnmount, watch, markRawList } from '@renderer/utils/vueTools'
import Lyric from '@renderer/utils/lyric-font-player'
import { getCurrentTime as getPlayerCurrentTime } from '@renderer/plugins/player'
import { setDesktopLyricInfo, onGetDesktopLyricInfo } from '@renderer/utils/tools'
import { player as eventPlayerNames } from '@renderer/event/names'
import { lyric, setText, setLines, setOffset, setTempOffset } from '@renderer/core/share/lyric'
import { musicInfo, setStatusText, isPlay, playMusicInfo } from '@renderer/core/share/player'
export default ({ setting }) => {
const lrc = window.lrc = new Lyric({
lineClassName: 'lrc-content',
fontClassName: 'font',
shadowContent: false,
activeLineClassName: 'active',
onPlay(line, text) {
setText(text, line)
setStatusText(text)
// console.log(line, text)
},
onSetLyric(lines, offset) { // listening lyrics seting event
// console.log(lines) // lines is array of all lyric text
setLines(markRawList([...lines]))
setText(lines[0] ?? '', 0)
setOffset(offset) // 歌词延迟
setTempOffset(0) // 重置临时延迟
},
// offset: 80,
})
const getCurrentTime = () => {
return getPlayerCurrentTime() * 1000 + lyric.tempOffset
}
const setPlayInfo = ({ musicInfo }) => {
setDesktopLyricInfo('music_info', {
songmid: musicInfo.songmid,
singer: musicInfo.singer,
name: musicInfo.name,
album: musicInfo.album,
})
}
const setLyric = () => {
if (!musicInfo.songmid) return
const extendedLyrics = []
if (setting.value.player.isShowLyricTranslation && musicInfo.tlrc) extendedLyrics.push(musicInfo.tlrc)
if (setting.value.player.isShowLyricRoma && musicInfo.rlrc) extendedLyrics.push(musicInfo.rlrc)
lrc.setLyric(
setting.value.player.isPlayLxlrc && musicInfo.lxlrc ? musicInfo.lxlrc : musicInfo.lrc,
extendedLyrics,
)
setDesktopLyricInfo('lyric', { lrc: musicInfo.lrc, tlrc: musicInfo.tlrc, rlrc: musicInfo.rlrc, lxlrc: musicInfo.lxlrc })
if (isPlay.value && (musicInfo.url || playMusicInfo.listId == 'download')) {
setTimeout(() => {
const time = getCurrentTime()
setDesktopLyricInfo('play', time)
lrc.play(time)
})
}
}
const setLyricOffset = offset => {
setTempOffset(offset)
if (isPlay.value && (musicInfo.url || playMusicInfo.listId == 'download')) {
setTimeout(() => {
const time = getCurrentTime()
setDesktopLyricInfo('play', time)
lrc.play(time)
})
}
}
const handlePlay = () => {
if (!musicInfo.lrc) return
const currentTime = getCurrentTime()
lrc.play(currentTime)
setDesktopLyricInfo('play', currentTime)
}
const handlePause = () => {
lrc.pause()
setDesktopLyricInfo('pause')
}
const handleStop = () => {
lrc.pause()
setDesktopLyricInfo('stop')
setLines([])
setText('', 0)
}
watch(() => setting.value.player.isShowLyricTranslation, setLyric)
watch(() => setting.value.player.isPlayLxlrc, setLyric)
const rGetDesktopLyricInfo = onGetDesktopLyricInfo((event, info) => {
switch (info.action) {
case 'info':
setDesktopLyricInfo('info', {
songmid: musicInfo.songmid,
singer: musicInfo.singer,
name: musicInfo.name,
album: musicInfo.album,
lrc: musicInfo.lrc,
tlrc: musicInfo.tlrc,
rlrc: musicInfo.rlrc,
lxlrc: musicInfo.lxlrc,
isPlay: isPlay.value,
line: lyric.line,
played_time: getCurrentTime(),
}, info)
break
case 'status':
setDesktopLyricInfo('status', {
isPlay: isPlay.value,
line: lyric.line,
played_time: getCurrentTime(),
}, info)
break
default:
break
}
})
window.eventHub.on(eventPlayerNames.play, handlePlay)
window.eventHub.on(eventPlayerNames.pause, handlePause)
window.eventHub.on(eventPlayerNames.stop, handleStop)
window.eventHub.on(eventPlayerNames.error, handlePause)
window.eventHub.on(eventPlayerNames.setPlayInfo, setPlayInfo)
window.eventHub.on(eventPlayerNames.updateLyric, setLyric)
window.eventHub.on(eventPlayerNames.updateLyricOffset, setLyricOffset)
onBeforeUnmount(() => {
rGetDesktopLyricInfo()
window.eventHub.off(eventPlayerNames.play, handlePlay)
window.eventHub.off(eventPlayerNames.pause, handlePause)
window.eventHub.off(eventPlayerNames.stop, handleStop)
window.eventHub.off(eventPlayerNames.error, handlePause)
window.eventHub.off(eventPlayerNames.setPlayInfo, setPlayInfo)
window.eventHub.off(eventPlayerNames.updateLyric, setLyric)
window.eventHub.off(eventPlayerNames.updateLyricOffset, setLyricOffset)
})
}