From 70b9aa46114b3d60435499e33a85b93c162ecaa9 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 20 May 2024 17:49:41 -0400 Subject: [PATCH 1/2] Fix playback interceptor rejecting --- src/components/playback/playbackmanager.js | 71 ++++++++++++++-------- src/plugins/playAccessValidation/plugin.js | 3 +- 2 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 14b23ad940..3d4638144a 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2267,7 +2267,7 @@ class PlaybackManager { if (item.IsPlaceHolder) { loading.hide(); showPlaybackInfoErrorMessage(self, 'PlaybackErrorPlaceHolder'); - return Promise.reject(); + return Promise.resolve(); } // Normalize defaults to simplfy checks throughout the process @@ -2285,31 +2285,15 @@ class PlaybackManager { const mediaType = item.MediaType; return runInterceptors(item, playOptions) - .then(() => { - if (playOptions.fullscreen) { - loading.show(); - } - - 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) + .then(() => detectBitrate(apiClient, item, mediaType, playOptions)) + .then((bitrate) => { + return playAfterBitrateDetect(bitrate, item, playOptions, onPlaybackStartedFn, prevSource) + .catch(onPlaybackRejection); + }) + .catch(() => { + /* NOTE: Any errors should already be handled, but interceptors will reject to prevent playback. */ + }) .finally(() => { if (playOptions.fullscreen) { loading.hide(); @@ -2328,7 +2312,13 @@ class PlaybackManager { Events.trigger(self, 'playbackcancelled'); } - function onInterceptorRejection(e) { + function onInterceptorRejection() { + cancelPlayback(); + + return Promise.reject(); + } + + function onPlaybackRejection(e) { cancelPlayback(); let displayErrorCode = 'ErrorDefault'; @@ -2343,7 +2333,7 @@ class PlaybackManager { showPlaybackInfoErrorMessage(self, displayErrorCode); - return Promise.reject(); + return Promise.resolve(); } function destroyPlayer(player) { @@ -2502,6 +2492,33 @@ class PlaybackManager { } } + function detectBitrate(apiClient, item, mediaType, playOptions) { + // FIXME: This is gnarly, but don't want to change too much here in a bugfix + return Promise.resolve() + .then(() => { + if (playOptions.fullscreen) { + loading.show(); + } + + 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)); + } + function playAfterBitrateDetect(maxBitrate, item, playOptions, onPlaybackStartedFn, prevSource) { const startPosition = playOptions.startPositionTicks; diff --git a/src/plugins/playAccessValidation/plugin.js b/src/plugins/playAccessValidation/plugin.js index 3081f8cf49..13527ddad3 100644 --- a/src/plugins/playAccessValidation/plugin.js +++ b/src/plugins/playAccessValidation/plugin.js @@ -35,7 +35,8 @@ class PlayAccessValidation { return Promise.reject(); } - return showErrorMessage().finally(Promise.reject); + return showErrorMessage() + .finally(() => Promise.reject()); }); } } From 2280d98785d5819b096afebbaa2e5a6d3585e0cb Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 21 May 2024 12:08:21 -0400 Subject: [PATCH 2/2] Restore promise rejects --- src/components/playback/playbackmanager.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 3d4638144a..c11e176df3 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2267,7 +2267,7 @@ class PlaybackManager { if (item.IsPlaceHolder) { loading.hide(); showPlaybackInfoErrorMessage(self, 'PlaybackErrorPlaceHolder'); - return Promise.resolve(); + return Promise.reject(); } // Normalize defaults to simplfy checks throughout the process @@ -2284,16 +2284,17 @@ class PlaybackManager { // TODO: This should be the media type requested, not the original media type const mediaType = item.MediaType; + if (playOptions.fullscreen) { + loading.show(); + } + return runInterceptors(item, playOptions) .catch(onInterceptorRejection) - .then(() => detectBitrate(apiClient, item, mediaType, playOptions)) + .then(() => detectBitrate(apiClient, item, mediaType)) .then((bitrate) => { return playAfterBitrateDetect(bitrate, item, playOptions, onPlaybackStartedFn, prevSource) .catch(onPlaybackRejection); }) - .catch(() => { - /* NOTE: Any errors should already be handled, but interceptors will reject to prevent playback. */ - }) .finally(() => { if (playOptions.fullscreen) { loading.hide(); @@ -2333,7 +2334,7 @@ class PlaybackManager { showPlaybackInfoErrorMessage(self, displayErrorCode); - return Promise.resolve(); + return Promise.reject(); } function destroyPlayer(player) { @@ -2492,14 +2493,10 @@ class PlaybackManager { } } - function detectBitrate(apiClient, item, mediaType, playOptions) { + function detectBitrate(apiClient, item, mediaType) { // FIXME: This is gnarly, but don't want to change too much here in a bugfix return Promise.resolve() .then(() => { - if (playOptions.fullscreen) { - loading.show(); - } - if (!isServerItem(item) || itemHelper.isLocalItem(item)) { return Promise.reject('skip bitrate detection'); }