diff --git a/js&css/web-accessible/functions.js b/js&css/web-accessible/functions.js index dd293eee8..b04588e3d 100644 --- a/js&css/web-accessible/functions.js +++ b/js&css/web-accessible/functions.js @@ -491,6 +491,7 @@ ImprovedTube.initPlayer = function () { if (ImprovedTube.storage.disable_auto_dubbing === true) { ImprovedTube.observeAutoDubbedMenu(); } if (ImprovedTube.storage.preferred_dubbing_language) { ImprovedTube.preferredDubbingLanguage(); } if (ImprovedTube.storage.player_default_dubbed_language && ImprovedTube.storage.player_default_dubbed_language !== 'disabled') { ImprovedTube.selectDubbedLanguage(); } + ImprovedTube.playerDoubleTapSeek(); } }; diff --git a/js&css/web-accessible/www.youtube.com/player.js b/js&css/web-accessible/www.youtube.com/player.js index 0f8f47423..a49165e48 100644 --- a/js&css/web-accessible/www.youtube.com/player.js +++ b/js&css/web-accessible/www.youtube.com/player.js @@ -3071,3 +3071,41 @@ ImprovedTube.playerAutoContinueWatching = function () { }); } }; + +/*------------------------------------------------------------------------------ +DOUBLE TAP SEEK DISTANCE +------------------------------------------------------------------------------*/ +ImprovedTube.playerDoubleTapSeek = function() { + if (this.storage.player_double_tap_seek_distance === false) return; + + const player = this.elements.player; + const video = this.elements.video; + if (!player) return; + + if (player._doubleTapBound) return; + player._doubleTapBound = true; + + var self = this; + + function handler(e) { + e.preventDefault(); + e.stopPropagation(); + + var rect = player.getBoundingClientRect(); + var x = e.clientX - rect.left; + var isForward = x > rect.width / 2; + var distance = parseInt(self.storage.player_double_tap_seek_distance) || 10; + + if (isForward) { + player.seekBy(distance); + } else { + player.seekBy(-distance); + } + } + + // Use capture phase to intercept before native handler + player.addEventListener('dblclick', handler, true); + if (video) { + video.addEventListener('dblclick', handler, true); + } +}; diff --git a/menu/skeleton-parts/player.js b/menu/skeleton-parts/player.js index b3880cef1..bbd87b6ef 100644 --- a/menu/skeleton-parts/player.js +++ b/menu/skeleton-parts/player.js @@ -1785,6 +1785,15 @@ extension.skeleton.main.layers.section.player.on.click = { component: 'switch', text: 'player_rewind_and_forward_buttons' }, + player_double_tap_seek_distance: { + component: 'slider', + text: 'player_double_tap_seek_distance', + min: 1, + max: 60, + step: 1, + value: 10, + textarea: true + }, player_increase_decrease_speed_buttons: { component: 'switch', text: 'playerIncreaseDecreaseSpeedButtons',