From 108e00ac45178edee9aab497c4129d48324d0078 Mon Sep 17 00:00:00 2001 From: Sky-High Date: Thu, 19 Oct 2023 13:05:56 +0200 Subject: [PATCH 1/9] Fix playback control issues with chromecast --- src/components/nowPlayingBar/nowPlayingBar.js | 19 ++- src/components/remotecontrol/remotecontrol.js | 14 +- src/components/shortcuts.js | 19 +-- src/controllers/itemDetails/index.js | 18 ++- src/plugins/chromecastPlayer/plugin.js | 121 ++++++++++++------ 5 files changed, 125 insertions(+), 66 deletions(-) diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index fec43db3e8..1cba3d0fbe 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -170,17 +170,20 @@ function bindEvents(elem) { elem.querySelector('.previousTrackButton').addEventListener('click', function (e) { if (currentPlayer) { - if (lastPlayerState.NowPlayingItem.MediaType === 'Audio') { + if ( playbackManager.isPlayingAudio(currentPlayer) ) { // Cancel this event if doubleclick is fired. The actual previousTrack will be processed by the 'dblclick' event if (e.detail > 1 ) { return; } + // Return to start of track, unless we are already (almost) at the beginning. In the latter case, continue and move // to the previous track, unless we are at the first track so no previous track exists. - if (currentPlayer._currentTime >= 5 || playbackManager.getCurrentPlaylistIndex(currentPlayer) <= 1) { + // currentTime is in msec. + + if (playbackManager.currentTime(currentPlayer) >= 5 || playbackManager.getCurrentPlaylistIndex(currentPlayer) <= 1) { playbackManager.seekPercent(0, currentPlayer); // This is done automatically by playbackManager, however, setting this here gives instant visual feedback. - // TODO: Check why seekPercentage doesn't reflect the changes inmmediately, so we can remove this workaround. + // TODO: Check why seekPercent doesn't reflect the changes inmmediately, so we can remove this workaround. positionSlider.value = 0; return; } @@ -574,7 +577,10 @@ function updateNowPlayingInfo(state) { itemContextMenu.show(Object.assign({ item: item, user: user - }, options)); + }, options)) + .catch(function (err) { + console.debug('[nowPlayingBar:updateNowPlayingInfo] click event reject', err); + }); }); }); } @@ -642,7 +648,8 @@ function hideNowPlayingBar() { } function onPlaybackStopped(e, state) { - console.debug('nowplaying event: ' + e.type); + console.debug('[nowPlayingBar:onPlaybackStopped] event: ' + e.type); + const player = this; if (player.isLocalPlayer) { @@ -669,7 +676,7 @@ function onStateChanged(event, state) { return; } - console.debug('nowplaying event: ' + event.type); + console.debug('[nowPlayingBar:onStateChanged] event: ' + event.type); const player = this; if (!state.NowPlayingItem || layoutManager.tv || state.IsFullscreen === false) { diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index a786f6fdd9..3714ef5247 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -220,7 +220,10 @@ function updateNowPlayingInfo(context, state, serverId) { itemContextMenu.show(Object.assign({ item: fullItem, user: user - }, options)); + }, options)) + .catch(function (err) { + console.debug('[remotecontrol:updateNowPlayingInfo] click event reject', err); + }); }); }); }); @@ -770,17 +773,20 @@ export default function () { context.querySelector('.btnPreviousTrack').addEventListener('click', function (e) { if (currentPlayer) { - if (lastPlayerState.NowPlayingItem.MediaType === 'Audio') { + if ( playbackManager.isPlayingAudio(currentPlayer) ) { // Cancel this event if doubleclick is fired. The actual previousTrack will be processed by the 'dblclick' event if (e.detail > 1 ) { return; } + // Return to start of track, unless we are already (almost) at the beginning. In the latter case, continue and move // to the previous track, unless we are at the first track so no previous track exists. - if (currentPlayer._currentTime >= 5 || playbackManager.getCurrentPlaylistIndex(currentPlayer) <= 1) { + // currentTime is in msec. + + if (playbackManager.currentTime(currentPlayer) >= 5 || playbackManager.getCurrentPlaylistIndex(currentPlayer) <= 1) { playbackManager.seekPercent(0, currentPlayer); // This is done automatically by playbackManager, however, setting this here gives instant visual feedback. - // TODO: Check why seekPercentage doesn't reflect the changes inmmediately, so we can remove this workaround. + // TODO: Check why seekPercent doesn't reflect the changes inmmediately, so we can remove this workaround. positionSlider.value = 0; return; } diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 58a7bffb05..942a49dc0f 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -121,14 +121,17 @@ function showContextMenu(card, options) { playlistId: playlistId, collectionId: collectionId, user: user - - }, options || {})).then(result => { - if (result.command === 'playallfromhere' || result.command === 'queueallfromhere') { - executeAction(card, options.positionTo, result.command); - } else if (result.updated || result.deleted) { - notifyRefreshNeeded(card, options.itemsContainer); - } - }); + }, options || {})) + .then(result => { + if (result.command === 'playallfromhere' || result.command === 'queueallfromhere') { + executeAction(card, options.positionTo, result.command); + } else if (result.updated || result.deleted) { + notifyRefreshNeeded(card, options.itemsContainer); + } + }) + .catch(err => { + console.debug('[shortcuts.showContextMenu] itemContextMenu.show reject', err); + }); }); }); }); diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 123b3c3092..f6c50e4009 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1966,13 +1966,17 @@ export default function (view, params) { selectedItem = item; apiClient.getCurrentUser().then(function (user) { - itemContextMenu.show(getContextMenuOptions(selectedItem, user, button)).then(function (result) { - if (result.deleted) { - appRouter.goHome(); - } else if (result.updated) { - reload(self, view, params); - } - }); + itemContextMenu.show(getContextMenuOptions(selectedItem, user, button)) + .then(function (result) { + if (result.deleted) { + appRouter.goHome(); + } else if (result.updated) { + reload(self, view, params); + } + }) + .catch(function(err) { + console.debug('[index:onMoreCommandsClick] reject', err); + }); }); }); } diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index 59950b60d2..9113cd1164 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -11,17 +11,20 @@ import { getItems } from '../../utils/jellyfin-apiclient/getItems.ts'; // Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js -let currentResolve; -let currentReject; - const PlayerName = 'Google Cast'; +/* + * Some async CastSDK function are completed with callbacks. + * sendConnectionResult turns this into completion as a promise. + */ +let _currentResolve = null; +let _currentReject = null; function sendConnectionResult(isOk) { - const resolve = currentResolve; - const reject = currentReject; + const resolve = _currentResolve; + const reject = _currentReject; - currentResolve = null; - currentReject = null; + _currentResolve = null; + _currentReject = null; if (isOk) { if (resolve) { @@ -128,14 +131,14 @@ class CastPlayer { */ onInitSuccess() { this.isInitialized = true; - console.debug('chromecast init success'); + console.debug('[chromecastPlayer] init success'); } /** * Generic error callback function */ onError() { - console.debug('chromecast error'); + console.debug('[chromecastPlayer] error'); } /** @@ -156,6 +159,7 @@ class CastPlayer { } } + // messageListener - receive callback messages from the Cast receiver messageListener(namespace, message) { if (typeof (message) === 'string') { message = JSON.parse(message); @@ -182,10 +186,10 @@ class CastPlayer { */ receiverListener(e) { if (e === 'available') { - console.debug('chromecast receiver found'); + console.debug('[chromecastPlayer] receiver found'); this.hasReceivers = true; } else { - console.debug('chromecast receiver list empty'); + console.debug('[chromecastPlayer] receiver list empty'); this.hasReceivers = false; } } @@ -195,7 +199,7 @@ class CastPlayer { */ sessionUpdateListener(isAlive) { if (isAlive) { - console.debug('sessionUpdateListener: already alive'); + console.debug('[chromecastPlayer] sessionUpdateListener: already alive'); } else { this.session = null; this.deviceState = DEVICE_STATE.IDLE; @@ -203,7 +207,7 @@ class CastPlayer { document.removeEventListener('volumeupbutton', onVolumeUpKeyDown, false); document.removeEventListener('volumedownbutton', onVolumeDownKeyDown, false); - console.debug('sessionUpdateListener: setting currentMediaSession to null'); + console.debug('[chromecastPlayer] sessionUpdateListener: setting currentMediaSession to null'); this.currentMediaSession = null; sendConnectionResult(false); @@ -216,7 +220,7 @@ class CastPlayer { * session request in opt_sessionRequest. */ launchApp() { - console.debug('chromecast launching app...'); + console.debug('[chromecastPlayer] launching app...'); chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this), this.onLaunchError.bind(this)); } @@ -225,7 +229,7 @@ class CastPlayer { * @param {Object} e A chrome.cast.Session object */ onRequestSessionSuccess(e) { - console.debug('chromecast session success: ' + e.sessionId); + console.debug('[chromecastPlayer] session success: ' + e.sessionId); this.onSessionConnected(e); } @@ -259,7 +263,7 @@ class CastPlayer { * Callback function for launch error */ onLaunchError() { - console.debug('chromecast launch error'); + console.debug('[chromecastPlayer] launch error'); this.deviceState = DEVICE_STATE.ERROR; sendConnectionResult(false); } @@ -289,11 +293,12 @@ class CastPlayer { /** * Loads media into a running receiver application - * @param {Number} mediaIndex An index number to indicate current media content + * @param {Number} mediaIndex - An index number to indicate current media content + * @returns Promise */ loadMedia(options, command) { if (!this.session) { - console.debug('no session'); + console.debug('[chromecastPlayer] no session'); return Promise.reject(new Error('no session')); } @@ -385,7 +390,7 @@ class CastPlayer { * @param {Object} mediaSession A new media object. */ onMediaDiscovered(how, mediaSession) { - console.debug('chromecast new media session ID:' + mediaSession.mediaSessionId + ' (' + how + ')'); + console.debug('[chromecastPlayer] new media session ID:' + mediaSession.mediaSessionId + ' (' + how + ')'); this.currentMediaSession = mediaSession; if (how === 'loadMedia') { @@ -404,7 +409,7 @@ class CastPlayer { * @param {!Boolean} e true/false */ onMediaStatusUpdate(e) { - console.debug('chromecast updating media: ' + e); + console.debug('[chromecastPlayer] updating media: ' + e); if (e === false) { this.castPlayerState = PLAYER_STATE.IDLE; } @@ -498,12 +503,17 @@ function getItemsForPlayback(apiClient, query) { } } +/* + * relay castPlayer events to ChromecastPlayer events and include state info + */ function bindEventForRelay(instance, eventName) { Events.on(instance._castPlayer, eventName, function (e, data) { - console.debug('cc: ' + eventName); - const state = instance.getPlayerStateInternal(data); - - Events.trigger(instance, eventName, [state]); + console.debug('[chromecastPlayer] ' + eventName); + // skip events without data + if (data && data.ItemId !== '' ) { + const state = instance.getPlayerStateInternal(data); + Events.trigger(instance, eventName, [state]); + } }); } @@ -519,30 +529,39 @@ function initializeChromecast() { })); Events.on(instance._castPlayer, 'connect', function () { - if (currentResolve) { + if (_currentResolve) { sendConnectionResult(true); } else { playbackManager.setActivePlayer(PlayerName, instance.getCurrentTargetInfo()); } - console.debug('cc: connect'); + console.debug('[chromecastPlayer] connect'); // Reset this so that statechange will fire instance.lastPlayerData = null; }); Events.on(instance._castPlayer, 'playbackstart', function (e, data) { - console.debug('cc: playbackstart'); + console.debug('[chromecastPlayer] playbackstart'); instance._castPlayer.initializeCastPlayer(); const state = instance.getPlayerStateInternal(data); Events.trigger(instance, 'playbackstart', [state]); + + // be prepared that after this media item a next one may follow. See playbackManager + instance._playNextAfterEnded = true; }); Events.on(instance._castPlayer, 'playbackstop', function (e, data) { - console.debug('cc: playbackstop'); + console.debug('[chromecastPlayer] playbackstop'); + let state = instance.getPlayerStateInternal(data); + if (!instance._playNextAfterEnded) { + // mark that no next media items are to be processed. + state.nextItem = null; + state.NextMediaType = null; + } Events.trigger(instance, 'playbackstop', [state]); state = instance.lastPlayerData.PlayState || {}; @@ -550,14 +569,16 @@ function initializeChromecast() { const mute = state.IsMuted || false; // Reset this so the next query doesn't make it appear like content is playing. - instance.lastPlayerData = {}; - instance.lastPlayerData.PlayState = {}; - instance.lastPlayerData.PlayState.VolumeLevel = volume; - instance.lastPlayerData.PlayState.IsMuted = mute; + instance.lastPlayerData = { + PlayState: { + VolumeLevel: volume, + IsMuted: mute + } + }; }); Events.on(instance._castPlayer, 'playbackprogress', function (e, data) { - console.debug('cc: positionchange'); + console.debug('[chromecastPlayer] positionchange'); const state = instance.getPlayerStateInternal(data); Events.trigger(instance, 'timeupdate', [state]); @@ -571,9 +592,10 @@ function initializeChromecast() { bindEventForRelay(instance, 'shufflequeuemodechange'); Events.on(instance._castPlayer, 'playstatechange', function (e, data) { - console.debug('cc: playstatechange'); - const state = instance.getPlayerStateInternal(data); + console.debug('[chromecastPlayer] playstatechange'); + // Updates the player and nowPlayingBar state to the current 'pause' state. + const state = instance.getPlayerStateInternal(data); Events.trigger(instance, 'pause', [state]); }); } @@ -598,19 +620,21 @@ class ChromecastPlayer { }); } + /* + * Cast button handling: select and connect to chromecast receiver + */ tryPair() { const castPlayer = this._castPlayer; if (castPlayer.deviceState !== DEVICE_STATE.ACTIVE && castPlayer.isInitialized) { return new Promise(function (resolve, reject) { - currentResolve = resolve; - currentReject = reject; + _currentResolve = resolve; + _currentReject = reject; castPlayer.launchApp(); }); } else { - currentResolve = null; - currentReject = null; - + _currentResolve = null; + _currentReject = null; return Promise.reject(new Error('tryPair failed')); } } @@ -674,7 +698,7 @@ class ChromecastPlayer { normalizeImages(data); - console.debug(JSON.stringify(data)); + // console.debug(JSON.stringify(data)); if (triggerStateChange) { Events.trigger(this, 'statechange', [data]); @@ -824,6 +848,8 @@ class ChromecastPlayer { } stop() { + // suppress playing a next media item after this one. See playbackManager + this._playNextAfterEnded = false; return this._castPlayer.sendMessage({ options: {}, command: 'Stop' @@ -1039,6 +1065,10 @@ class ChromecastPlayer { this.playWithCommand(options, 'PlayNext'); } + /* + * play + * options.items[]: Id, IsFolder, MediaType, Name, ServerId, Type, ... + */ play(options) { if (options.items) { return this.playWithCommand(options, 'PlayNow'); @@ -1090,6 +1120,15 @@ class ChromecastPlayer { getPlayerState() { return this.getPlayerStateInternal() || {}; } + + getCurrentPlaylistIndex() { + // tbd: update to support playlists and not only album with tracks + return this.getPlayerStateInternal()?.NowPlayingItem?.IndexNumber; + } + + clearQueue(currentTime) { // eslint-disable-line no-unused-vars + // not supported yet + } } export default ChromecastPlayer; From b1161facc0d1f2bbfdd4b5916f865833a074e156 Mon Sep 17 00:00:00 2001 From: Sky High Date: Wed, 25 Oct 2023 23:04:50 +0200 Subject: [PATCH 2/9] Update src/components/nowPlayingBar/nowPlayingBar.js Co-authored-by: Bill Thornton --- src/components/nowPlayingBar/nowPlayingBar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index 1cba3d0fbe..2b42c038ce 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -170,7 +170,7 @@ function bindEvents(elem) { elem.querySelector('.previousTrackButton').addEventListener('click', function (e) { if (currentPlayer) { - if ( playbackManager.isPlayingAudio(currentPlayer) ) { + if (playbackManager.isPlayingAudio(currentPlayer)) { // Cancel this event if doubleclick is fired. The actual previousTrack will be processed by the 'dblclick' event if (e.detail > 1 ) { return; From 7a98119b938e75e4e4c78cd36fb28d8ed85662b6 Mon Sep 17 00:00:00 2001 From: Sky High Date: Wed, 25 Oct 2023 23:05:08 +0200 Subject: [PATCH 3/9] Update src/components/nowPlayingBar/nowPlayingBar.js Co-authored-by: Bill Thornton --- src/components/nowPlayingBar/nowPlayingBar.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index 2b42c038ce..d7e0e45e9c 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -578,9 +578,7 @@ function updateNowPlayingInfo(state) { item: item, user: user }, options)) - .catch(function (err) { - console.debug('[nowPlayingBar:updateNowPlayingInfo] click event reject', err); - }); + .catch(() => { /* no-op */ }); }); }); } From 4257a401d5b4cbf770fb4df93ec491b1f267c95a Mon Sep 17 00:00:00 2001 From: Sky High Date: Wed, 25 Oct 2023 23:05:30 +0200 Subject: [PATCH 4/9] Update src/components/remotecontrol/remotecontrol.js Co-authored-by: Bill Thornton --- src/components/remotecontrol/remotecontrol.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 3714ef5247..343a5f5172 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -773,7 +773,7 @@ export default function () { context.querySelector('.btnPreviousTrack').addEventListener('click', function (e) { if (currentPlayer) { - if ( playbackManager.isPlayingAudio(currentPlayer) ) { + if (playbackManager.isPlayingAudio(currentPlayer)) { // Cancel this event if doubleclick is fired. The actual previousTrack will be processed by the 'dblclick' event if (e.detail > 1 ) { return; From 86beb0e7e5d7e8441118c124595eae76bf1ed35c Mon Sep 17 00:00:00 2001 From: Sky High Date: Wed, 25 Oct 2023 23:30:39 +0200 Subject: [PATCH 5/9] Update src/plugins/chromecastPlayer/plugin.js Co-authored-by: Bill Thornton --- src/plugins/chromecastPlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index 9113cd1164..b985927881 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -510,7 +510,7 @@ function bindEventForRelay(instance, eventName) { Events.on(instance._castPlayer, eventName, function (e, data) { console.debug('[chromecastPlayer] ' + eventName); // skip events without data - if (data && data.ItemId !== '' ) { + if (data?.ItemId) { const state = instance.getPlayerStateInternal(data); Events.trigger(instance, eventName, [state]); } From ad252c6df14b8c7f412aaa0e46b6843e3cc1dc49 Mon Sep 17 00:00:00 2001 From: Sky-High Date: Thu, 19 Oct 2023 13:05:56 +0200 Subject: [PATCH 6/9] implement suggestions 2 --- src/components/nowPlayingBar/nowPlayingBar.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index d7e0e45e9c..bb823cb1e6 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -797,4 +797,3 @@ document.addEventListener('viewbeforeshow', function (e) { } } }); - From c887e960aa9d5342733bb30fc56e8485052f5053 Mon Sep 17 00:00:00 2001 From: Sky-High Date: Wed, 25 Oct 2023 23:32:49 +0200 Subject: [PATCH 7/9] implement suggestions --- src/components/remotecontrol/remotecontrol.js | 4 +--- src/components/shortcuts.js | 4 +--- src/controllers/itemDetails/index.js | 5 ++--- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 343a5f5172..578af1da76 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -221,9 +221,7 @@ function updateNowPlayingInfo(context, state, serverId) { item: fullItem, user: user }, options)) - .catch(function (err) { - console.debug('[remotecontrol:updateNowPlayingInfo] click event reject', err); - }); + .catch(() => { /* no-op */ }); }); }); }); diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 942a49dc0f..03418f3e21 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -129,9 +129,7 @@ function showContextMenu(card, options) { notifyRefreshNeeded(card, options.itemsContainer); } }) - .catch(err => { - console.debug('[shortcuts.showContextMenu] itemContextMenu.show reject', err); - }); + .catch(() => { /* no-op */ }); }); }); }); diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index f6c50e4009..03ac3e3e56 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1854,6 +1854,7 @@ export default function (view, params) { }).catch((error) => { console.error('failed to get item or current user: ', error); }); + } function splitVersions(instance, page, apiClient, pageParams) { @@ -1974,9 +1975,7 @@ export default function (view, params) { reload(self, view, params); } }) - .catch(function(err) { - console.debug('[index:onMoreCommandsClick] reject', err); - }); + .catch(() => { /* no-op */ }); }); }); } From 423b16f0a9767b14b2ed38ef20aa6b32b70f5d4c Mon Sep 17 00:00:00 2001 From: Sky-High Date: Thu, 19 Oct 2023 13:05:56 +0200 Subject: [PATCH 8/9] remove empty line --- src/controllers/itemDetails/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 03ac3e3e56..da0945ec9c 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1854,7 +1854,6 @@ export default function (view, params) { }).catch((error) => { console.error('failed to get item or current user: ', error); }); - } function splitVersions(instance, page, apiClient, pageParams) { From e51ab7a8e3835e3836e93ac92e7dfeba62dc4672 Mon Sep 17 00:00:00 2001 From: Sky-High Date: Thu, 26 Oct 2023 01:11:21 +0200 Subject: [PATCH 9/9] remove unused log statement --- src/plugins/chromecastPlayer/plugin.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index b985927881..664ebf53e6 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -698,8 +698,6 @@ class ChromecastPlayer { normalizeImages(data); - // console.debug(JSON.stringify(data)); - if (triggerStateChange) { Events.trigger(this, 'statechange', [data]); }