From bf0c829790542a6c328cd705f6ae60024321e09c Mon Sep 17 00:00:00 2001 From: Vignesh B Date: Sat, 15 May 2021 00:50:39 -0400 Subject: [PATCH 1/3] Add next/previous chapter buttons to video player --- src/controllers/playback/video/index.html | 8 ++++++++ src/controllers/playback/video/index.js | 6 ++++++ src/strings/en-us.json | 2 ++ 3 files changed, 16 insertions(+) diff --git a/src/controllers/playback/video/index.html b/src/controllers/playback/video/index.html index c702154b21..55b6271cc7 100644 --- a/src/controllers/playback/video/index.html +++ b/src/controllers/playback/video/index.html @@ -35,6 +35,10 @@ + + @@ -47,6 +51,10 @@ + + diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 2d72403b38..011ba09ac0 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1513,9 +1513,15 @@ import { appRouter } from '../../../components/appRouter'; view.querySelector('.btnPreviousTrack').addEventListener('click', function () { playbackManager.previousTrack(currentPlayer); }); + view.querySelector('.btnPreviousChapter').addEventListener('click', function () { + playbackManager.previousChapter(currentPlayer); + }); view.querySelector('.btnPause').addEventListener('click', function () { playbackManager.playPause(currentPlayer); }); + view.querySelector('.btnNextChapter').addEventListener('click', function () { + playbackManager.nextChapter(currentPlayer); + }); view.querySelector('.btnNextTrack').addEventListener('click', function () { playbackManager.nextTrack(currentPlayer); }); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 3646d0585b..fd5ea3086f 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1110,6 +1110,7 @@ "NewEpisodesOnly": "New episodes only", "News": "News", "Next": "Next", + "NextChapter": "Next chapter", "NextTrack": "Skip to next", "NextUp": "Next Up", "No": "No", @@ -1277,6 +1278,7 @@ "Premieres": "Premieres", "Preview": "Preview", "Previous": "Previous", + "PreviousChapter": "Previous chapter", "PreviousTrack": "Skip to previous", "Primary": "Primary", "Producer": "Producer", From 233d168f71876bc632d7b777837c1780c67cee7b Mon Sep 17 00:00:00 2001 From: Vignesh B Date: Mon, 6 Sep 2021 15:17:15 -0400 Subject: [PATCH 2/3] Show chapter buttons only if file has chapters --- src/controllers/playback/video/index.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 011ba09ac0..9fbb2c84ac 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -181,6 +181,14 @@ import { appRouter } from '../../../components/appRouter'; } else { view.querySelector('.btnAudio').classList.add('hide'); } + + if (playbackManager.currentItem(player).Chapters.length > 1) { + view.querySelector('.btnPreviousChapter').classList.remove('hide'); + view.querySelector('.btnNextChapter').classList.remove('hide'); + } else { + view.querySelector('.btnPreviousChapter').classList.add('hide'); + view.querySelector('.btnNextChapter').classList.add('hide'); + } } function setTitle(item, parentName) { @@ -545,7 +553,7 @@ import { appRouter } from '../../../components/appRouter'; const player = this; currentRuntimeTicks = playbackManager.duration(player); const currentTime = playbackManager.currentTime(player) * 10000; - updateTimeDisplay(currentTime, currentRuntimeTicks, playbackManager.playbackStartTime(player), playbackManager.getPlaybackRate(player), playbackManager.getBufferedRanges(player)); + updateTimeDisplay(currentTime, currentRuntimeTicks, playbackManager.playbackStartTime(player), playbackManager.getBufferedRanges(player)); const item = currentItem; refreshProgramInfoIfNeeded(player, item); showComingUpNextIfNeeded(player, item, currentTime, currentRuntimeTicks); @@ -640,7 +648,7 @@ import { appRouter } from '../../../components/appRouter'; btnRewind.disabled = !playState.CanSeek; const nowPlayingItem = state.NowPlayingItem || {}; playbackStartTimeTicks = playState.PlaybackStartTimeTicks; - updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playState.PlaybackStartTimeTicks, playState.PlaybackRate, playState.BufferedRanges || []); + updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playState.PlaybackStartTimeTicks, playState.BufferedRanges || []); updateNowPlayingInfo(player, state); if (state.MediaSource && state.MediaSource.SupportsTranscoding && supportedCommands.indexOf('SetMaxStreamingBitrate') !== -1) { @@ -682,7 +690,7 @@ import { appRouter } from '../../../components/appRouter'; return (currentTimeMs - programStartDateMs) / programRuntimeMs * 100; } - function updateTimeDisplay(positionTicks, runtimeTicks, playbackStartTimeTicks, playbackRate, bufferedRanges) { + function updateTimeDisplay(positionTicks, runtimeTicks, playbackStartTimeTicks, bufferedRanges) { if (enableProgressByTimeOfDay) { if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) { if (programStartDateMs && programEndDateMs) { @@ -717,8 +725,8 @@ import { appRouter } from '../../../components/appRouter'; nowPlayingPositionSlider.value = 0; } - if (runtimeTicks && positionTicks != null && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && currentItem.Type !== 'Recording' && playbackRate !== null) { - endsAtText.innerHTML = '    ' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, playbackRate, true); + if (runtimeTicks && positionTicks != null && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && currentItem.Type !== 'Recording') { + endsAtText.innerHTML = '    ' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, true); } else { endsAtText.innerHTML = ''; } @@ -903,7 +911,8 @@ import { appRouter } from '../../../components/appRouter'; actionsheet.show({ items: menuItems, title: globalize.translate('Audio'), - positionTo: positionTo + positionTo: positionTo, + enableHistory: false }).then(function (id) { const index = parseInt(id); @@ -949,7 +958,8 @@ import { appRouter } from '../../../components/appRouter'; actionsheet.show({ title: globalize.translate('Subtitles'), items: menuItems, - positionTo: positionTo + positionTo: positionTo, + enableHistory: false }).then(function (id) { const index = parseInt(id); From 479c0715820eb311affe5dc682d0d5fcbc382526 Mon Sep 17 00:00:00 2001 From: Vignesh Balasubramaniam Date: Mon, 6 Sep 2021 15:52:11 -0400 Subject: [PATCH 3/3] Apply suggestions from code review Fix oopsies Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/controllers/playback/video/index.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 9fbb2c84ac..ba97ebd56b 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -182,7 +182,7 @@ import { appRouter } from '../../../components/appRouter'; view.querySelector('.btnAudio').classList.add('hide'); } - if (playbackManager.currentItem(player).Chapters.length > 1) { + if (currentItem.Chapters.length > 1) { view.querySelector('.btnPreviousChapter').classList.remove('hide'); view.querySelector('.btnNextChapter').classList.remove('hide'); } else { @@ -553,7 +553,7 @@ import { appRouter } from '../../../components/appRouter'; const player = this; currentRuntimeTicks = playbackManager.duration(player); const currentTime = playbackManager.currentTime(player) * 10000; - updateTimeDisplay(currentTime, currentRuntimeTicks, playbackManager.playbackStartTime(player), playbackManager.getBufferedRanges(player)); + updateTimeDisplay(currentTime, currentRuntimeTicks, playbackManager.playbackStartTime(player), playbackManager.getPlaybackRate(player), playbackManager.getBufferedRanges(player)); const item = currentItem; refreshProgramInfoIfNeeded(player, item); showComingUpNextIfNeeded(player, item, currentTime, currentRuntimeTicks); @@ -648,7 +648,7 @@ import { appRouter } from '../../../components/appRouter'; btnRewind.disabled = !playState.CanSeek; const nowPlayingItem = state.NowPlayingItem || {}; playbackStartTimeTicks = playState.PlaybackStartTimeTicks; - updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playState.PlaybackStartTimeTicks, playState.BufferedRanges || []); + updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playState.PlaybackStartTimeTicks, playState.PlaybackRate, playState.BufferedRanges || []); updateNowPlayingInfo(player, state); if (state.MediaSource && state.MediaSource.SupportsTranscoding && supportedCommands.indexOf('SetMaxStreamingBitrate') !== -1) { @@ -690,7 +690,7 @@ import { appRouter } from '../../../components/appRouter'; return (currentTimeMs - programStartDateMs) / programRuntimeMs * 100; } - function updateTimeDisplay(positionTicks, runtimeTicks, playbackStartTimeTicks, bufferedRanges) { + function updateTimeDisplay(positionTicks, runtimeTicks, playbackStartTimeTicks, playbackRate, bufferedRanges) { if (enableProgressByTimeOfDay) { if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) { if (programStartDateMs && programEndDateMs) { @@ -725,8 +725,8 @@ import { appRouter } from '../../../components/appRouter'; nowPlayingPositionSlider.value = 0; } - if (runtimeTicks && positionTicks != null && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && currentItem.Type !== 'Recording') { - endsAtText.innerHTML = '    ' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, true); + if (runtimeTicks && positionTicks != null && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && currentItem.Type !== 'Recording' && playbackRate !== null) { + endsAtText.innerHTML = '    ' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, playbackRate, true); } else { endsAtText.innerHTML = ''; } @@ -911,8 +911,7 @@ import { appRouter } from '../../../components/appRouter'; actionsheet.show({ items: menuItems, title: globalize.translate('Audio'), - positionTo: positionTo, - enableHistory: false + positionTo: positionTo }).then(function (id) { const index = parseInt(id); @@ -958,8 +957,7 @@ import { appRouter } from '../../../components/appRouter'; actionsheet.show({ title: globalize.translate('Subtitles'), items: menuItems, - positionTo: positionTo, - enableHistory: false + positionTo: positionTo }).then(function (id) { const index = parseInt(id);