From 9a76b4cf118fc51cbd00e4828382893cc6fee277 Mon Sep 17 00:00:00 2001 From: Por Nulus <93920034+pornulus@users.noreply.github.com> Date: Fri, 19 Nov 2021 02:59:02 +0100 Subject: [PATCH] Add forward seeking buttons to jwplayer (#1973) * Add forward seeking buttons to jwplayer Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com> --- .../components/Changelog/versions/v0120.md | 3 + .../components/ScenePlayer/ScenePlayer.tsx | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/ui/v2.5/src/components/Changelog/versions/v0120.md b/ui/v2.5/src/components/Changelog/versions/v0120.md index 39f0f314d..e94cf2997 100644 --- a/ui/v2.5/src/components/Changelog/versions/v0120.md +++ b/ui/v2.5/src/components/Changelog/versions/v0120.md @@ -1,3 +1,6 @@ +### ✨ New Features +* Add forward jump 10 second button to video player. ([#1973](https://github.com/stashapp/stash/pull/1973)) + ### 🎨 Improvements * Added plugin hook for Tag merge operation. ([#2010](https://github.com/stashapp/stash/pull/2010)) diff --git a/ui/v2.5/src/components/ScenePlayer/ScenePlayer.tsx b/ui/v2.5/src/components/ScenePlayer/ScenePlayer.tsx index f04411be5..bef7c429b 100644 --- a/ui/v2.5/src/components/ScenePlayer/ScenePlayer.tsx +++ b/ui/v2.5/src/components/ScenePlayer/ScenePlayer.tsx @@ -7,6 +7,24 @@ import { ConfigurationContext } from "src/hooks/Config"; import { ScenePlayerScrubber } from "./ScenePlayerScrubber"; import { Interactive } from "../../utils/interactive"; +/* +fast-forward svg derived from https://github.com/jwplayer/jwplayer/blob/master/src/assets/SVG/rewind-10.svg +Flipped horizontally, then flipped '10' numerals horizontally. + +Creative Common License: https://github.com/jwplayer/jwplayer/blob/master/LICENSE +*/ +const ffSVG = ` + + + + +`; + interface IScenePlayerProps { className?: string; scene: GQL.SceneDataFragment; @@ -98,8 +116,58 @@ export class ScenePlayerImpl extends React.Component< } } + private addForwardButton() { + // add forward button: https://github.com/jwplayer/jwplayer/issues/3894 + const playerContainer = document.querySelector( + `#${JWUtils.playerID}` + ) as HTMLElement; + + // display icon + const rewindContainer = playerContainer.querySelector( + ".jw-display-icon-rewind" + ) as HTMLElement; + const forwardContainer = rewindContainer.cloneNode(true) as HTMLElement; + const forwardDisplayButton = forwardContainer.querySelector( + ".jw-icon-rewind" + ) as HTMLElement; + forwardDisplayButton.innerHTML = ffSVG; + forwardDisplayButton.ariaLabel = "Forward 10 Seconds"; + const nextContainer = playerContainer.querySelector( + ".jw-display-icon-next" + ) as HTMLElement; + (nextContainer.parentNode as HTMLElement).insertBefore( + forwardContainer, + nextContainer + ); + + // control bar icon + const buttonContainer = playerContainer.querySelector( + ".jw-button-container" + ) as HTMLElement; + const rewindControlBarButton = buttonContainer.querySelector( + ".jw-icon-rewind" + ) as HTMLElement; + const forwardControlBarButton = rewindControlBarButton.cloneNode( + true + ) as HTMLElement; + forwardControlBarButton.innerHTML = ffSVG; + forwardControlBarButton.ariaLabel = "Forward 10 Seconds"; + (rewindControlBarButton.parentNode as HTMLElement).insertBefore( + forwardControlBarButton, + rewindControlBarButton.nextElementSibling + ); + + // add onclick handlers + [forwardDisplayButton, forwardControlBarButton].forEach((button) => { + button.onclick = () => { + this.player.seek(this.player.getPosition() + 10); + }; + }); + } + private onReady() { this.player = JWUtils.getPlayer(); + this.addForwardButton(); this.player.on("error", (err: any) => { if (err && err.code === 224003) {