This commit is contained in:
lyswhut
2022-10-29 11:36:35 +08:00
parent 66b965d9f7
commit e45cee6596
715 changed files with 57096 additions and 31771 deletions
@@ -0,0 +1,140 @@
import { onBeforeUnmount } from '@common/utils/vueTools'
import { useI18n } from '@renderer/plugins/i18n'
import { musicInfo, playMusicInfo } from '@renderer/store/player/state'
import { setStop, isEmpty } from '@renderer/plugins/player'
import { playNext, setMusicUrl } from '@renderer/core/player'
import { setAllStatus } from '@renderer/store/player/action'
import { appSetting } from '@renderer/store/setting'
export default () => {
const t = useI18n()
let retryNum = 0
let prevTimeoutId: string | null = null
let loadingTimeout: NodeJS.Timeout | null = null
let delayNextTimeout: NodeJS.Timeout | null = null
const startLoadingTimeout = () => {
// console.log('start load timeout')
clearLoadingTimeout()
loadingTimeout = setTimeout(() => {
if (window.lx.isPlayedStop) {
prevTimeoutId = null
setAllStatus('')
return
}
// 如果加载超时,则尝试刷新URL
if (prevTimeoutId == musicInfo.id) {
prevTimeoutId = null
void playNext(true)
} else {
prevTimeoutId = musicInfo.id
if (playMusicInfo.musicInfo) setMusicUrl(playMusicInfo.musicInfo, true)
}
}, 25000)
}
const clearLoadingTimeout = () => {
if (!loadingTimeout) return
// console.log('clear load timeout')
clearTimeout(loadingTimeout)
loadingTimeout = null
}
const clearDelayNextTimeout = () => {
// console.log(this.delayNextTimeout)
if (!delayNextTimeout) return
clearTimeout(delayNextTimeout)
delayNextTimeout = null
}
const addDelayNextTimeout = () => {
clearDelayNextTimeout()
delayNextTimeout = setTimeout(() => {
if (window.lx.isPlayedStop) return setAllStatus('')
void playNext(true)
}, 5000)
}
const handleLoadstart = () => {
if (window.lx.isPlayedStop) return
if (appSetting['player.autoSkipOnError']) startLoadingTimeout()
setAllStatus(t('player__loading'))
}
const handleLoadeddata = () => {
setAllStatus(t('player__loading'))
}
const handleCanplay = () => {
setAllStatus('')
}
const handlePlaying = () => {
clearLoadingTimeout()
}
const handleEmpied = () => {
clearDelayNextTimeout()
clearLoadingTimeout()
}
const handleWating = () => {
setAllStatus(t('player__buffering'))
}
const handleError = (errCode?: number) => {
if (!musicInfo.id) return
clearLoadingTimeout()
if (window.lx.isPlayedStop) return
if (!isEmpty()) setStop()
if (playMusicInfo.musicInfo && errCode !== 1 && retryNum < 2) { // 若音频URL无效则尝试刷新2次URL
// console.log(this.retryNum)
retryNum++
setMusicUrl(playMusicInfo.musicInfo, true)
setAllStatus(t('player__refresh_url'))
return
}
if (appSetting['player.autoSkipOnError']) {
if (document.hidden) {
console.warn('error skip to next')
void playNext(true)
} else {
setAllStatus(t('player__error'))
setTimeout(addDelayNextTimeout)
}
}
}
const handleSetPlayInfo = () => {
retryNum = 0
prevTimeoutId = null
clearDelayNextTimeout()
clearLoadingTimeout()
}
// const handlePlayedStop = () => {
// clearDelayNextTimeout()
// clearLoadingTimeout()
// }
window.app_event.on('playerLoadstart', handleLoadstart)
window.app_event.on('playerLoadeddata', handleLoadeddata)
window.app_event.on('playerCanplay', handleCanplay)
window.app_event.on('playerPlaying', handlePlaying)
window.app_event.on('playerWaiting', handleWating)
window.app_event.on('playerEmptied', handleEmpied)
window.app_event.on('playerError', handleError)
window.app_event.on('musicToggled', handleSetPlayInfo)
onBeforeUnmount(() => {
window.app_event.off('playerLoadstart', handleLoadstart)
window.app_event.off('playerLoadeddata', handleLoadeddata)
window.app_event.off('playerCanplay', handleCanplay)
window.app_event.off('playerPlaying', handlePlaying)
window.app_event.off('playerWaiting', handleWating)
window.app_event.off('playerEmptied', handleEmpied)
window.app_event.off('playerError', handleError)
window.app_event.off('musicToggled', handleSetPlayInfo)
})
}