lx-music-desktop/src/renderer/core/useApp/usePlayer/usePlayEvent.js
2021-12-08 17:51:06 +08:00

126 lines
3.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
})
}