From d66b1c1bbb4a396c7b4b27e677cdba5738402262 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Wed, 26 Nov 2025 22:59:01 -0800 Subject: [PATCH] add error handler to web player --- .../audio-player/engine/web-player-engine.tsx | 106 +++++++++++------- src/renderer/utils/logger-message.ts | 1 + 2 files changed, 67 insertions(+), 40 deletions(-) diff --git a/src/renderer/features/player/audio-player/engine/web-player-engine.tsx b/src/renderer/features/player/audio-player/engine/web-player-engine.tsx index 8cc22ca99..69611edea 100644 --- a/src/renderer/features/player/audio-player/engine/web-player-engine.tsx +++ b/src/renderer/features/player/audio-player/engine/web-player-engine.tsx @@ -5,6 +5,8 @@ import ReactPlayer from 'react-player'; import { AudioPlayer, PlayerOnProgressProps } from '/@/renderer/features/player/audio-player/types'; import { convertToLogVolume } from '/@/renderer/features/player/audio-player/utils/player-utils'; +import { LogCategory, logFn } from '/@/renderer/utils/logger'; +import { logMsg } from '/@/renderer/utils/logger-message'; import { PlayerStatus } from '/@/shared/types/types'; export interface WebPlayerEngineHandle extends AudioPlayer { @@ -117,48 +119,72 @@ export const WebPlayerEngine = (props: WebPlayerEngineProps) => { const volume1 = convertToLogVolume(internalVolume1); const volume2 = convertToLogVolume(internalVolume2); + const handleOnError = (playerRef: React.RefObject, onEnded: () => void) => { + return ({ target }: ErrorEvent) => { + const { current: player } = playerRef; + + if (!player || !(target instanceof Audio)) { + return; + } + + const { error } = target; + + logFn.error(logMsg[LogCategory.PLAYER].playbackError, { + category: LogCategory.PLAYER, + meta: { error }, + }); + + if ( + error?.code !== MediaError.MEDIA_ERR_DECODE && + error?.code !== MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED + ) { + return; + } + + onEnded(); + }; + }; + return (
- {Boolean(src1) && ( - onEndedPlayer1() : undefined} - onProgress={onProgressPlayer1} - playbackRate={speed || 1} - playing={playerNum === 1 && playerStatus === PlayerStatus.PLAYING} - progressInterval={isTransitioning ? 10 : 250} - ref={player1Ref} - url={src1 || EMPTY_SOURCE} - volume={volume1} - width={0} - /> - )} - {Boolean(src2) && ( - onEndedPlayer2() : undefined} - onProgress={onProgressPlayer2} - playbackRate={speed || 1} - playing={playerNum === 2 && playerStatus === PlayerStatus.PLAYING} - progressInterval={isTransitioning ? 10 : 250} - ref={player2Ref} - url={src2 || EMPTY_SOURCE} - volume={volume2} - width={0} - /> - )} + onEndedPlayer1() : undefined} + onError={handleOnError(player1Ref, () => onEndedPlayer1())} + onProgress={onProgressPlayer1} + playbackRate={speed || 1} + playing={playerNum === 1 && playerStatus === PlayerStatus.PLAYING} + progressInterval={isTransitioning ? 10 : 250} + ref={player1Ref} + url={src1 || EMPTY_SOURCE} + volume={volume1} + width={0} + /> + onEndedPlayer2() : undefined} + onError={handleOnError(player2Ref, () => onEndedPlayer2())} + onProgress={onProgressPlayer2} + playbackRate={speed || 1} + playing={playerNum === 2 && playerStatus === PlayerStatus.PLAYING} + progressInterval={isTransitioning ? 10 : 250} + ref={player2Ref} + url={src2 || EMPTY_SOURCE} + volume={volume2} + width={0} + />
); }; diff --git a/src/renderer/utils/logger-message.ts b/src/renderer/utils/logger-message.ts index e9b18b0dd..bcb897373 100644 --- a/src/renderer/utils/logger-message.ts +++ b/src/renderer/utils/logger-message.ts @@ -32,6 +32,7 @@ export const logMsg = { moveSelectedToBottom: 'Moved selected to bottom', moveSelectedToNext: 'Moved selected to next', moveSelectedToTop: 'Moved selected to top', + playbackError: 'An error occurred during playback', setFavorite: 'Set favorite', setRating: 'Set rating', setRepeat: 'Set repeat',