Brings back keyboard navigation for YouTube Shorts
// ==UserScript== // @name YouTube Shorts Keyboard Nav // @namespace http://tampermonkey.net/ // @version 2025-01-14 // @description Brings back keyboard navigation for YouTube Shorts // @author x0a // @match https://www.youtube.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com // @grant none // @license mit // ==/UserScript== (function() { 'use strict'; const log = console.log.bind(globalThis, 'YSKN:') const getVideo = () => { const selector = '.html5-video-player.ytp-hide-controls.ytp-exp-bottom-control-flexbox.ytp-modern-caption.ytp-exp-ppp-update.ytp-hide-info-bar' + ':not(.ytp-autonav-endscreen-cancelled-state):not(.unstarted-mode) video'; return document.querySelector(selector); } const inTextField = () => { const el = document.activeElement; if(!el) return false; if(el.nodeName === 'INPUT' || el.contentEditable === 'true') return true; return false; } const startMonitoring = () => { const onKeyUp = e => { if(location.pathname.slice(0, 8) !== '/shorts/') return; if(inTextField()) return; const video = getVideo(); if(!video) throw 'Video not found'; switch(event.key){ case 'ArrowLeft': log('Going back 5 seconds'); video.currentTime -= 5; break; case 'ArrowRight': log('Going forward 5 seconds'); video.currentTime += 5; break; case 'j': log('Going forward 10 seconds'); video.currentTime -= 10; break; case'l': log('Going forward 10 seconds'); video.currentTime += 10; break; default: for(let i = 0; i < 10; i++){ if(event.key === i + ''){ const target = video.duration * (i / 10); log('Seeking to ' + i * 10 + '%, which is ' + target); video.currentTime = target; break; } } } } window.addEventListener('keyup', onKeyUp); return () => window.removeEventListener('keyup', onKeyUp); } const stopMonitoring = startMonitoring(); })();