Greasy Fork is available in English.

计时器掌控者|视频广告跳过|视频广告加速器

控制网页计时器速度|加速跳过页面计时广告|视频快进(慢放)|跳过广告|支持几乎所有网页.

ของเมื่อวันที่ 04-12-2019 ดู เวอร์ชันล่าสุด


ติดตั้งสคริปต์นี้?
  1. // ==UserScript==// @name 计时器掌控者|视频广告跳过|视频广告加速器// @name:en TimerHooker// @name:zh-CN 计时器掌控者|视频广告跳过|视频广告加速器// @namespace https://gitee.com/HGJing/everthing-hook/// @version 1.0.07// @description 控制网页计时器速度|加速跳过页面计时广告|视频快进(慢放)|跳过广告|支持几乎所有网页.// @description:en it can hook the timer speed to change.// @description:zh-CN 控制网页计时器速度|加速跳过页面计时广告|跳过广告|支持几乎所有网页.// @include *// @require https://gfork.dahi.icu/scripts/372672-everything-hook/code/Everything-Hook.js?version=659315// @author Cangshi// @match http://*/*// @run-at document-start// @grant none// ==/UserScript==/*** ---------------------------* Time: 2017/11/20 19:28.* Author: Cangshi* View: http://palerock.cn* ---------------------------*/~function (global) {var workerURLs = [];var helper = function (eHookContext, timerContext, util) {return {applyUI: function () {var style = '._th-container ._th-item{margin-bottom:3px;position:relative;width:30px;height:30px;cursor:pointer;opacity:.3;background-color:aquamarine;border-radius:100%;text-align:center;line-height:30px;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s;right:30px}._th-container ._th-item._item-x2{margin-left:18px;width:40px;height:40px;line-height:40px}._th-container ._th-item._item-x-2{margin-left:17px;width:38px;height:38px;line-height:38px}._th-container ._th-item._item-x4{width:36px;height:36px;margin-left:16px;line-height:36px}._th-container ._th-item._item-x-4{width:32px;height:32px;line-height:32px;margin-left:14px}._th-container ._th-item._item-reset{width:30px;line-height:30px;height:30px;margin-left:10px}._th-click-hover{position:relative;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s;height:50px;width:50px;cursor:pointer;opacity:.3;border-radius:100%;background-color:aquamarine;text-align:center;line-height:50px;right:0}._th-container:hover{left:-10px}._th-container{font-size:12px;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s;left:-40px;top:20%;position:fixed;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:100000}._th-container ._th-item:hover{opacity:.8;background-color:#5fb492;color:aliceblue}._th-container:hover ._th-click-hover{opacity:.8}._th-container:hover ._th-item{opacity:.6;right:0}._th-container ._th-click-hover:hover{opacity:.8;background-color:#5fb492;color:aliceblue}._th_cover-all-show-times{position:fixed;top:0;right:0;width:100%;height:100%;z-index:99999;opacity:1;font-weight:900;font-size:30px;color:#4f4f4f;background-color:rgba(0,0,0,0.1)}._th_cover-all-show-times._th_hidden{z-index:-1;opacity:0;-webkit-transition:1s all;-o-transition:1s all;transition:1s all}._th_cover-all-show-times ._th_times{width:80px;height:80px;border-radius:80px;background-color:rgba(127,255,212,0.51);text-align:center;line-height:80px;position:absolute;top:50%;right:50%;margin-top:-40px;margin-right:-40px}';// 在页面左边添加一个半圆便于修改var html = '<div class="_th-container">\n' +' <div class="_th-click-hover" onclick="changTime()">\n' +' x' + 1 / timerContext._percentage + '\n' +' </div>\n' +' <div class="_th-item _item-x2" onclick="changTime(2,0,true)">&gt;</div>\n' +' <div class="_th-item _item-x-2" onclick="changTime(-2,0,true)">&lt;</div>\n' +' <div class="_th-item _item-x4" onclick="changTime(0,4)">&gt;&gt;</div>\n' +' <div class="_th-item _item-x-4" onclick="changTime(0,-4)">&lt;&lt;</div>\n' +' <div class="_th-item _item-reset" onclick="changTime(0,0,false,true)">O</div>\n' +'</div>\n' +'<div class="_th_cover-all-show-times _th_hidden">\n' +' <div class="_th_times">x' + 1 / timerContext._percentage + '</div>\n' +'</div>' +'';var stylenode = document.createElement('style');stylenode.setAttribute("type", "text/css");if (stylenode.styleSheet) {// IEstylenode.styleSheet.cssText = style;} else {// w3cvar cssText = document.createTextNode(style);stylenode.appendChild(cssText);}var node = document.createElement('div');node.innerHTML = html;window.addEventListener('load', function () {document.head.appendChild(stylenode);document.body.appendChild(node);});},applyGlobalAction: function () {// 界面半圆按钮点击的方法global.changTime = function (anum, cnum, isa, isr) {if (isr) {global.timer.change(1);return;}if (!global.timer) {return;}var r###lt;if (!anum && !cnum) {var t = prompt("输入欲改变计时器变化倍率(当前:" + 1 / timerContext._percentage + ")");if (t == null) {return;}if (isNaN(parseFloat(t))) {alert("请输入正确的数字");changTime();return;}if (parseFloat(t) <= 0) {alert("倍率不能小于等于0");changTime();return;}r###lt = 1 / parseFloat(t);} else {if (isa && anum) {if (1 / timerContext._percentage <= 1 && anum < 0) {return;}r###lt = 1 / (1 / timerContext._percentage + anum);} else {if (cnum < 0) {cnum = 1 / -cnum}r###lt = 1 / ((1 / timerContext._percentage) * cnum);}}global.timer.change(r###lt);};},applyHooking: function () {// 劫持循环计时器eHookContext.hookReplace(window, 'setInterval', function (setInterval) {return function () {// 储存原始时间间隔arguments[2] = arguments[1];// 获取变速时间间隔arguments[1] *= timerContext._percentage;var r###ltId = setInterval.apply(window, arguments);// 保存每次使用计时器得到的id以及参数等timerContext._intervalIds[r###ltId] = {args: arguments,nowId: r###ltId};return r###ltId;};});// 劫持循环计时器的清除方法eHookContext.hookBefore(window, 'clearInterval', function (method, args) {var id = args[0];if (timerContext._intervalIds[id]) {args[0] = timerContext._intervalIds[id].nowId;}// 清除该记录iddelete timerContext._intervalIds[id];});// 劫持单次计时器setTimeouteHookContext.hookBefore(window, 'setTimeout', function (method, args) {args[1] *= timerContext._percentage;});var newFunc = this.getHookedDateConstructor();eHookContext.hookClass(window, 'Date', newFunc, '_innerDate', ['now']);Date.now = function () {return new Date().getTime();};eHookContext.hookedToString(timerContext._Date.now, Date.now);var objToString = Object.prototype.toString;Object.prototype.toString = function () {if (this instanceof timerContext._mDate) {return '[object Date]';} else {return objToString.call(this);}};eHookContext.hookedToString(timerContext._setInterval, setInterval);eHookContext.hookedToString(timerContext._setTimeout, setTimeout);eHookContext.hookedToString(timerContext._clearInterval, clearInterval);timerContext._mDate = window.Date;},getHookedDateConstructor: function () {return function () {if (arguments.length === 1) {Object.defineProperty(this, '_innerDate', {configurable: false,enumerable: false,value: new timerContext._Date(arguments[0]),writable: false});return;} else if (arguments.length > 1) {Object.defineProperty(this, '_innerDate', {configurable: false,enumerable: false,value: new timerContext._Date(arguments[0] || null,arguments[1] || null,arguments[2] || null,arguments[3] || null,arguments[4] || null,arguments[5] || null,arguments[6] || null),writable: false});return;}var now = timerContext._Date.now();var passTime = now - timerContext.__lastDatetime;var hookPassTime = passTime * (1 / timerContext._percentage);// console.log(__this.__lastDatetime + hookPassTime, now,__this.__lastDatetime + hookPassTime - now);Object.defineProperty(this, '_innerDate', {configurable: false,enumerable: false,value: new timerContext._Date(timerContext.__lastMDatetime + hookPassTime),writable: false});};},registerShortcutKeys: function () {// 快捷键注册addEventListener('keydown', function (e) {switch (e.keyCode) {// [=]case 190:case 187: {if (e.ctrlKey) {// console.log('+2');changTime(2, 0, true);} else if (e.altKey) {// console.log('x4');changTime(0, 4);}break;}// [-]case 188:case 189: {if (e.ctrlKey) {// console.log('-2');changTime(-2, 0, true);} else if (e.altKey) {// console.log('x-4');changTime(0, -4);}break;}// [0]case 48: {if (e.ctrlKey || e.altKey) {// console.log('reset');changTime(0, 0, false, true);}break;}default:// console.log(e);}});},/*** 当计时器速率被改变时调用的回调方法* @param percentage* @private*/percentageChangeHandler: function (percentage) {// 改变所有的循环计时util.ergodicObject(timerContext, timerContext._intervalIds, function (idObj, id) {idObj.args[1] = Math.floor(idObj.args[2] * percentage);console.log(idObj.args[1]);// 结束原来的计时器this._clearInterval.call(window, idObj.nowId);// 新开一个计时器idObj.nowId = this._setInterval.apply(window, idObj.args);});}}};var generate = function () {return function (util) {// disable workerworkerURLs.forEach(function (url) {if (util.urlMatching(location.href, 'http.*://.*' + url + '.*')) {window['Worker'] = undefined;console.log('Worker disabled');}});var eHookContext = this;var timerHooker = {// 用于储存计时器的id和参数_intervalIds: {},// 计时器速率__percentage: 1.0,// 劫持前的原始的方法_setInterval: window['setInterval'],_clearInterval: window['clearInterval'],_setTimeout: window['setTimeout'],_Date: window['Date'],__lastDatetime: new Date().getTime(),__lastMDatetime: new Date().getTime(),videoSpeedInterval: 1000,/*** 初始化方法*/init: function () {var timerContext = this;var h = helper(eHookContext, timerContext, util);h.applyHooking();// 设定百分比属性被修改的回调Object.defineProperty(timerContext, '_percentage', {get: function () {return timerContext.__percentage;},set: function (percentage) {if (percentage === timerContext.__percentage) {return percentage;}h.percentageChangeHandler(percentage);timerContext.__percentage = percentage;return percentage;}});h.applyUI();h.applyGlobalAction();h.registerShortcutKeys();},/*** 调用该方法改变计时器速率* @param percentage*/change: function (percentage) {var _this = this;this.__lastMDatetime = this._mDate.now();// console.log(this._mDate.toString());// console.log(new this._mDate());this.__lastDatetime = this._Date.now();// debugger;//---------------------------------//this._percentage = percentage;var oldNode = document.getElementsByClassName('_th-click-hover');var oldNode1 = document.getElementsByClassName('_th_times');(oldNode[0] || {}).innerHTML = 'x' + 1 / this._percentage;(oldNode1[0] || {}).innerHTML = 'x' + 1 / this._percentage;var a = document.getElementsByClassName('_th_cover-all-show-times')[0] || {};// console.log(a.className);a.className = '_th_cover-all-show-times';this._setTimeout.bind(window)(function () {a.className = '_th_cover-all-show-times _th_hidden';}, 100);this.changeVideoSpeed();this._clearInterval.bind(window)(this.videoSpeedIntervalId);this.videoSpeedIntervalId = this._setInterval.bind(window)(function () {_this.changeVideoSpeed();var rate = 1 / _this._percentage;if (rate === 1) {_this._clearInterval.bind(window)(_this.videoSpeedIntervalId);}}, this.videoSpeedInterval);},changeVideoSpeed: function () {var rate = 1 / this._percentage;rate > 16 && (rate = 16);rate < 0.065 && (rate = 0.065);// console.log(rate);var videos = document.querySelectorAll('video') || [];if (videos.length) {for (var i = 0; i < videos.length; i++) {videos[i].playbackRate = rate;}}}};// 默认初始化timerHooker.init();return timerHooker;}};if (global.eHook) {global.eHook.plugins({name: 'timer',/*** 插件装载* @param util*/mount: generate()});}}(window);