From e888ae1bf3f63079369958940832165c5bc69691 Mon Sep 17 00:00:00 2001 From: Kay Simons Date: Sat, 3 Jul 2021 17:13:37 +0200 Subject: [PATCH 01/14] fix: useragent detection for new web0s browser --- src/scripts/browser.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/scripts/browser.js b/src/scripts/browser.js index fc0a5d4435..e87e79842c 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -14,6 +14,23 @@ function isTv() { return true; } + if (userAgent.indexOf('netcast')) { + return true; + } + + if (userAgent.indexOf('web0s') !== -1) { + return true; + } + + return false; +} + +function isWeb0s() { + const userAgent = navigator.userAgent.toLowerCase(); + if (userAgent.indexOf('netcast') !== -1) { + return true; + } + if (userAgent.indexOf('web0s') !== -1) { return true; } @@ -234,7 +251,7 @@ if (userAgent.toLowerCase().indexOf('xbox') !== -1) { } browser.animate = typeof document !== 'undefined' && document.documentElement.animate != null; browser.tizen = userAgent.toLowerCase().indexOf('tizen') !== -1 || window.tizen != null; -browser.web0s = userAgent.toLowerCase().indexOf('Web0S'.toLowerCase()) !== -1; +browser.web0s = isWeb0s(); browser.edgeUwp = browser.edge && (userAgent.toLowerCase().indexOf('msapphost') !== -1 || userAgent.toLowerCase().indexOf('webview') !== -1); if (!browser.tizen) { From 6e52a53e3dd5e15ff68de40acc64c26e77f4758e Mon Sep 17 00:00:00 2001 From: Kay Simons Date: Sat, 3 Jul 2021 17:36:17 +0200 Subject: [PATCH 02/14] fix: netcast conditional --- src/scripts/browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/browser.js b/src/scripts/browser.js index e87e79842c..8bf1528bde 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -14,7 +14,7 @@ function isTv() { return true; } - if (userAgent.indexOf('netcast')) { + if (userAgent.indexOf('netcast') !== -1) { return true; } From d06979fbe105b80247d84fc4dc3f787c8fe7e4e7 Mon Sep 17 00:00:00 2001 From: Kay Simons Date: Sat, 3 Jul 2021 19:42:08 +0200 Subject: [PATCH 03/14] feat: automatically fullscreen player on televisions --- CONTRIBUTORS.md | 1 + src/plugins/htmlVideoPlayer/plugin.js | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 229a2acbd7..ceee8b8be3 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -45,6 +45,7 @@ - [Camc314](https://github.com/camc314) - [danieladov](https://github.com/danieladov) - [Stephane Senart](https://github.com/ssenart) + - [imchasingshadows](https://github.com/imchasingshadows) # Emby Contributors diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 7b3afb635a..c6e9eed542 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1369,12 +1369,17 @@ function tryRemoveElement(elem) { document.body.classList.add('hide-scroll'); } - // don't animate on smart tv's, too slow - if (options.fullscreen && browser.supportsCssAnimation() && !browser.slow) { - return zoomIn(dlg).then(function () { - return videoElement; - }); - } else { + if (options.fullscreen) { + if (browser.tv && Screenfull.isEnabled) { + Screenfull.request(); + } + // don't animate on smart tv's, too slow + if (!browser.slow && browser.supportsCssAnimation()) { + return zoomIn(dlg).then(function () { + return videoElement; + }); + } + return videoElement; } }); From 5196b5308ae3d0e5b46353f53962b5238f9599d4 Mon Sep 17 00:00:00 2001 From: Kay Simons Date: Sat, 3 Jul 2021 19:57:59 +0200 Subject: [PATCH 04/14] fix: stop videoplayback after exiting fullscreen on television --- src/controllers/playback/video/index.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index d7e8fd5bf2..c345d6df46 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -402,6 +402,14 @@ import { appRouter } from '../../../components/appRouter'; } } + function onFullscreenChange() { + if (!layoutManager.tv) { + updateFullscreenIcon(); + } else if (!playbackManager.isFullscreen(currentPlayer)) { + appRouter.back(); + } + } + function updateFullscreenIcon() { const button = view.querySelector('.btnFullscreen'); const icon = button.querySelector('.material-icons'); @@ -505,7 +513,7 @@ import { appRouter } from '../../../components/appRouter'; Events.on(player, 'pause', onPlayPauseStateChanged); Events.on(player, 'unpause', onPlayPauseStateChanged); Events.on(player, 'timeupdate', onTimeUpdate); - Events.on(player, 'fullscreenchange', updateFullscreenIcon); + Events.on(player, 'fullscreenchange', onFullscreenChange); Events.on(player, 'mediastreamschange', onMediaStreamsChanged); Events.on(player, 'beginFetch', onBeginFetch); Events.on(player, 'endFetch', onEndFetch); @@ -529,7 +537,7 @@ import { appRouter } from '../../../components/appRouter'; Events.off(player, 'pause', onPlayPauseStateChanged); Events.off(player, 'unpause', onPlayPauseStateChanged); Events.off(player, 'timeupdate', onTimeUpdate); - Events.off(player, 'fullscreenchange', updateFullscreenIcon); + Events.off(player, 'fullscreenchange', onFullscreenChange); Events.off(player, 'mediastreamschange', onMediaStreamsChanged); currentPlayer = null; } @@ -675,7 +683,7 @@ import { appRouter } from '../../../components/appRouter'; view.querySelector('.btnAirPlay').classList.remove('hide'); } - updateFullscreenIcon(); + onFullscreenChange(); } function getDisplayPercentByTimeOfDay(programStartDateMs, programRuntimeMs, currentTimeMs) { From 8b05cf62a69e6d054e3d92f096d9f27643bfa2a0 Mon Sep 17 00:00:00 2001 From: Kay Simons Date: Sat, 3 Jul 2021 20:11:12 +0200 Subject: [PATCH 05/14] refactor: fullscreen callbackfn name --- src/controllers/playback/video/index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index c345d6df46..baec66e800 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -402,7 +402,7 @@ import { appRouter } from '../../../components/appRouter'; } } - function onFullscreenChange() { + function onFullscreenChanged() { if (!layoutManager.tv) { updateFullscreenIcon(); } else if (!playbackManager.isFullscreen(currentPlayer)) { @@ -513,7 +513,7 @@ import { appRouter } from '../../../components/appRouter'; Events.on(player, 'pause', onPlayPauseStateChanged); Events.on(player, 'unpause', onPlayPauseStateChanged); Events.on(player, 'timeupdate', onTimeUpdate); - Events.on(player, 'fullscreenchange', onFullscreenChange); + Events.on(player, 'fullscreenchange', onFullscreenChanged); Events.on(player, 'mediastreamschange', onMediaStreamsChanged); Events.on(player, 'beginFetch', onBeginFetch); Events.on(player, 'endFetch', onEndFetch); @@ -537,7 +537,7 @@ import { appRouter } from '../../../components/appRouter'; Events.off(player, 'pause', onPlayPauseStateChanged); Events.off(player, 'unpause', onPlayPauseStateChanged); Events.off(player, 'timeupdate', onTimeUpdate); - Events.off(player, 'fullscreenchange', onFullscreenChange); + Events.off(player, 'fullscreenchange', onFullscreenChanged); Events.off(player, 'mediastreamschange', onMediaStreamsChanged); currentPlayer = null; } @@ -683,7 +683,7 @@ import { appRouter } from '../../../components/appRouter'; view.querySelector('.btnAirPlay').classList.remove('hide'); } - onFullscreenChange(); + onFullscreenChanged(); } function getDisplayPercentByTimeOfDay(programStartDateMs, programRuntimeMs, currentTimeMs) { From 104e72fc4f1e0cc8f1ae0c979e4afacee84b9c26 Mon Sep 17 00:00:00 2001 From: Kay Simons Date: Sat, 4 Sep 2021 13:10:43 +0200 Subject: [PATCH 06/14] fix: use isWeb0s in isTv method --- src/scripts/browser.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/scripts/browser.js b/src/scripts/browser.js index 8bf1528bde..dfe5382115 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -14,11 +14,7 @@ function isTv() { return true; } - if (userAgent.indexOf('netcast') !== -1) { - return true; - } - - if (userAgent.indexOf('web0s') !== -1) { + if (isWeb0s()) { return true; } From 469767aa50d0d3c5c8cecfd3571abede343b8d8b Mon Sep 17 00:00:00 2001 From: Kay Simons Date: Sat, 4 Sep 2021 13:12:48 +0200 Subject: [PATCH 07/14] fix: return videoelement immediately after going fullscreen on tv --- src/plugins/htmlVideoPlayer/plugin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index c6e9eed542..ed8a08c5ee 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1372,6 +1372,7 @@ function tryRemoveElement(elem) { if (options.fullscreen) { if (browser.tv && Screenfull.isEnabled) { Screenfull.request(); + return videoElement; } // don't animate on smart tv's, too slow if (!browser.slow && browser.supportsCssAnimation()) { From 67a2e0f16d479dab0201b8693fa58fff684eaba1 Mon Sep 17 00:00:00 2001 From: imchasingshadows Date: Sat, 11 Sep 2021 17:28:22 +0200 Subject: [PATCH 08/14] Update src/plugins/htmlVideoPlayer/plugin.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/plugins/htmlVideoPlayer/plugin.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 7638f3234a..6d935ae88d 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1378,8 +1378,9 @@ function tryRemoveElement(elem) { }); } - return videoElement; } + + return videoElement; }); } else { // we need to hide scrollbar when starting playback from page with animated background From b67a064d7592ba8e94ebae07360861763fdad6b2 Mon Sep 17 00:00:00 2001 From: imchasingshadows Date: Sat, 11 Sep 2021 17:31:08 +0200 Subject: [PATCH 09/14] Update src/controllers/playback/video/index.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/controllers/playback/video/index.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index ab85bc434c..c82ee4fb15 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -403,11 +403,12 @@ import { appRouter } from '../../../components/appRouter'; } function onFullscreenChanged() { - if (!layoutManager.tv) { - updateFullscreenIcon(); - } else if (!playbackManager.isFullscreen(currentPlayer)) { + if (!playbackManager.isFullscreen(currentPlayer)) { appRouter.back(); + return; } + + updateFullscreenIcon(); } function updateFullscreenIcon() { From 7f81f5b3f1e856ae0519d10ba677806f60df53eb Mon Sep 17 00:00:00 2001 From: imchasingshadows Date: Sat, 11 Sep 2021 21:03:23 +0200 Subject: [PATCH 10/14] Update src/plugins/htmlVideoPlayer/plugin.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/plugins/htmlVideoPlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 6d935ae88d..0f1e48a8bd 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1367,7 +1367,7 @@ function tryRemoveElement(elem) { } if (options.fullscreen) { - if (browser.tv && Screenfull.isEnabled) { + if (!window.NativeShell && browser.web0s && Screenfull.isEnabled) { Screenfull.request(); return videoElement; } From 59bb2f27a5512397fc000a77fa04c7773f7e5bd9 Mon Sep 17 00:00:00 2001 From: Kay Simons Date: Tue, 14 Sep 2021 20:27:02 +0200 Subject: [PATCH 11/14] fix: implement forced fullscreen hack for webos --- src/controllers/playback/video/index.js | 2 +- src/plugins/htmlVideoPlayer/plugin.js | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index c82ee4fb15..fa8603f308 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -403,7 +403,7 @@ import { appRouter } from '../../../components/appRouter'; } function onFullscreenChanged() { - if (!playbackManager.isFullscreen(currentPlayer)) { + if (currentPlayer.forcedFullscreen && !playbackManager.isFullscreen(currentPlayer)) { appRouter.back(); return; } diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 0f1e48a8bd..4724fcba0f 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1361,25 +1361,29 @@ function tryRemoveElement(elem) { this.#videoDialog = dlg; this.#mediaElement = videoElement; + delete this.forcedFullscreen; + if (options.fullscreen) { // At this point, we must hide the scrollbar placeholder, so it's not being displayed while the item is being loaded document.body.classList.add('hide-scroll'); - } - if (options.fullscreen) { + // Enter fullscreen in the webOS browser to hide the top bar if (!window.NativeShell && browser.web0s && Screenfull.isEnabled) { - Screenfull.request(); + Screenfull.request().then(() => { + this.forcedFullscreen = true; + }); return videoElement; } + // don't animate on smart tv's, too slow if (!browser.slow && browser.supportsCssAnimation()) { return zoomIn(dlg).then(function () { return videoElement; }); } - } + return videoElement; }); } else { From 2e66ce13e6c0bcb20de5c1568f857d7bc8677715 Mon Sep 17 00:00:00 2001 From: imchasingshadows Date: Thu, 16 Sep 2021 16:13:29 +0200 Subject: [PATCH 12/14] Apply suggestions from code review Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/plugins/htmlVideoPlayer/plugin.js | 1 - src/scripts/browser.js | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 4724fcba0f..9161ffb562 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1383,7 +1383,6 @@ function tryRemoveElement(elem) { } } - return videoElement; }); } else { diff --git a/src/scripts/browser.js b/src/scripts/browser.js index dfe5382115..672ef23fd4 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -23,6 +23,7 @@ function isTv() { function isWeb0s() { const userAgent = navigator.userAgent.toLowerCase(); + if (userAgent.indexOf('netcast') !== -1) { return true; } From 118f9e19209ca577a203ecded2acbed7036b4754 Mon Sep 17 00:00:00 2001 From: Kay Simons Date: Thu, 16 Sep 2021 17:59:37 +0200 Subject: [PATCH 13/14] fix: do not repeat fullscreen hack if already set --- src/plugins/htmlVideoPlayer/plugin.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 9161ffb562..d95cfccf69 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1389,6 +1389,13 @@ function tryRemoveElement(elem) { // we need to hide scrollbar when starting playback from page with animated background if (options.fullscreen) { document.body.classList.add('hide-scroll'); + + // Enter fullscreen in the webOS browser to hide the top bar + if (!this.forcedFullscreen && !window.NativeShell && browser.web0s && Screenfull.isEnabled) { + Screenfull.request().then(() => { + this.forcedFullscreen = true; + }); + } } return Promise.resolve(dlg.querySelector('video')); From 5a50783f06ab452874b1ddbf4a6d2e381213bf6c Mon Sep 17 00:00:00 2001 From: imchasingshadows Date: Thu, 16 Sep 2021 19:19:21 +0200 Subject: [PATCH 14/14] Apply suggestions from code review Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/plugins/htmlVideoPlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index d95cfccf69..611240be3e 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1386,8 +1386,8 @@ function tryRemoveElement(elem) { return videoElement; }); } else { - // we need to hide scrollbar when starting playback from page with animated background if (options.fullscreen) { + // we need to hide scrollbar when starting playback from page with animated background document.body.classList.add('hide-scroll'); // Enter fullscreen in the webOS browser to hide the top bar