126 lines
3.8 KiB
JavaScript
126 lines
3.8 KiB
JavaScript
import { onBeforeUnmount, useI18n } from '@renderer/utils/vueTools'
|
||
import { player as eventPlayerNames } from '@renderer/event/names'
|
||
import { wait, waitCancel } from '@renderer/utils/tools'
|
||
import { musicInfo, musicInfoItem, playMusicInfo } from '@renderer/core/share/player'
|
||
|
||
export default ({
|
||
playNext,
|
||
setStatus,
|
||
setUrl,
|
||
}) => {
|
||
const { t } = useI18n()
|
||
let retryNum = 0
|
||
let prevTimeoutId = null
|
||
|
||
let loadingTimeout
|
||
let delayNextTimeout
|
||
const startLoadingTimeout = () => {
|
||
// console.log('start load timeout')
|
||
clearLoadingTimeout()
|
||
loadingTimeout = Math.random()
|
||
wait(25000, loadingTimeout).then(() => {
|
||
// 如果加载超时,则尝试刷新URL
|
||
if (prevTimeoutId == musicInfo.songmid) {
|
||
prevTimeoutId = null
|
||
playNext()
|
||
} else {
|
||
prevTimeoutId = musicInfo.songmid
|
||
setUrl(musicInfoItem.value, true)
|
||
}
|
||
}).catch(_ => _)
|
||
}
|
||
const clearLoadingTimeout = () => {
|
||
if (!loadingTimeout) return
|
||
// console.log('clear load timeout')
|
||
waitCancel(loadingTimeout)
|
||
loadingTimeout = null
|
||
}
|
||
|
||
const clearDelayNextTimeout = () => {
|
||
// console.log(this.delayNextTimeout)
|
||
if (!delayNextTimeout) return
|
||
waitCancel(delayNextTimeout)
|
||
delayNextTimeout = null
|
||
}
|
||
const addDelayNextTimeout = () => {
|
||
clearDelayNextTimeout()
|
||
delayNextTimeout = Math.random()
|
||
wait(5000, delayNextTimeout).then(playNext).catch(_ => _)
|
||
}
|
||
|
||
const handleLoadstart = () => {
|
||
startLoadingTimeout()
|
||
const status = t('player__loading')
|
||
setStatus(status, status)
|
||
}
|
||
|
||
const handleLoadeddata = () => {
|
||
const status = t('player__loading')
|
||
setStatus(status, status)
|
||
}
|
||
|
||
const handleCanplay = () => {
|
||
const status = ''
|
||
setStatus(status, status)
|
||
}
|
||
|
||
const handlePlaying = () => {
|
||
clearLoadingTimeout()
|
||
}
|
||
|
||
const handleEmpied = () => {
|
||
clearDelayNextTimeout()
|
||
clearLoadingTimeout()
|
||
}
|
||
|
||
const handleWating = () => {
|
||
const status = t('player__buffering')
|
||
setStatus(status, status)
|
||
}
|
||
|
||
const handleError = errCode => {
|
||
if (!musicInfo.songmid) return
|
||
clearLoadingTimeout()
|
||
if (playMusicInfo.listId != 'download' && errCode !== 1 && retryNum < 2) { // 若音频URL无效则尝试刷新2次URL
|
||
// console.log(this.retryNum)
|
||
retryNum++
|
||
setUrl(musicInfoItem.value, true)
|
||
const status = t('player__refresh_url')
|
||
setStatus(status, status)
|
||
return
|
||
}
|
||
|
||
const status = t('player__error')
|
||
setStatus(status, status)
|
||
addDelayNextTimeout()
|
||
}
|
||
|
||
const handleSetPlayInfo = () => {
|
||
retryNum = 0
|
||
prevTimeoutId = null
|
||
clearDelayNextTimeout()
|
||
clearLoadingTimeout()
|
||
}
|
||
|
||
|
||
window.eventHub.on(eventPlayerNames.player_loadstart, handleLoadstart)
|
||
window.eventHub.on(eventPlayerNames.player_loadeddata, handleLoadeddata)
|
||
window.eventHub.on(eventPlayerNames.player_canplay, handleCanplay)
|
||
window.eventHub.on(eventPlayerNames.player_playing, handlePlaying)
|
||
window.eventHub.on(eventPlayerNames.player_waiting, handleWating)
|
||
window.eventHub.on(eventPlayerNames.player_emptied, handleEmpied)
|
||
window.eventHub.on(eventPlayerNames.error, handleError)
|
||
window.eventHub.on(eventPlayerNames.setPlayInfo, handleSetPlayInfo)
|
||
|
||
onBeforeUnmount(() => {
|
||
window.eventHub.off(eventPlayerNames.player_loadstart, handleLoadstart)
|
||
window.eventHub.off(eventPlayerNames.player_loadeddata, handleLoadeddata)
|
||
window.eventHub.off(eventPlayerNames.player_canplay, handleCanplay)
|
||
window.eventHub.off(eventPlayerNames.player_playing, handlePlaying)
|
||
window.eventHub.off(eventPlayerNames.player_waiting, handleWating)
|
||
window.eventHub.off(eventPlayerNames.player_emptied, handleEmpied)
|
||
window.eventHub.off(eventPlayerNames.error, handleError)
|
||
window.eventHub.off(eventPlayerNames.setPlayInfo, handleSetPlayInfo)
|
||
})
|
||
}
|