您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Youtube skip video in seconds by using two fingers
// ==UserScript== // @name YouTube touch skip with two fingers // @namespace http://tampermonkey.net/ // @version 0.1 // @description Youtube skip video in seconds by using two fingers // @author Brunkage // @match https://www.youtube.com/* // @grant none // ==/UserScript== (function() { 'use strict'; if (window===window.top) { waitForSelector("ytd-player", (container) => { var started = false; var startPos = null; var displayEle = null; var stepsPrPx = 20; var moved = 0; container.addEventListener("touchstart", (evt) => { var fingerAmount = evt.touches.length; if (!started && fingerAmount === 2) { started = true; startPos = getTouchMin(evt.touches); moved = movedInSecs(evt.touches); preventAndStop(evt); addDisplay(container); updateDisplay(getTouchAvg(evt.touches), moved); } }); document.body.addEventListener("touchmove", (evt) => { if (started) { preventAndStop(evt); moved = movedInSecs(evt.touches); updateDisplay(getTouchAvg(evt.touches), moved); } }); document.body.addEventListener("touchend", (evt) => { var fingerAmount = evt.touches.length; if (started && fingerAmount === 0) { getYTPlayer((player) => { player.seekBy(moved); }); removeDisplay(); started = false; startPos = null; preventAndStop(evt); } }); function movedInSecs(touches) { return Math.floor(getMoved(getTouchMin(touches)).x / stepsPrPx); } function getMoved(endPos) { return { x: endPos.x - startPos.x, y: endPos.y - startPos.y } } function getTouchMin(touches) { var min = { x: Infinity, y: Infinity } for (let touch of touches) { if (min.x > touch.pageX) { min.x = Math.floor(touch.pageX); } if (min.y > touch.pageY) { min.y = Math.floor(touch.pageY); } } return min; } function getTouchAvg(touches) { var avg = { x: 0, y: 0 } for (let touch of touches) { avg.x += touch.pageX; avg.y += touch.pageY; } avg.x = avg.x / touches.length; avg.y = avg.y / touches.length; return avg; } function preventAndStop(evt) { if (evt.preventDefault) { evt.preventDefault(); } if (evt.stopPropagation) { evt.stopPropagation(); } } function removeDisplay() { document.body.removeChild(displayEle); } function updateDisplay(coords, seekTo) { displayEle.style.top = coords.y + "px"; displayEle.style.left = coords.x + "px"; displayEle.getElementsByTagName("skip-display-seek-to")[0].innerText = seekTo + "s"; } function addDisplay() { displayEle = document.createElement("skip-display"); displayEle.style.transform = "translate(-120%, -120%)"; displayEle.style.display = "block"; displayEle.style.pointerEvents = "none"; displayEle.style.position = "fixed" displayEle.style.width = "100px"; displayEle.style.height = "100px"; var bg = document.createElement("skip-display-bg"); bg.style.width = "100%"; bg.style.position = "absolute"; bg.style.left = "0"; bg.style.height = "100%"; bg.style.display = "block"; bg.style.background = "black"; bg.style.borderRadius = "50%"; bg.style.filter = "blur(42px)"; var seekTo = document.createElement("skip-display-seek-to"); seekTo.style.transform = "translateY(-50%)"; seekTo.style.textAlign = "center"; seekTo.style.display = "block"; seekTo.style.position = "absolute"; seekTo.style.width = "100%"; seekTo.style.top = "50%"; seekTo.style.fontSize = "42px"; seekTo.style.color = "white" displayEle.appendChild(bg); displayEle.appendChild(seekTo); document.body.appendChild(displayEle); } }); } function waitForSelector(selector, onPresent) { var result = document.querySelector(selector); if (result) { onPresent(result); } else { setTimeout(() => { waitForSelector(selector, onPresent); }, 80); } } function getYTPlayer(onDone) { document.querySelector("ytd-player").getPlayerPromise().then(function(player) { onDone(player) }); } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址