From 45f8e31f1ab296b00db81ef8eede9aec08a497f6 Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Wed, 22 Apr 2026 17:42:56 +0300 Subject: [PATCH 1/3] feat: player add media key support --- src/routes/Player/Player.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 662717b70..a762ebdf3 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -643,6 +643,26 @@ const Player = ({ urlParams, queryParams }) => { navigator.mediaSession.setActionHandler('nexttrack', nexVideoCallback); }, [player.nextVideo, onPlayRequested, onPauseRequested, onNextVideoRequested]); + React.useEffect(() => { + const onMediaKey = (action) => { + switch (action) { + case 'play-pause': + video.state.paused ? onPlayRequested() : onPauseRequested(); + break; + case 'next-track': + onNextVideoRequested(); + break; + case 'previous-track': + if (video.state.time !== null && video.state.time > 5000) { + onSeekRequested(0); + } + break; + } + }; + shell.on('media-key', onMediaKey); + return () => shell.off('media-key', onMediaKey); + }, [video.state.paused, video.state.time, onPlayRequested, onPauseRequested, onNextVideoRequested, onSeekRequested]); + onShortcut('seekForward', (combo) => { if (video.state.time !== null) { const seekDuration = combo === 1 ? settings.seekShortTimeDuration : settings.seekTimeDuration; From 17d823565a31bbdb84239be700a7e883625a3220 Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Wed, 22 Apr 2026 17:55:26 +0300 Subject: [PATCH 2/3] fix: correctly start next video from 0 --- src/routes/Player/Player.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index a762ebdf3..497520b81 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -650,6 +650,7 @@ const Player = ({ urlParams, queryParams }) => { video.state.paused ? onPlayRequested() : onPauseRequested(); break; case 'next-track': + video.setTime(0); onNextVideoRequested(); break; case 'previous-track': From f579873e1bc6e94622f0ec96d58fdfdc63edf51b Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Thu, 23 Apr 2026 16:17:38 +0200 Subject: [PATCH 3/3] fix: don't restart stream on next-track media key when no next video MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 'next-track' media-key handler called video.setTime(0) before checking whether a next video existed. onNextVideoRequested() no-ops when player.nextVideo is null, but the unconditional setTime(0) had already rewound the current stream — causing movies (which have no next video) to restart from the beginning when the Windows next-track media key was pressed. Guard both calls with the same player.nextVideo check that the navigator.mediaSession 'nexttrack' handler already uses. --- src/routes/Player/Player.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 497520b81..d1d981f65 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -650,8 +650,10 @@ const Player = ({ urlParams, queryParams }) => { video.state.paused ? onPlayRequested() : onPauseRequested(); break; case 'next-track': - video.setTime(0); - onNextVideoRequested(); + if (player.nextVideo !== null) { + video.setTime(0); + onNextVideoRequested(); + } break; case 'previous-track': if (video.state.time !== null && video.state.time > 5000) { @@ -662,7 +664,7 @@ const Player = ({ urlParams, queryParams }) => { }; shell.on('media-key', onMediaKey); return () => shell.off('media-key', onMediaKey); - }, [video.state.paused, video.state.time, onPlayRequested, onPauseRequested, onNextVideoRequested, onSeekRequested]); + }, [video.state.paused, video.state.time, player.nextVideo, onPlayRequested, onPauseRequested, onNextVideoRequested, onSeekRequested]); onShortcut('seekForward', (combo) => { if (video.state.time !== null) {