From f9f8297fd683c5ecac444ecb2842e6a257d9864c Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 23 Nov 2024 17:14:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=AD=8C=E6=9B=B2URL?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../useApp/usePlayer/usePreloadNextMusic.ts | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/renderer/core/useApp/usePlayer/usePreloadNextMusic.ts b/src/renderer/core/useApp/usePlayer/usePreloadNextMusic.ts index 7b16b3b393..ff7d63250a 100644 --- a/src/renderer/core/useApp/usePlayer/usePreloadNextMusic.ts +++ b/src/renderer/core/useApp/usePlayer/usePreloadNextMusic.ts @@ -5,9 +5,46 @@ import { musicInfo } from '@renderer/store/player/state' // import { getList } from '@renderer/store/utils' import { getNextPlayMusicInfo, resetRandomNextMusicInfo } from '@renderer/core/player' import { getMusicUrl } from '@renderer/core/music' -import { checkUrl } from '@renderer/utils/request' import { appSetting } from '@renderer/store/setting' +let audio: HTMLAudioElement +const initAudio = () => { + if (audio) return + audio = new Audio() + audio.controls = false + audio.preload = 'auto' + audio.crossOrigin = 'anonymous' + audio.muted = true + audio.volume = 0 + audio.autoplay = true + audio.addEventListener('playing', () => { + audio.pause() + }) +} +const checkMusicUrl = async(url: string) => { + initAudio() + return new Promise((resolve) => { + const clear = () => { + audio.removeEventListener('error', handleErr) + audio.removeEventListener('canplay', handlePlay) + } + const handleErr = () => { + if (audio?.error?.code !== 1) { + resolve(false) + } else { + resolve(true) + } + } + const handlePlay = () => { + clear() + resolve(true) + } + audio.addEventListener('error', handleErr) + audio.addEventListener('canplay', handlePlay) + audio.src = url + }) +} + const preloadMusicInfo = { isLoading: false, preProgress: 0, @@ -28,9 +65,10 @@ const preloadNextMusicUrl = async(curTime: number) => { const url = await getMusicUrl({ musicInfo: info.musicInfo }).catch(() => '') if (url) { console.log('preload url', url) - const result = await checkUrl(url).then(() => true).catch(() => false) + const result = await checkMusicUrl(url) if (!result) { const url = await getMusicUrl({ musicInfo: info.musicInfo, isRefresh: true }).catch(() => '') + void checkMusicUrl(url) console.log('preload url refresh', url) } }