您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Reduce Browser's Energy Impact for playing YouTube Video
当前为
- // ==UserScript==
- // @name YouTube CPU Tamer by AnimationFrame
- // @name:en YouTube CPU Tamer by AnimationFrame
- // @name:jp YouTube CPU Tamer by AnimationFrame
- // @name:zh-tw YouTube CPU Tamer by AnimationFrame
- // @name:zh-cn YouTube CPU Tamer by AnimationFrame
- // @namespace http://tampermonkey.net/
- // @version 2021.08.29
- // @license MIT License
- // @description Reduce Browser's Energy Impact for playing YouTube Video
- // @description:en Reduce Browser's Energy Impact for playing YouTube Video
- // @description:jp YouTubeビデオのエネルギーインパクトを減らす
- // @description:zh-tw 減少YouTube影片所致的能源消耗
- // @description:zh-cn 减少YouTube影片所致的能源消耗
- // @author CY Fung
- // @include https://www.youtube.com/*
- // @include https://www.youtube.com/embed/*
- // @include https://www.youtube-nocookie.com/embed/*
- // @include https://www.youtube.com/live_chat*
- // @include https://www.youtube.com/live_chat_replay*
- // @icon https://www.google.com/s2/favicons?domain=youtube.com
- // @run-at document-start
- // @grant none
- // ==/UserScript==
- (function $$() {
- 'use strict';
- const window = new Function('return window;')();
- let hkey_script = 'nzsxclvflluv';
- if (window[hkey_script]) return;
- window[hkey_script] = true;
- //if (!document.documentElement) return window.requestAnimationFrame($$);
- let $$requestAnimationFrame = window.requestAnimationFrame.bind(window);
- let $$setTimeout = window.setTimeout.bind(window);
- let mi = 0;
- let sb = {};
- const sFunc = (prop) => {
- return (func, ms, ...args) => {
- mi++;
- sb[mi] = {
- handler: args.length > 0 ? func.bind(null, ...args) : func,
- isNative: (func + "").indexOf('[native code]') > 0,
- [prop]: ms,
- nextAt: Date.now() + (ms > 0 ? ms : 0)
- };
- return mi;
- }
- }
- const rm = (jd) => {
- let o = sb[jd];
- if (typeof o != 'object') return;
- for (let k in o) o[k] = null;
- o = null;
- sb[jd] = null;
- delete sb[jd];
- }
- window.setTimeout = sFunc('timeout');
- window.setInterval = sFunc('interval');
- window.clearInterval = window.clearTimeout = rm;
- const $busy = Symbol('$busy');
- // high energy for non-native API
- let pf = (handler =>
- new Promise(resolve => {
- if (!($busy in handler)) {
- handler[$busy] = true;
- handler();
- delete handler[$busy];
- }
- resolve();
- })
- );
- // low energy for native API
- let qf = (handler =>
- new Promise(resolve => {
- handler();
- resolve();
- })
- );
- let dt = 0;
- let jf;
- (jf = $$requestAnimationFrame.bind(window, () => {
- let now = Date.now();
- if (now < dt) return jf();
- // ======= MarcoTask [requestAnimationFrame] =======
- let promises = [];
- for (let mi in sb) {
- const o = sb[mi];
- let {
- handler,
- timeout,
- interval,
- nextAt,
- isNative
- } = o;
- if (now < nextAt) continue;
- isNative ? promises.push(qf(handler)) : promises.push(pf(handler));
- if (interval > 0) {
- o.nextAt += interval;
- } else {
- rm(mi);
- }
- }
- // ======= MarcoTask [requestAnimationFrame] =======
- if (promises.length > 0) {
- if (document.hidden) dt = Date.now() + 160; // lower task execution rate for background playing
- let ret1 = Promise.all(promises);
- let ret2 = new Promise(resolve => $$setTimeout(resolve, 16));
- let race = Promise.race([ret1, ret2]);
- race.then(jf);
- } else {
- jf();
- }
- }))();
- // Your code here...
- })();