From eb463c0adb60f1ef4f3fe95730948b1391190dd6 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 27 Oct 2022 22:55:27 +0300 Subject: [PATCH 1/3] refactor: linearize promises --- src/components/playback/playbackmanager.js | 54 +++++++++++----------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index eb9d40a83b..d118b1aaf6 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2256,35 +2256,37 @@ class PlaybackManager { playOptions.isFirstItem = true; } - return runInterceptors(item, playOptions).then(function () { - if (playOptions.fullscreen) { - loading.show(); - } + const apiClient = ServerConnections.getApiClient(item.ServerId); - // TODO: This should be the media type requested, not the original media type - const mediaType = item.MediaType; + // TODO: This should be the media type requested, not the original media type + const mediaType = item.MediaType; - const onBitrateDetectionFailure = function () { - return playAfterBitrateDetect(getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn, prevSource); - }; - - if (!isServerItem(item) || itemHelper.isLocalItem(item)) { - return onBitrateDetectionFailure(); - } - - const apiClient = ServerConnections.getApiClient(item.ServerId); - apiClient.getEndpointInfo().then(function (endpointInfo) { - if ((mediaType === 'Video' || mediaType === 'Audio') && appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType)) { - return apiClient.detectBitrate().then(function (bitrate) { - appSettings.maxStreamingBitrate(endpointInfo.IsInNetwork, mediaType, bitrate); - - return playAfterBitrateDetect(bitrate, item, playOptions, onPlaybackStartedFn, prevSource); - }, onBitrateDetectionFailure); - } else { - onBitrateDetectionFailure(); + return runInterceptors(item, playOptions) + .then(() => { + if (playOptions.fullscreen) { + loading.show(); } - }, onBitrateDetectionFailure); - }, onInterceptorRejection); + + if (!isServerItem(item) || itemHelper.isLocalItem(item)) { + return Promise.reject('skip bitrate detection'); + } + + return apiClient.getEndpointInfo().then((endpointInfo) => { + if ((mediaType === 'Video' || mediaType === 'Audio') && appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType)) { + return apiClient.detectBitrate().then((bitrate) => { + appSettings.maxStreamingBitrate(endpointInfo.IsInNetwork, mediaType, bitrate); + return bitrate; + }); + } + + return Promise.reject('skip bitrate detection'); + }); + }) + .catch(() => getSavedMaxStreamingBitrate(apiClient, mediaType)) + .then((bitrate) => { + return playAfterBitrateDetect(bitrate, item, playOptions, onPlaybackStartedFn, prevSource); + }) + .catch(onInterceptorRejection); } function cancelPlayback() { From b192795c90acdebd5fe8e9f962df07e17bd1cc39 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 27 Oct 2022 22:55:27 +0300 Subject: [PATCH 2/3] fix: fix LiveTV loading not hide on fail --- src/components/playback/playbackmanager.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index d118b1aaf6..3afb0afc92 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2286,7 +2286,12 @@ class PlaybackManager { .then((bitrate) => { return playAfterBitrateDetect(bitrate, item, playOptions, onPlaybackStartedFn, prevSource); }) - .catch(onInterceptorRejection); + .catch(onInterceptorRejection) + .finally(() => { + if (playOptions.fullscreen) { + loading.hide(); + } + }); } function cancelPlayback() { From 3a87e2c52e158e04a46a48ed3c42cf280d077dce Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 23 Apr 2024 19:43:56 +0300 Subject: [PATCH 3/3] fix: show error message on playback failure --- src/components/playback/playbackmanager.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 3afb0afc92..9050bf61f7 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2305,8 +2305,21 @@ class PlaybackManager { Events.trigger(self, 'playbackcancelled'); } - function onInterceptorRejection() { + function onInterceptorRejection(e) { cancelPlayback(); + + let displayErrorCode = 'ErrorDefault'; + + if (e instanceof Response) { + if (e.status >= 500) { + displayErrorCode = `PlaybackError.${MediaError.SERVER_ERROR}`; + } else if (e.status >= 400) { + displayErrorCode = `PlaybackError.${MediaError.NO_MEDIA_ERROR}`; + } + } + + showPlaybackInfoErrorMessage(self, displayErrorCode); + return Promise.reject(); }