add error handler to web player

This commit is contained in:
jeffvli
2025-11-26 22:59:01 -08:00
parent 3a2c5f7b11
commit d66b1c1bbb
2 changed files with 67 additions and 40 deletions
@@ -5,6 +5,8 @@ import ReactPlayer from 'react-player';
import { AudioPlayer, PlayerOnProgressProps } from '/@/renderer/features/player/audio-player/types'; import { AudioPlayer, PlayerOnProgressProps } from '/@/renderer/features/player/audio-player/types';
import { convertToLogVolume } from '/@/renderer/features/player/audio-player/utils/player-utils'; 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'; import { PlayerStatus } from '/@/shared/types/types';
export interface WebPlayerEngineHandle extends AudioPlayer { export interface WebPlayerEngineHandle extends AudioPlayer {
@@ -117,9 +119,34 @@ export const WebPlayerEngine = (props: WebPlayerEngineProps) => {
const volume1 = convertToLogVolume(internalVolume1); const volume1 = convertToLogVolume(internalVolume1);
const volume2 = convertToLogVolume(internalVolume2); const volume2 = convertToLogVolume(internalVolume2);
const handleOnError = (playerRef: React.RefObject<null | ReactPlayer>, 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 ( return (
<div id="web-player-engine" style={{ display: 'none' }}> <div id="web-player-engine" style={{ display: 'none' }}>
{Boolean(src1) && (
<ReactPlayer <ReactPlayer
config={{ config={{
file: { attributes: { crossOrigin: 'anonymous' }, forceAudio: true }, file: { attributes: { crossOrigin: 'anonymous' }, forceAudio: true },
@@ -129,6 +156,7 @@ export const WebPlayerEngine = (props: WebPlayerEngineProps) => {
id="web-player-1" id="web-player-1"
muted={isMuted} muted={isMuted}
onEnded={src1 ? () => onEndedPlayer1() : undefined} onEnded={src1 ? () => onEndedPlayer1() : undefined}
onError={handleOnError(player1Ref, () => onEndedPlayer1())}
onProgress={onProgressPlayer1} onProgress={onProgressPlayer1}
playbackRate={speed || 1} playbackRate={speed || 1}
playing={playerNum === 1 && playerStatus === PlayerStatus.PLAYING} playing={playerNum === 1 && playerStatus === PlayerStatus.PLAYING}
@@ -138,8 +166,6 @@ export const WebPlayerEngine = (props: WebPlayerEngineProps) => {
volume={volume1} volume={volume1}
width={0} width={0}
/> />
)}
{Boolean(src2) && (
<ReactPlayer <ReactPlayer
config={{ config={{
file: { attributes: { crossOrigin: 'anonymous' }, forceAudio: true }, file: { attributes: { crossOrigin: 'anonymous' }, forceAudio: true },
@@ -149,6 +175,7 @@ export const WebPlayerEngine = (props: WebPlayerEngineProps) => {
id="web-player-2" id="web-player-2"
muted={isMuted} muted={isMuted}
onEnded={src2 ? () => onEndedPlayer2() : undefined} onEnded={src2 ? () => onEndedPlayer2() : undefined}
onError={handleOnError(player2Ref, () => onEndedPlayer2())}
onProgress={onProgressPlayer2} onProgress={onProgressPlayer2}
playbackRate={speed || 1} playbackRate={speed || 1}
playing={playerNum === 2 && playerStatus === PlayerStatus.PLAYING} playing={playerNum === 2 && playerStatus === PlayerStatus.PLAYING}
@@ -158,7 +185,6 @@ export const WebPlayerEngine = (props: WebPlayerEngineProps) => {
volume={volume2} volume={volume2}
width={0} width={0}
/> />
)}
</div> </div>
); );
}; };
+1
View File
@@ -32,6 +32,7 @@ export const logMsg = {
moveSelectedToBottom: 'Moved selected to bottom', moveSelectedToBottom: 'Moved selected to bottom',
moveSelectedToNext: 'Moved selected to next', moveSelectedToNext: 'Moved selected to next',
moveSelectedToTop: 'Moved selected to top', moveSelectedToTop: 'Moved selected to top',
playbackError: 'An error occurred during playback',
setFavorite: 'Set favorite', setFavorite: 'Set favorite',
setRating: 'Set rating', setRating: 'Set rating',
setRepeat: 'Set repeat', setRepeat: 'Set repeat',