From dd1d2b7c9269b46806d090caf34b2fc0914990f2 Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 3 Jul 2024 17:08:30 -0500 Subject: [PATCH] Fix media item share changing share, show error on failed to play --- client/pages/share/_slug.vue | 14 +++++++++++++- server/controllers/ShareController.js | 18 +++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/client/pages/share/_slug.vue b/client/pages/share/_slug.vue index 272533b3..13a91baa 100644 --- a/client/pages/share/_slug.vue +++ b/client/pages/share/_slug.vue @@ -237,6 +237,13 @@ export default { resize() { this.windowWidth = window.innerWidth this.windowHeight = window.innerHeight + }, + playerError(error) { + console.error('Player error', error) + this.$toast.error('Failed to play audio on device') + }, + playerFinished() { + console.log('Player finished') } }, mounted() { @@ -252,12 +259,17 @@ export default { this.localAudioPlayer.set(null, this.audioTracks, false, startTime, false) this.localAudioPlayer.on('stateChange', this.playerStateChange.bind(this)) this.localAudioPlayer.on('timeupdate', this.playerTimeUpdate.bind(this)) + this.localAudioPlayer.on('error', this.playerError.bind(this)) + this.localAudioPlayer.on('finished', this.playerFinished.bind(this)) }, beforeDestroy() { window.removeEventListener('resize', this.resize) window.removeEventListener('keydown', this.keyDown) - this.localAudioPlayer.off('stateChange', this.playerStateChange) + this.localAudioPlayer.off('stateChange', this.playerStateChange.bind(this)) + this.localAudioPlayer.off('timeupdate', this.playerTimeUpdate.bind(this)) + this.localAudioPlayer.off('error', this.playerError.bind(this)) + this.localAudioPlayer.off('finished', this.playerFinished.bind(this)) this.localAudioPlayer.destroy() } } diff --git a/server/controllers/ShareController.js b/server/controllers/ShareController.js index 96f8788c..3022cb7f 100644 --- a/server/controllers/ShareController.js +++ b/server/controllers/ShareController.js @@ -40,10 +40,22 @@ class ShareController { if (req.cookies.share_session_id) { const playbackSession = ShareManager.findPlaybackSessionBySessionId(req.cookies.share_session_id) + if (playbackSession) { - Logger.debug(`[ShareController] Found share playback session ${req.cookies.share_session_id}`) - mediaItemShare.playbackSession = playbackSession.toJSONForClient() - return res.json(mediaItemShare) + const playbackSessionMediaItemShare = ShareManager.findByMediaItemId(playbackSession.mediaItemId) + if (!playbackSessionMediaItemShare) { + Logger.error(`[ShareController] Share playback session ${req.cookies.share_session_id} media item share not found with id ${playbackSession.mediaItemId}`) + return res.sendStatus(500) + } + if (playbackSessionMediaItemShare.slug === slug) { + Logger.debug(`[ShareController] Found share playback session ${req.cookies.share_session_id}`) + mediaItemShare.playbackSession = playbackSession.toJSONForClient() + return res.json(mediaItemShare) + } else { + // TODO: Close old session and use same session id + Logger.info(`[ShareController] Share playback session found with id ${req.cookies.share_session_id} but media item share slug ${playbackSessionMediaItemShare.slug} does not match requested slug ${slug}`) + res.clearCookie('share_session_id') + } } else { Logger.info(`[ShareController] Share playback session not found with id ${req.cookies.share_session_id}`) if (!uuid.validate(req.cookies.share_session_id) || uuid.version(req.cookies.share_session_id) !== 4) {